Compare commits
8102 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
43df4a7500 | ||
|
|
4cdcaa8630 | ||
|
|
04f632296f | ||
|
|
7c8dbcfaac | ||
|
|
436ba3c96c | ||
|
|
5d12f52873 | ||
|
|
a8bf8ede01 | ||
|
|
8682183bc3 | ||
|
|
94c31d0da9 | ||
|
|
464a4cbeec | ||
|
|
9f0cbf418a | ||
|
|
b477f86c92 | ||
|
|
020371f145 | ||
|
|
ccafe3f3cf | ||
|
|
3830748de5 | ||
|
|
1a43f5145d | ||
|
|
7f143a83c1 | ||
|
|
6ccc254179 | ||
|
|
7db2450447 | ||
|
|
6c2a6a65e0 | ||
|
|
4247a757b3 | ||
|
|
57e34823d8 | ||
|
|
3c93decdf0 | ||
|
|
89e7a5018d | ||
|
|
7235b46e5e | ||
|
|
0852226a48 | ||
|
|
e20d215abf | ||
|
|
e4b9b67e24 | ||
|
|
685b78828d | ||
|
|
060908d5c4 | ||
|
|
0b0f4c61f1 | ||
|
|
228bf7eb09 | ||
|
|
5eaf2b8fc3 | ||
|
|
e097fef79e | ||
|
|
9a813cd3b1 | ||
|
|
1c60c8e014 | ||
|
|
eddda95900 | ||
|
|
72184dccfc | ||
|
|
fee75dc766 | ||
|
|
ba5c856f15 | ||
|
|
12308a0f55 | ||
|
|
a958abde2f | ||
|
|
583208db7e | ||
|
|
7b5ba15170 | ||
|
|
d5e0d49f86 | ||
|
|
73b22d82aa | ||
|
|
db51cc4e02 | ||
|
|
be8a52a914 | ||
|
|
ad597a8ff0 | ||
|
|
b1fe105904 | ||
|
|
451b142e3a | ||
|
|
2833625266 | ||
|
|
0464028872 | ||
|
|
98985c03b0 | ||
|
|
793fd8c479 | ||
|
|
6c602811df | ||
|
|
6d48a5684a | ||
|
|
bd115a4008 | ||
|
|
08272cdee2 | ||
|
|
b14a5141a6 | ||
|
|
aa0e4500c6 | ||
|
|
4e6b8edf72 | ||
|
|
ac0852b4e3 | ||
|
|
6fe43ed969 | ||
|
|
b34bc06624 | ||
|
|
08e41e60e5 | ||
|
|
10ec478a9c | ||
|
|
86f1074905 | ||
|
|
8e66b855a3 | ||
|
|
e3bc85d7bf | ||
|
|
6f242836e6 | ||
|
|
f2c926f3b6 | ||
|
|
aba18924ee | ||
|
|
aa6bef54dd | ||
|
|
528f5b9cb9 | ||
|
|
96ae0ec93a | ||
|
|
5a5229b499 | ||
|
|
bba22c9c8c | ||
|
|
694c437a2c | ||
|
|
587172efa3 | ||
|
|
2a926063b2 | ||
|
|
d6f239e54f | ||
|
|
b8989fafeb | ||
|
|
795789e79d | ||
|
|
cd8bc57c0d | ||
|
|
55b355618d | ||
|
|
ba25a5388e | ||
|
|
657ef48518 | ||
|
|
b1d68fe995 | ||
|
|
8a492c8f39 | ||
|
|
901a48c9a4 | ||
|
|
b0994bad31 | ||
|
|
f5c9071494 | ||
|
|
d1f85240a2 | ||
|
|
2148d4bb31 | ||
|
|
e79d06d595 | ||
|
|
c60cf944f5 | ||
|
|
4b8ee58638 | ||
|
|
9305730993 | ||
|
|
16bc97e9e5 | ||
|
|
482c18982e | ||
|
|
06ca08ce55 | ||
|
|
9fc00a817b | ||
|
|
f47696f5f8 | ||
|
|
190006e9dc | ||
|
|
30eaae10c1 | ||
|
|
b878111404 | ||
|
|
db21d7de0b | ||
|
|
8454083efa | ||
|
|
a0e5729117 | ||
|
|
534853cd32 | ||
|
|
fb0ead1788 | ||
|
|
32013ad4a6 | ||
|
|
7352d6a38d | ||
|
|
f649ec1fd8 | ||
|
|
56112a237c | ||
|
|
64da9399ca | ||
|
|
dd8e14e121 | ||
|
|
09e2202cd6 | ||
|
|
fe7e1ae8aa | ||
|
|
aa07e8a8fe | ||
|
|
83d598bdfd | ||
|
|
0ec31b4aa4 | ||
|
|
a943f4063c | ||
|
|
ce9f09c69a | ||
|
|
3ddc7a5353 | ||
|
|
e575392b94 | ||
|
|
c6f61a699c | ||
|
|
0307b49f43 | ||
|
|
413ab80295 | ||
|
|
daffefdb10 | ||
|
|
5fb21fbdb1 | ||
|
|
f5857c4689 | ||
|
|
2c388434dd | ||
|
|
c97469283c | ||
|
|
1f8d707082 | ||
|
|
9b1f44e758 | ||
|
|
804ccddf7e | ||
|
|
bb5918932b | ||
|
|
aa77bc323f | ||
|
|
901229699e | ||
|
|
637c96697f | ||
|
|
c92f0a1336 | ||
|
|
8463441afe | ||
|
|
9b6a2589e5 | ||
|
|
cc5fab28af | ||
|
|
a3f7127e72 | ||
|
|
b0a6a569df | ||
|
|
92523f8cf2 | ||
|
|
e33c08357a | ||
|
|
2dc5648e57 | ||
|
|
d0349880da | ||
|
|
f178163217 | ||
|
|
7aa1dceef6 | ||
|
|
a75d2fdd5a | ||
|
|
f76544be4c | ||
|
|
1e6c445320 | ||
|
|
e02c1adf79 | ||
|
|
889e4869f9 | ||
|
|
f77135f307 | ||
|
|
eeae9a04d3 | ||
|
|
8bb35e7bb6 | ||
|
|
3e78c9ab48 | ||
|
|
9ec86acb9c | ||
|
|
426bde3f75 | ||
|
|
30e22b753b | ||
|
|
f7141c9201 | ||
|
|
c2a2573aa5 | ||
|
|
9274bc15bc | ||
|
|
751fff07fb | ||
|
|
f7d1408a1a | ||
|
|
e4e14ef6b0 | ||
|
|
005e691339 | ||
|
|
61eff1cddf | ||
|
|
c26703b7e6 | ||
|
|
66ab2de578 | ||
|
|
db27bb76e2 | ||
|
|
7cfe929c36 | ||
|
|
6c06244e83 | ||
|
|
53448e4633 | ||
|
|
21adc78713 | ||
|
|
0340b01392 | ||
|
|
94aed92e9a | ||
|
|
6b9966e969 | ||
|
|
4bc5333995 | ||
|
|
ff58b8d255 | ||
|
|
e28d1e0f65 | ||
|
|
a491d8ae24 | ||
|
|
3cd5dd15f8 | ||
|
|
562ae44d38 | ||
|
|
92541dedc0 | ||
|
|
3f3f0af543 | ||
|
|
850d208b7b | ||
|
|
da563940b4 | ||
|
|
650a67dc38 | ||
|
|
c63f24e58e | ||
|
|
3be8b02cc2 | ||
|
|
bdfaea0c25 | ||
|
|
ed5c0d6546 | ||
|
|
86dc621086 | ||
|
|
fbea965c70 | ||
|
|
a2cd66ed6f | ||
|
|
68894e822a | ||
|
|
937f49f1e9 | ||
|
|
ee59e20c28 | ||
|
|
01b6e1cbf2 | ||
|
|
eefc0f5d80 | ||
|
|
1f94cea889 | ||
|
|
69749eb591 | ||
|
|
94592c1406 | ||
|
|
13ce142df1 | ||
|
|
89bf4c5fad | ||
|
|
f80ebf68b0 | ||
|
|
1155a29096 | ||
|
|
030e603940 | ||
|
|
9c1bf9ac5f | ||
|
|
5f8dac6822 | ||
|
|
2f07b8f482 | ||
|
|
6c40a27809 | ||
|
|
8736a3533b | ||
|
|
608d232373 | ||
|
|
1702e98fdf | ||
|
|
2ec94c0497 | ||
|
|
bf372e3e1f | ||
|
|
0d971963fd | ||
|
|
287cff40b9 | ||
|
|
0e0bc7976f | ||
|
|
8c638c50a3 | ||
|
|
5b2374b949 | ||
|
|
c1600bcf3d | ||
|
|
a82d864c91 | ||
|
|
dcac32a6c4 | ||
|
|
5286477f73 | ||
|
|
2f3845ef51 | ||
|
|
1191025bbf | ||
|
|
bfd261929e | ||
|
|
84de88841b | ||
|
|
224400074c | ||
|
|
863722545f | ||
|
|
d3d1d37782 | ||
|
|
1a2012a97e | ||
|
|
90f4e97751 | ||
|
|
d1bcd98f79 | ||
|
|
39542de69d | ||
|
|
1d00d55d53 | ||
|
|
a190db0873 | ||
|
|
e3142312bb | ||
|
|
e5d1ac0bd0 | ||
|
|
c0411fa412 | ||
|
|
781e690012 | ||
|
|
9a2d71341e | ||
|
|
6db6d3c50c | ||
|
|
0e2c597884 | ||
|
|
debdf9bb96 | ||
|
|
218d9383d7 | ||
|
|
af64bd5088 | ||
|
|
050f81c4fe | ||
|
|
6ebe772e2f | ||
|
|
c9ee6dd4ca | ||
|
|
38b183fac2 | ||
|
|
ab678787f4 | ||
|
|
23556585ca | ||
|
|
728e4e9a38 | ||
|
|
2d6f9f9a9c | ||
|
|
c2e2e5543e | ||
|
|
349d8eb248 | ||
|
|
94b96bde9b | ||
|
|
45ffc864c5 | ||
|
|
19d9ce260a | ||
|
|
0701333ec1 | ||
|
|
a8e70f0901 | ||
|
|
c7c32a3ce9 | ||
|
|
53170ca2f2 | ||
|
|
94694e0f33 | ||
|
|
a73176a1e9 | ||
|
|
e6a974a93e | ||
|
|
9894967fcb | ||
|
|
92da483ecd | ||
|
|
9cc960ac5e | ||
|
|
18dd082f1e | ||
|
|
81b734be10 | ||
|
|
c59be7ced3 | ||
|
|
c5c4d4a57e | ||
|
|
2d0b429b6a | ||
|
|
60620d9af5 | ||
|
|
15b2a4862e | ||
|
|
2915d2dd0f | ||
|
|
590687fdea | ||
|
|
993f8d6a5e | ||
|
|
68f824a186 | ||
|
|
b9cca49e14 | ||
|
|
931b571e3d | ||
|
|
b7b93bb67e | ||
|
|
35eca08d48 | ||
|
|
7137ca375a | ||
|
|
282859a62a | ||
|
|
fbeb5eefdc | ||
|
|
85bada0505 | ||
|
|
fe2f7a3e5a | ||
|
|
98eed1f5ab | ||
|
|
5d0a463f09 | ||
|
|
dd461400fb | ||
|
|
b1390ec27f | ||
|
|
dda5516eec | ||
|
|
adc5c5db88 | ||
|
|
0642ce4795 | ||
|
|
d11e1d5880 | ||
|
|
b143477774 | ||
|
|
d092a88a93 | ||
|
|
ab7597b089 | ||
|
|
84df470008 | ||
|
|
5ca0b7a28f | ||
|
|
21d621e7ad | ||
|
|
d036e20826 | ||
|
|
9151b84c25 | ||
|
|
5d7dd12f7a | ||
|
|
21783ff5f7 | ||
|
|
fd923d5d96 | ||
|
|
ebf607eef8 | ||
|
|
e092eadd8d | ||
|
|
185148f57c | ||
|
|
ede7434901 | ||
|
|
ba3b422ce5 | ||
|
|
1f3ce380ed | ||
|
|
dfc1f6342a | ||
|
|
94092f1f90 | ||
|
|
a84b83f20f | ||
|
|
614e410fe7 | ||
|
|
4a1e885c0a | ||
|
|
eee91aa4ea | ||
|
|
855750c784 | ||
|
|
4f2163e76c | ||
|
|
eef66dee04 | ||
|
|
7ad440ca1c | ||
|
|
13b3e9e7b3 | ||
|
|
8106929d60 | ||
|
|
795baed3f5 | ||
|
|
5487d40be9 | ||
|
|
5e512763d3 | ||
|
|
a65d02d3ae | ||
|
|
2156fc64f4 | ||
|
|
441440101d | ||
|
|
ec54754e22 | ||
|
|
0ebba73cb8 | ||
|
|
50c7337965 | ||
|
|
b5c569cd30 | ||
|
|
11396d4fba | ||
|
|
4c6ae4e9e8 | ||
|
|
9cb9154b08 | ||
|
|
234a6193bb | ||
|
|
2bf5f32224 | ||
|
|
82d0f68acf | ||
|
|
616c8383c0 | ||
|
|
5de46268af | ||
|
|
489e11072e | ||
|
|
5e2af15e94 | ||
|
|
3fbb54e0a4 | ||
|
|
fe6de14faf | ||
|
|
e85b9960f0 | ||
|
|
75c836fbd9 | ||
|
|
94b1025780 | ||
|
|
36ca9d01fb | ||
|
|
3bceed1b53 | ||
|
|
90de2c4bd6 | ||
|
|
9d63c8220b | ||
|
|
edd9d16c84 | ||
|
|
ec373eba5d | ||
|
|
0dfb27b7e5 | ||
|
|
735f62be0c | ||
|
|
a04e01d5f5 | ||
|
|
b03f05f28a | ||
|
|
0b7d7fe069 | ||
|
|
cf96135125 | ||
|
|
1ff97783ea | ||
|
|
2bc42c6445 | ||
|
|
49372a222f | ||
|
|
9127afbf3f | ||
|
|
f2caac595a | ||
|
|
616abdda26 | ||
|
|
14d3a7ae83 | ||
|
|
f37ab5482b | ||
|
|
ef38dbe5bf | ||
|
|
54a5491b86 | ||
|
|
aff070bcbb | ||
|
|
5af2632d4f | ||
|
|
cc64c715a2 | ||
|
|
9999914c74 | ||
|
|
bd32a11016 | ||
|
|
140aeea300 | ||
|
|
afd0fe666a | ||
|
|
4accc1f159 | ||
|
|
80839b5372 | ||
|
|
dafa3f985a | ||
|
|
f865e1393c | ||
|
|
c99416fbe0 | ||
|
|
3caef29b93 | ||
|
|
5f95c07305 | ||
|
|
1a9659ef45 | ||
|
|
aaa438e745 | ||
|
|
4531e4cc55 | ||
|
|
44a31357f4 | ||
|
|
29f78b18b1 | ||
|
|
147872fe97 | ||
|
|
38edb58054 | ||
|
|
1ba35e1fd4 | ||
|
|
98afae2520 | ||
|
|
ddc85c620f | ||
|
|
12bc625fe1 | ||
|
|
6b407356b9 | ||
|
|
a4e0b52468 | ||
|
|
98efb4f6d5 | ||
|
|
36edb4886c | ||
|
|
76290f786d | ||
|
|
c6299c26b5 | ||
|
|
fb5f9baf9c | ||
|
|
dee591d970 | ||
|
|
a5cc13b0c5 | ||
|
|
aaf588aeaa | ||
|
|
533a3def9f | ||
|
|
4ba3812baf | ||
|
|
4797357fa9 | ||
|
|
f6b3a88723 | ||
|
|
fcf487f4e0 | ||
|
|
82e8913c05 | ||
|
|
c46483a4ab | ||
|
|
0f19108ce3 | ||
|
|
4208fe29b5 | ||
|
|
1b593462d3 | ||
|
|
0cf9c941af | ||
|
|
c1b33533da | ||
|
|
66fcd25b7e | ||
|
|
01d3777574 | ||
|
|
87570cdd9b | ||
|
|
0ea6a2dd99 | ||
|
|
cacc1ffdad | ||
|
|
cfe34647e1 | ||
|
|
737267cedc | ||
|
|
84054203af | ||
|
|
0c1a899fbe | ||
|
|
52521d02ea | ||
|
|
2127a482da | ||
|
|
7df0d3b7fc | ||
|
|
fdd101c4c5 | ||
|
|
4218f56f6c | ||
|
|
dd18fe34a7 | ||
|
|
5b09504a71 | ||
|
|
0c1a001622 | ||
|
|
148c38fbb9 | ||
|
|
fbfefcc0a3 | ||
|
|
b4c517c501 | ||
|
|
b39bc85e60 | ||
|
|
603ce87ac2 | ||
|
|
4b16a8bf84 | ||
|
|
ca4c81dd84 | ||
|
|
e9881bbfc8 | ||
|
|
69f4178bff | ||
|
|
027e562f65 | ||
|
|
2d2120338b | ||
|
|
e5e623ffaa | ||
|
|
e47e3205b3 | ||
|
|
592d2ebd26 | ||
|
|
299c809272 | ||
|
|
d929d0c26f | ||
|
|
90201e9970 | ||
|
|
a31da51fd9 | ||
|
|
cf471e830f | ||
|
|
906972973e | ||
|
|
116edf5fce | ||
|
|
8581013911 | ||
|
|
22192adbc8 | ||
|
|
b8f3de693f | ||
|
|
68c023cdd8 | ||
|
|
b18b0bf328 | ||
|
|
2a2c5d50ff | ||
|
|
dfda0faac7 | ||
|
|
95acc4be07 | ||
|
|
330a4cf573 | ||
|
|
6ffbb151a0 | ||
|
|
271e49db5d | ||
|
|
8d2101ccb4 | ||
|
|
7aa8497546 | ||
|
|
7a8d5070f5 | ||
|
|
8707ae6fd4 | ||
|
|
8786b61636 | ||
|
|
1b5faf5cbf | ||
|
|
2da5b7cb65 | ||
|
|
b1e073bacd | ||
|
|
501e48daba | ||
|
|
643ecd1edd | ||
|
|
1e88e71b9a | ||
|
|
e16fd4a09b | ||
|
|
097e2b6c62 | ||
|
|
7db7568dcf | ||
|
|
409d3c7136 | ||
|
|
7f81375861 | ||
|
|
0de39a431b | ||
|
|
54c20f6aa1 | ||
|
|
1726278ccc | ||
|
|
8661a51aba | ||
|
|
42ec67168a | ||
|
|
91af2ebc2a | ||
|
|
f7fb8a33d7 | ||
|
|
0505cb8f7e | ||
|
|
2cfccc1c34 | ||
|
|
438366effc | ||
|
|
29d5ad667c | ||
|
|
235ddc0990 | ||
|
|
517f5b1999 | ||
|
|
a8ac8b2563 | ||
|
|
78a65cf281 | ||
|
|
96017f58a5 | ||
|
|
c8e6f50d55 | ||
|
|
9263d6d07d | ||
|
|
5271e81ebe | ||
|
|
a174159496 | ||
|
|
efb2051b30 | ||
|
|
a2b24cb5a2 | ||
|
|
a54f9ede2e | ||
|
|
05fb624031 | ||
|
|
2de98b652b | ||
|
|
361ad92da9 | ||
|
|
84ff71002e | ||
|
|
7f1b134137 | ||
|
|
504776a10f | ||
|
|
184b90bb88 | ||
|
|
cf85fcec79 | ||
|
|
b34fd905c8 | ||
|
|
821f77325c | ||
|
|
bd8cf7c53d | ||
|
|
88c19c21ee | ||
|
|
40ec819330 | ||
|
|
34dbd03be1 | ||
|
|
42d41647b5 | ||
|
|
c91db14cef | ||
|
|
10b925e7ac | ||
|
|
c9942846c9 | ||
|
|
6235cf066a | ||
|
|
86979c8f04 | ||
|
|
8a689e68bc | ||
|
|
b98263e86f | ||
|
|
f30265a9ee | ||
|
|
fcbcec6856 | ||
|
|
b778fb38a9 | ||
|
|
32290d5eb8 | ||
|
|
f87265a4d5 | ||
|
|
6448b31b11 | ||
|
|
998227cffc | ||
|
|
09f743dc1a | ||
|
|
035f986a91 | ||
|
|
b168a9d469 | ||
|
|
2b1d6ad396 | ||
|
|
641447bf9b | ||
|
|
06c2aef3c7 | ||
|
|
1caa0ef58d | ||
|
|
51951c9442 | ||
|
|
104b8b4c4c | ||
|
|
3b95523e07 | ||
|
|
3ca312bd4a | ||
|
|
d06ef76e58 | ||
|
|
57729683b6 | ||
|
|
9ff2606bb8 | ||
|
|
fd80683ade | ||
|
|
49efb6071c | ||
|
|
8df98932b1 | ||
|
|
95481dda86 | ||
|
|
1b4181d983 | ||
|
|
113141bf2a | ||
|
|
bcc1e51097 | ||
|
|
e8a7c6cee3 | ||
|
|
0c8ffa1ac3 | ||
|
|
4f678aa244 | ||
|
|
3a4a430f6c | ||
|
|
36db40b224 | ||
|
|
426b9672cf | ||
|
|
4d80419982 | ||
|
|
3983caa2c8 | ||
|
|
0b4e0b7bcb | ||
|
|
a9b8d5ecb6 | ||
|
|
60b2338091 | ||
|
|
d2594c6380 | ||
|
|
667daab056 | ||
|
|
2fc0a738ce | ||
|
|
86c531b37d | ||
|
|
a5b14a2ea7 | ||
|
|
bf582bd969 | ||
|
|
ad866f7a7d | ||
|
|
338a6f2a96 | ||
|
|
c3aa53cc97 | ||
|
|
24a86dce21 | ||
|
|
0209bc4ba7 | ||
|
|
dd57b81989 | ||
|
|
ffe6819966 | ||
|
|
8af75c78f8 | ||
|
|
696add259b | ||
|
|
f18695eb45 | ||
|
|
d6b0ecac1b | ||
|
|
61a119b607 | ||
|
|
ea5096ac90 | ||
|
|
428c2ec0e3 | ||
|
|
1a82981d07 | ||
|
|
0ff0aca2e2 | ||
|
|
7b02c0224c | ||
|
|
57d77cc8a0 | ||
|
|
9fe0585056 | ||
|
|
8c366f0774 | ||
|
|
d6529d8c60 | ||
|
|
edb44a536a | ||
|
|
eeaaea802a | ||
|
|
15c36baefd | ||
|
|
33deb84aa1 | ||
|
|
b211d31a64 | ||
|
|
5b192beaa5 | ||
|
|
ef38330d74 | ||
|
|
987b60ae73 | ||
|
|
7db0f7c4da | ||
|
|
a4eeaff63f | ||
|
|
7807ddae57 | ||
|
|
566af6827e | ||
|
|
bf046d895e | ||
|
|
af33a9f4b8 | ||
|
|
e9a4570891 | ||
|
|
99d5b61698 | ||
|
|
79e89eb23b | ||
|
|
d13a64455c | ||
|
|
816603fd9a | ||
|
|
bf5f12a51f | ||
|
|
866821765a | ||
|
|
c457d8e442 | ||
|
|
c58dffa685 | ||
|
|
ba41690063 | ||
|
|
86a37d0ed6 | ||
|
|
2fb5dbe62b | ||
|
|
d2835e2989 | ||
|
|
543e8a98a7 | ||
|
|
86b7890f67 | ||
|
|
7393e1cba1 | ||
|
|
ceee47fda8 | ||
|
|
9c6b52ccee | ||
|
|
79937c9495 | ||
|
|
a47ecf9cb1 | ||
|
|
8aa2c57413 | ||
|
|
524a7f4560 | ||
|
|
56bfff5a57 | ||
|
|
1d30df9b15 | ||
|
|
ef84e5c8fa | ||
|
|
6d2a30b860 | ||
|
|
9e0fa8e9ec | ||
|
|
5e8e038811 | ||
|
|
e61a804b80 | ||
|
|
a9d6ad4759 | ||
|
|
987124610a | ||
|
|
40a1ebee29 | ||
|
|
d4ce9c0df2 | ||
|
|
680fdb0338 | ||
|
|
727078f65d | ||
|
|
d7f770ce73 | ||
|
|
e1ddb63054 | ||
|
|
24b14c5aa5 | ||
|
|
2e116c9e28 | ||
|
|
37897d1550 | ||
|
|
b153591790 | ||
|
|
ee5653338d | ||
|
|
032f47c0b0 | ||
|
|
1f4e4dd9b3 | ||
|
|
d43218ed16 | ||
|
|
3d43e4e954 | ||
|
|
b0d587ded7 | ||
|
|
1245b4a49f | ||
|
|
d4ce6049c9 | ||
|
|
c236a85c13 | ||
|
|
9cf43eef67 | ||
|
|
ed6d0aa548 | ||
|
|
3d27fffc50 | ||
|
|
de0ee26432 | ||
|
|
45cccbce59 | ||
|
|
479de9c7cb | ||
|
|
60821232b9 | ||
|
|
9b4156a282 | ||
|
|
89b1e27d2e | ||
|
|
1dcaf8f76a | ||
|
|
18508d1919 | ||
|
|
9f77d568e2 | ||
|
|
0d0569b9af | ||
|
|
0f18e7baf9 | ||
|
|
d8b03d4927 | ||
|
|
72b6c09a73 | ||
|
|
c05bca6f2c | ||
|
|
73c95d1fb2 | ||
|
|
2c30e16371 | ||
|
|
72437ca9e2 | ||
|
|
9be14bbe82 | ||
|
|
d47f37f23a | ||
|
|
a22aed7acf | ||
|
|
38b58715ae | ||
|
|
d88e00c0a4 | ||
|
|
a72d1200fb | ||
|
|
9a29d02e7e | ||
|
|
6f3c0d0a60 | ||
|
|
466625f7ad | ||
|
|
b8259e604a | ||
|
|
86e2075c63 | ||
|
|
30900b2fe2 | ||
|
|
fd7ae7ea4c | ||
|
|
60d5bf0240 | ||
|
|
41cdc4e14b | ||
|
|
87dfca0477 | ||
|
|
e1ee8e7812 | ||
|
|
63406efcd8 | ||
|
|
d5c132fca0 | ||
|
|
5f082a2739 | ||
|
|
45139f94bb | ||
|
|
80cb680fca | ||
|
|
b9ff6383a4 | ||
|
|
ebc006ab52 | ||
|
|
86a02871fc | ||
|
|
e152e843d8 | ||
|
|
9ff1ff75cb | ||
|
|
abea4a24ba | ||
|
|
3d3a1232b1 | ||
|
|
09d4176210 | ||
|
|
30d41e45e2 | ||
|
|
bd9a5021da | ||
|
|
1624a5eb8d | ||
|
|
1bca29f9e2 | ||
|
|
efb8a9bd2c | ||
|
|
82954d1d6f | ||
|
|
5a02324c09 | ||
|
|
eb93bebbc1 | ||
|
|
2be905b2e2 | ||
|
|
076be809c2 | ||
|
|
88f1233d7b | ||
|
|
54d295c247 | ||
|
|
e81b089612 | ||
|
|
9f14e7a98d | ||
|
|
cb412b221c | ||
|
|
7d6a762845 | ||
|
|
1ca1269a59 | ||
|
|
6681b14b71 | ||
|
|
12f2418445 | ||
|
|
ae8a2ab652 | ||
|
|
d0fbf6db59 | ||
|
|
01d8eb6290 | ||
|
|
197968d65e | ||
|
|
2cb83a1f84 | ||
|
|
d7c94e30c5 | ||
|
|
510d2514a0 | ||
|
|
5217a74b7f | ||
|
|
cccf35d140 | ||
|
|
249316c8fc | ||
|
|
cd24449495 | ||
|
|
687834328c | ||
|
|
4d015aff30 | ||
|
|
ba8040d068 | ||
|
|
5fa94d2a85 | ||
|
|
7eee79c145 | ||
|
|
9626523420 | ||
|
|
0150131984 | ||
|
|
2ddd45e5e1 | ||
|
|
03c89c9cec | ||
|
|
640de5518b | ||
|
|
a92c694f1b | ||
|
|
a159299a4b | ||
|
|
d048545f1a | ||
|
|
aea6d354b7 | ||
|
|
d3793dfe5b | ||
|
|
234f8d287a | ||
|
|
8d49c2d028 | ||
|
|
e560f6bc63 | ||
|
|
fbfbc5682a | ||
|
|
d4141bf7f1 | ||
|
|
6c81fa1ec5 | ||
|
|
24874b8286 | ||
|
|
b63664988f | ||
|
|
eeb00ac45b | ||
|
|
37e25f93d6 | ||
|
|
d58d65ebf0 | ||
|
|
adf2d3aff2 | ||
|
|
32064a23c1 | ||
|
|
c60b50b1ae | ||
|
|
f3ffdaf21f | ||
|
|
3aade67046 | ||
|
|
dc111bbec2 | ||
|
|
acd61a0e8e | ||
|
|
58590b71d1 | ||
|
|
8dcb1f805d | ||
|
|
a8b9e5b9b9 | ||
|
|
04f928e2b0 | ||
|
|
c7a803c922 | ||
|
|
66a1e8b737 | ||
|
|
ab197b6d43 | ||
|
|
16b0e53a36 | ||
|
|
bc14a6038e | ||
|
|
626329a1cc | ||
|
|
8bf250c228 | ||
|
|
62127bbb12 | ||
|
|
786ac87b76 | ||
|
|
c76f4ac89b | ||
|
|
d495ec71a8 | ||
|
|
b763852f57 | ||
|
|
a8568d7246 | ||
|
|
6522d2f722 | ||
|
|
ac61fd1d78 | ||
|
|
c44d1566fa | ||
|
|
80dc7c2f74 | ||
|
|
43a43c1e2b | ||
|
|
7b94f0e36b | ||
|
|
504e8d564a | ||
|
|
ac395429c3 | ||
|
|
388768b3a6 | ||
|
|
5c4169e64e | ||
|
|
d40e9de2d2 | ||
|
|
e08598e7e2 | ||
|
|
d301a79dcf | ||
|
|
98d76627a5 | ||
|
|
8a809013f3 | ||
|
|
485ed0b156 | ||
|
|
7d546f80f9 | ||
|
|
5dfdc15f93 | ||
|
|
a6e5873443 | ||
|
|
e2cf777538 | ||
|
|
1e54297be8 | ||
|
|
44b200240f | ||
|
|
9c61760713 | ||
|
|
5f86c6d404 | ||
|
|
6edc834143 | ||
|
|
b7dc3fae7c | ||
|
|
a2340c313f | ||
|
|
37b07a5e7c | ||
|
|
73013a3c04 | ||
|
|
e8099f01b5 | ||
|
|
672bdd3a56 | ||
|
|
c2c2c29658 | ||
|
|
c745e14f47 | ||
|
|
d84cd500bb | ||
|
|
5b456cadc4 | ||
|
|
4be80982a4 | ||
|
|
4d7f1f0c35 | ||
|
|
d3f097c7f1 | ||
|
|
a3d1b107f4 | ||
|
|
e8f08cda53 | ||
|
|
0ab6c176af | ||
|
|
5b0e8c6de0 | ||
|
|
8266ab5588 | ||
|
|
ea552208fc | ||
|
|
e86015a72a | ||
|
|
cf7ec2c9d3 | ||
|
|
dadd3ca671 | ||
|
|
67274c018d | ||
|
|
79535212c8 | ||
|
|
ef5f96a193 | ||
|
|
e89c421313 | ||
|
|
47d1d3c855 | ||
|
|
1628d801f9 | ||
|
|
1fb358249b | ||
|
|
418f71ec0f | ||
|
|
b30a510b45 | ||
|
|
0ebeaa9ac2 | ||
|
|
25cd47b8dc | ||
|
|
cd48d981b5 | ||
|
|
774d26b982 | ||
|
|
f3e683bd6f | ||
|
|
50ce0c0d9d | ||
|
|
5b80711d75 | ||
|
|
666e456551 | ||
|
|
31794ac376 | ||
|
|
2141fdf06e | ||
|
|
3f3e0739c4 | ||
|
|
ebed7e2147 | ||
|
|
53f5d4c710 | ||
|
|
139a4054c5 | ||
|
|
a4de96508d | ||
|
|
a7582aaf15 | ||
|
|
c5c1c64a81 | ||
|
|
992c52ce7f | ||
|
|
9f6af4f2cc | ||
|
|
60efdce5ff | ||
|
|
026aef7465 | ||
|
|
b53a23b51b | ||
|
|
2aad015392 | ||
|
|
986ec877b0 | ||
|
|
a68f2cb9fa | ||
|
|
5f5be823f3 | ||
|
|
03700ad37c | ||
|
|
6d01ee9284 | ||
|
|
cc3c1f31d0 | ||
|
|
5909502a13 | ||
|
|
88bbd847e0 | ||
|
|
34d14df297 | ||
|
|
bfc886cd54 | ||
|
|
c43ea74b30 | ||
|
|
79981f3cda | ||
|
|
8624d8c144 | ||
|
|
420582ec5e | ||
|
|
36207d9726 | ||
|
|
855d1bc5a1 | ||
|
|
081d15a830 | ||
|
|
d29d186d62 | ||
|
|
61f2ce67dd | ||
|
|
60dbf1bea0 | ||
|
|
58bb866e2d | ||
|
|
b2ec5d0f01 | ||
|
|
0c300bd4b4 | ||
|
|
53acb7bfcb | ||
|
|
65bbb0e0aa | ||
|
|
c2940a8385 | ||
|
|
bede564618 | ||
|
|
e0ca4b865a | ||
|
|
31c206bf80 | ||
|
|
9187a08106 | ||
|
|
3859a50466 | ||
|
|
927071e085 | ||
|
|
6ba918b203 | ||
|
|
e8b70dbca4 | ||
|
|
0f8d223c7f | ||
|
|
19a2885fd5 | ||
|
|
b8a094470b | ||
|
|
2988bb77e8 | ||
|
|
738317bf34 | ||
|
|
e46fbd0780 | ||
|
|
56b74ad990 | ||
|
|
6de92bb42b | ||
|
|
c801936e53 | ||
|
|
817656504d | ||
|
|
6f00f97b66 | ||
|
|
5acb978f8f | ||
|
|
5147654f6c | ||
|
|
250b6a3d52 | ||
|
|
975a4ae871 | ||
|
|
56aaf3c73e | ||
|
|
12fd1cad0c | ||
|
|
73ddbcc876 | ||
|
|
e573cbf032 | ||
|
|
dead461542 | ||
|
|
3d5da1ac73 | ||
|
|
ec408ca6a6 | ||
|
|
ce2b6dc84d | ||
|
|
7d16d8c887 | ||
|
|
1df5c5a76e | ||
|
|
52da387a1d | ||
|
|
c1221c5c87 | ||
|
|
befd669075 | ||
|
|
b6013a92e0 | ||
|
|
19af364400 | ||
|
|
3fd9a86f3c | ||
|
|
ce68701c0c | ||
|
|
6ea2cb3644 | ||
|
|
199c8aaa25 | ||
|
|
9ce6828d72 | ||
|
|
7ff5cf8372 | ||
|
|
eb771eaf0d | ||
|
|
6908555ed3 | ||
|
|
3890bc5a96 | ||
|
|
2c65f986d6 | ||
|
|
ea402b765c | ||
|
|
497e0669ff | ||
|
|
13ac74e0a2 | ||
|
|
c2f23d92dc | ||
|
|
7027da3cd3 | ||
|
|
005bb59797 | ||
|
|
88bc3a9271 | ||
|
|
2e32cf7b87 | ||
|
|
3ecf5fd442 | ||
|
|
3e9c3c8ae8 | ||
|
|
ec31e8df1d | ||
|
|
b56bfbae26 | ||
|
|
f55b1415d4 | ||
|
|
67693c6ad0 | ||
|
|
fce061b544 | ||
|
|
93765fcb30 | ||
|
|
b221bd7472 | ||
|
|
fd0a5a1116 | ||
|
|
47fa8c4cf6 | ||
|
|
7640609b41 | ||
|
|
e8e6357b73 | ||
|
|
4398101706 | ||
|
|
2e1481f49d | ||
|
|
c7c087a0d2 | ||
|
|
3461580b34 | ||
|
|
fcfdeac1c7 | ||
|
|
97f670658f | ||
|
|
4324fb2fbe | ||
|
|
e4cb74cf7b | ||
|
|
be137a191e | ||
|
|
fe1f3df36e | ||
|
|
4a330a4c33 | ||
|
|
75e60669a7 | ||
|
|
db379c6172 | ||
|
|
1da64fb79c | ||
|
|
8b42fd0a28 | ||
|
|
ea66cdd6a5 | ||
|
|
f762e8034f | ||
|
|
2c401f1102 | ||
|
|
bb1e369f30 | ||
|
|
d084950b1a | ||
|
|
2ce10f2fed | ||
|
|
036094799b | ||
|
|
2da6ab2a45 | ||
|
|
91a512606b | ||
|
|
b6d858f4d6 | ||
|
|
dedede3caa | ||
|
|
b14fc907f9 | ||
|
|
542bbb0889 | ||
|
|
714e69e708 | ||
|
|
cb87ed29d8 | ||
|
|
570c6765b0 | ||
|
|
12a2285ba5 | ||
|
|
1c023eac70 | ||
|
|
1e3f0650df | ||
|
|
1e9da09f62 | ||
|
|
5caf351c44 | ||
|
|
7d789a984a | ||
|
|
d921114832 | ||
|
|
39a1f03d5c | ||
|
|
c6a4a4edf1 | ||
|
|
45748a2bb0 | ||
|
|
9b13d862c1 | ||
|
|
590edc648a | ||
|
|
3326c87a88 | ||
|
|
0ec1863fcb | ||
|
|
2b67a14155 | ||
|
|
eac8caa4de | ||
|
|
61eb2aa328 | ||
|
|
a9847ebf54 | ||
|
|
4ca1089f60 | ||
|
|
926d4150c5 | ||
|
|
6f267adc14 | ||
|
|
0095e2d7d8 | ||
|
|
147f64e1fc | ||
|
|
b8e5932506 | ||
|
|
1ea04cd8cc | ||
|
|
b334643b68 | ||
|
|
6e6a0275b5 | ||
|
|
f5590806e0 | ||
|
|
f686e838fe | ||
|
|
ea8642dec9 | ||
|
|
eef5b58211 | ||
|
|
1de68b72b9 | ||
|
|
720df085e5 | ||
|
|
f90f17227b | ||
|
|
36f7eaadef | ||
|
|
1eb9300658 | ||
|
|
27e4656515 | ||
|
|
e0a09dbd69 | ||
|
|
30832ab33a | ||
|
|
d20b545a94 | ||
|
|
20d01be1ad | ||
|
|
d6b62d7512 | ||
|
|
ab9d9541a8 | ||
|
|
c3b8568560 | ||
|
|
8bd95a4eb1 | ||
|
|
2dac3ef58e | ||
|
|
86c7ab29f4 | ||
|
|
db89e5ec28 | ||
|
|
d096f75fb8 | ||
|
|
854424a758 | ||
|
|
fe5d0ce827 | ||
|
|
8376578921 | ||
|
|
ed2354cd9d | ||
|
|
386688b87a | ||
|
|
38d56dddf1 | ||
|
|
e8975942ec | ||
|
|
3ca80a7336 | ||
|
|
d029dae7ad | ||
|
|
9e058732ee | ||
|
|
cad5d11261 | ||
|
|
2fed3b5e5b | ||
|
|
1ecad094bd | ||
|
|
187cc573a7 | ||
|
|
fcaedec2ab | ||
|
|
ead9d59e88 | ||
|
|
34b8a17ccd | ||
|
|
a53d081c39 | ||
|
|
823134e4ba | ||
|
|
272167b4fc | ||
|
|
92f09bba94 | ||
|
|
0ead72a404 | ||
|
|
bbc5212436 | ||
|
|
c4f7740b80 | ||
|
|
6c239f7a00 | ||
|
|
7d5b859756 | ||
|
|
3e2e0d062b | ||
|
|
c45fe3517c | ||
|
|
d588da69e5 | ||
|
|
ec54a5c72c | ||
|
|
735a371249 | ||
|
|
5ab086e337 | ||
|
|
68f660dbcc | ||
|
|
0066f7a818 | ||
|
|
65059f2add | ||
|
|
23dff4f209 | ||
|
|
4a304bf34e | ||
|
|
36a6405e8b | ||
|
|
42c1fe963b | ||
|
|
465b154fc0 | ||
|
|
a0c4102b5a | ||
|
|
9420066895 | ||
|
|
74eac1d449 | ||
|
|
96676f8f3b | ||
|
|
93b51d56aa | ||
|
|
86c50574d2 | ||
|
|
efb528f979 | ||
|
|
edcd0b9913 | ||
|
|
55d1473918 | ||
|
|
0211c7f7f3 | ||
|
|
5913994169 | ||
|
|
26b1573cbe | ||
|
|
7fe07324d7 | ||
|
|
8e29430f21 | ||
|
|
326488aeeb | ||
|
|
cb86023bd7 | ||
|
|
bd2cb40424 | ||
|
|
e9a3ff0e70 | ||
|
|
5148e229e0 | ||
|
|
1ad21c27c9 | ||
|
|
f392e13077 | ||
|
|
3fe5b42b2b | ||
|
|
70c4b621cf | ||
|
|
a8df5e109b | ||
|
|
ba4f1da466 | ||
|
|
0bfbe6771e | ||
|
|
d1df0fec19 | ||
|
|
031ccce8b7 | ||
|
|
1f50bdb230 | ||
|
|
2eef4e6716 | ||
|
|
d989dbfec4 | ||
|
|
ca9fcec364 | ||
|
|
34eef0ed84 | ||
|
|
354104f9a9 | ||
|
|
8649ea3d6f | ||
|
|
752ff12c37 | ||
|
|
4bb89b1755 | ||
|
|
be068f360d | ||
|
|
0ef553d30e | ||
|
|
5b18b66282 | ||
|
|
7b2283c28b | ||
|
|
c74e018359 | ||
|
|
43a62aef07 | ||
|
|
ed4d0aa909 | ||
|
|
023ce4e720 | ||
|
|
368d9359dd | ||
|
|
d98c19d561 | ||
|
|
cab77e35e0 | ||
|
|
e3e90b4b93 | ||
|
|
f8c69893e1 | ||
|
|
49678a0893 | ||
|
|
d667b5b48c | ||
|
|
4a120f8090 | ||
|
|
9cba55b39c | ||
|
|
c2cbb7b8ce | ||
|
|
79b0f97a3f | ||
|
|
8217d75ca1 | ||
|
|
1ca70d9759 | ||
|
|
4303aaa9b8 | ||
|
|
7b56bae289 | ||
|
|
4183416b3e | ||
|
|
a60dee57ce | ||
|
|
5724656acb | ||
|
|
329f9cd9fe | ||
|
|
fbdb8b406e | ||
|
|
85d0bbd957 | ||
|
|
414f00d6ae | ||
|
|
e3ef3e8d71 | ||
|
|
7574dfd339 | ||
|
|
a5b93008f5 | ||
|
|
0227af5bb7 | ||
|
|
192f4240e3 | ||
|
|
ef71df60f6 | ||
|
|
f52b3b4e04 | ||
|
|
7e4e32cfe0 | ||
|
|
9f8649884b | ||
|
|
f1ee4caddd | ||
|
|
051b8fbb31 | ||
|
|
b0ea32f660 | ||
|
|
8322ae5a4c | ||
|
|
98a7c62d7a | ||
|
|
859e59262e | ||
|
|
ec113420f1 | ||
|
|
1954e94de2 | ||
|
|
f6ec43b9ec | ||
|
|
6d0d8cf9cf | ||
|
|
14f669f4fb | ||
|
|
5ede02aed8 | ||
|
|
bbabb7a14c | ||
|
|
b13ebe3ddb | ||
|
|
17b0add058 | ||
|
|
c68ed40661 | ||
|
|
b0199245d5 | ||
|
|
b93e3b2cf6 | ||
|
|
ae7fcf4c6b | ||
|
|
1607754771 | ||
|
|
028f659c40 | ||
|
|
8dfdacf128 | ||
|
|
f4a56f839f | ||
|
|
67a8eedca0 | ||
|
|
be65c7d5d0 | ||
|
|
7c5306a841 | ||
|
|
201210cfe1 | ||
|
|
cd6de3b24e | ||
|
|
dcd483bd99 | ||
|
|
3c5e4e2788 | ||
|
|
3f4f7b0a53 | ||
|
|
0a4b866d8a | ||
|
|
8c7d7dfa5b | ||
|
|
cdf615f783 | ||
|
|
7d96883d64 | ||
|
|
28c5e7e6a7 | ||
|
|
ff624075a8 | ||
|
|
08db28469d | ||
|
|
a20b326807 | ||
|
|
4db1b1b250 | ||
|
|
ff6b263b48 | ||
|
|
dbfc4abfd6 | ||
|
|
5544375002 | ||
|
|
1fd8d46064 | ||
|
|
46406d6cca | ||
|
|
196df1ccd5 | ||
|
|
d2358b42b6 | ||
|
|
e387d94ff1 | ||
|
|
3bb9c704de | ||
|
|
10537c5095 | ||
|
|
551ac56a33 | ||
|
|
5227582e90 | ||
|
|
c0bf052fa9 | ||
|
|
5419cff925 | ||
|
|
42959982a9 | ||
|
|
78c73fb9e7 | ||
|
|
a06bf388d9 | ||
|
|
de0c3e717e | ||
|
|
1194998ce9 | ||
|
|
7171e23700 | ||
|
|
dee378b775 | ||
|
|
f76262ef79 | ||
|
|
6a755b0663 | ||
|
|
c40354bbcb | ||
|
|
c04aafb4e3 | ||
|
|
e31abe6d6b | ||
|
|
e1349ccadc | ||
|
|
8838bdc1e3 | ||
|
|
d6386bc80f | ||
|
|
a2c2288cd6 | ||
|
|
edef62df86 | ||
|
|
e2621d5e44 | ||
|
|
0e3ff12dd3 | ||
|
|
b335ac4156 | ||
|
|
03cf6591c0 | ||
|
|
2e0949d8e6 | ||
|
|
5a728a069e | ||
|
|
7384ec199e | ||
|
|
7bce6329e3 | ||
|
|
49619fbd77 | ||
|
|
fb9a2c5431 | ||
|
|
cd38aa3b2a | ||
|
|
eee10ad2ed | ||
|
|
daeb7ae949 | ||
|
|
82a79565de | ||
|
|
078839c711 | ||
|
|
98472a8104 | ||
|
|
90cc32f6f8 | ||
|
|
9aec2f019a | ||
|
|
5da455080b | ||
|
|
17558102f2 | ||
|
|
e1c39f3fdc | ||
|
|
20555c8e37 | ||
|
|
300a619991 | ||
|
|
d094c168aa | ||
|
|
4b18460bc6 | ||
|
|
4319dedb23 | ||
|
|
f8bb66b4e0 | ||
|
|
5d6a8b3840 | ||
|
|
6a8c2848f6 | ||
|
|
6439727afc | ||
|
|
27b0a581a6 | ||
|
|
15a54230f1 | ||
|
|
f0d184884a | ||
|
|
8fca04f140 | ||
|
|
3b2b5edd26 | ||
|
|
5bd1fbb0d6 | ||
|
|
0772e571b7 | ||
|
|
910496cea9 | ||
|
|
739e1da279 | ||
|
|
08b4a7aaf2 | ||
|
|
1f0770ca55 | ||
|
|
505d0bfa51 | ||
|
|
860d13c7d8 | ||
|
|
76d77af0f0 | ||
|
|
ea8ab4ddf2 | ||
|
|
4bcc38c749 | ||
|
|
5becffbba5 | ||
|
|
d0194a6fb3 | ||
|
|
e45d13d469 | ||
|
|
412c0a965c | ||
|
|
2becf79223 | ||
|
|
a431274b32 | ||
|
|
994c9a01e3 | ||
|
|
ad1d5e8248 | ||
|
|
43ec96d4a0 | ||
|
|
3d1d779da7 | ||
|
|
c88056ba83 | ||
|
|
e769751221 | ||
|
|
b2670eaba5 | ||
|
|
54aff33118 | ||
|
|
499e053d58 | ||
|
|
9f33c6fe03 | ||
|
|
73e69edac3 | ||
|
|
4c4fa68268 | ||
|
|
43d2fd73ab | ||
|
|
71f1ec0bc8 | ||
|
|
99f4bce112 | ||
|
|
6b77ee9a5e | ||
|
|
25fa3ccade | ||
|
|
c6a95395b5 | ||
|
|
cb3042ffb2 | ||
|
|
d293aaf945 | ||
|
|
1d559bf00c | ||
|
|
4286f55c52 | ||
|
|
0a7cad9074 | ||
|
|
069a7fe71e | ||
|
|
9c8a45854a | ||
|
|
7d035edf9d | ||
|
|
36899dba0b | ||
|
|
6a31446671 | ||
|
|
451fbbcea1 | ||
|
|
a17a481e30 | ||
|
|
5f9d4a02a5 | ||
|
|
7094d88958 | ||
|
|
8ac73a9eba | ||
|
|
86a06a7acc | ||
|
|
d05c3f4e4d | ||
|
|
de178e90f4 | ||
|
|
3d960b5e55 | ||
|
|
39dc83bd82 | ||
|
|
503063cddc | ||
|
|
914df18bf9 | ||
|
|
a539094c06 | ||
|
|
cd3ed720e0 | ||
|
|
37c27fa606 | ||
|
|
093ca5d492 | ||
|
|
1d24dd3067 | ||
|
|
b9659ba0c0 | ||
|
|
49b9a90c3f | ||
|
|
64d141f71e | ||
|
|
c488d3123f | ||
|
|
b6af7abb1a | ||
|
|
edee8a3446 | ||
|
|
5582367d68 | ||
|
|
7a55ab6acc | ||
|
|
967af60327 | ||
|
|
6246d36fe6 | ||
|
|
f1ef9f9d31 | ||
|
|
dfaf08743c | ||
|
|
d9552d8a6d | ||
|
|
7586a8ab2c | ||
|
|
e1a942250b | ||
|
|
72be0185de | ||
|
|
7e4cbce06b | ||
|
|
177d62f431 | ||
|
|
5a11e03725 | ||
|
|
75d068b7cd | ||
|
|
fbc4bb29dc | ||
|
|
1208503888 | ||
|
|
de90d401d2 | ||
|
|
396defaea9 | ||
|
|
18f350cd04 | ||
|
|
7ba7ce3af7 | ||
|
|
478180ebe4 | ||
|
|
4a3059f509 | ||
|
|
78728138a0 | ||
|
|
087fcc4e6e | ||
|
|
63fc98591d | ||
|
|
53def9a682 | ||
|
|
520c520512 | ||
|
|
a6910313b4 | ||
|
|
2f32df1f09 | ||
|
|
23adf50194 | ||
|
|
0691ecc052 | ||
|
|
d917f44b5b | ||
|
|
602bb7170a | ||
|
|
75582d47b9 | ||
|
|
28fdf1e9ed | ||
|
|
9a8a3beae4 | ||
|
|
2a774a1fea | ||
|
|
b13b023c6b | ||
|
|
b652ad9568 | ||
|
|
624e679e35 | ||
|
|
618704f504 | ||
|
|
3b3ec402d6 | ||
|
|
2b3c1d640e | ||
|
|
323231d1dd | ||
|
|
714011c81e | ||
|
|
952ff4207b | ||
|
|
150b16ec2c | ||
|
|
f70b4e02c4 | ||
|
|
c98bc4a243 | ||
|
|
7d579e7400 | ||
|
|
e0f777d4eb | ||
|
|
febd1ad09c | ||
|
|
1040b85785 | ||
|
|
e2c81aa9ea | ||
|
|
014f8cd693 | ||
|
|
aea37e46e3 | ||
|
|
31ab78ae8e | ||
|
|
f82e1453e4 | ||
|
|
e4a147218b | ||
|
|
a2b77c8813 | ||
|
|
18add29472 | ||
|
|
4b2b89eb5e | ||
|
|
4b2bb88375 | ||
|
|
fb01e41e8a | ||
|
|
ff9759c09d | ||
|
|
a92e0e8540 | ||
|
|
9d47b220a4 | ||
|
|
c582a9faae | ||
|
|
cf483107c9 | ||
|
|
b57e2f5521 | ||
|
|
bf3ced6a34 | ||
|
|
390e830994 | ||
|
|
44c60567dd | ||
|
|
967d81b782 | ||
|
|
20199e770c | ||
|
|
4c824e5309 | ||
|
|
981bc85879 | ||
|
|
015527d870 | ||
|
|
6464b4b372 | ||
|
|
fef9747fbf | ||
|
|
13816c1c7d | ||
|
|
c54a920d13 | ||
|
|
83f8eeec44 | ||
|
|
b83fbad6a1 | ||
|
|
ec20784046 | ||
|
|
42ad753e39 | ||
|
|
1ccd2a7b11 | ||
|
|
4c1d29c86c | ||
|
|
0db7a0c9e2 | ||
|
|
13f6b1b344 | ||
|
|
593d82c6a9 | ||
|
|
43dccbd45d | ||
|
|
0ff4350352 | ||
|
|
5fd2b7cc79 | ||
|
|
7e16ac305d | ||
|
|
59a8836924 | ||
|
|
9d4020501c | ||
|
|
81350d65bc | ||
|
|
02642a64fd | ||
|
|
3c41e9f022 | ||
|
|
2670e13cbd | ||
|
|
49784513b1 | ||
|
|
523051132d | ||
|
|
b111a8fe8d | ||
|
|
3b23cf0258 | ||
|
|
55e6629fb4 | ||
|
|
b6251c6968 | ||
|
|
c51fe089ba | ||
|
|
fee9f1482c | ||
|
|
ae67f44c6e | ||
|
|
54dd1ad09b | ||
|
|
e2a74051dc | ||
|
|
b7e035b6f3 | ||
|
|
890f1f5928 | ||
|
|
b30c37eb79 | ||
|
|
b08cb148ae | ||
|
|
034bb13e1c | ||
|
|
6657801fb1 | ||
|
|
a199366157 | ||
|
|
2a6d5583d1 | ||
|
|
ddabe1a6df | ||
|
|
e7b47ce335 | ||
|
|
28e864e096 | ||
|
|
1de19b921a | ||
|
|
ff162b5a03 | ||
|
|
d8e4705dd4 | ||
|
|
ab05b70423 | ||
|
|
b177bffa6a | ||
|
|
338e1f5926 | ||
|
|
b4b468eb27 | ||
|
|
a7fdfa08e1 | ||
|
|
9703a401c5 | ||
|
|
753a2aa462 | ||
|
|
10990a0684 | ||
|
|
91254e9211 | ||
|
|
0f79287b04 | ||
|
|
f2fac77d8c | ||
|
|
81b7373637 | ||
|
|
fa67c2548a | ||
|
|
ea80587ddb | ||
|
|
bd50a0d2ef | ||
|
|
9256e748c8 | ||
|
|
af033c0d1d | ||
|
|
e96513c8db | ||
|
|
da9657aac4 | ||
|
|
2886766fb5 | ||
|
|
6e7f866288 | ||
|
|
6fa403edd9 | ||
|
|
431eb7bc8c | ||
|
|
9df4853e23 | ||
|
|
18c4ef09d5 | ||
|
|
bc93c7a1fc | ||
|
|
c8a2a557db | ||
|
|
9f827c99cb | ||
|
|
7b2b965415 | ||
|
|
c3cfa18ebe | ||
|
|
b46835e15e | ||
|
|
3e5ce3c92c | ||
|
|
e5c9b4cd75 | ||
|
|
8753e558f2 | ||
|
|
f6691579de | ||
|
|
828f5f8384 | ||
|
|
1295a1272a | ||
|
|
66646d9276 | ||
|
|
d0497dba92 | ||
|
|
42914e8227 | ||
|
|
59b49b7881 | ||
|
|
5620f16330 | ||
|
|
be024d4ad7 | ||
|
|
cfc152d979 | ||
|
|
513212c5e8 | ||
|
|
99a447dff5 | ||
|
|
56a9bf459d | ||
|
|
11dbba3503 | ||
|
|
8662427d48 | ||
|
|
821480d329 | ||
|
|
5ce93d6fa8 | ||
|
|
20a5ef2798 | ||
|
|
735eabb066 | ||
|
|
412ff762bb | ||
|
|
44bbf42a9f | ||
|
|
75c740fe2b | ||
|
|
6c8d86bb90 | ||
|
|
b253a6b71e | ||
|
|
030f87c90c | ||
|
|
ae941a7665 | ||
|
|
4d563e08e1 | ||
|
|
8a81b986c0 | ||
|
|
a6e62479be | ||
|
|
6c825064ea | ||
|
|
13d02968bd | ||
|
|
e576556149 | ||
|
|
66e74900df | ||
|
|
aadc735d71 | ||
|
|
a13897cf6f | ||
|
|
b188ae0e5c | ||
|
|
c196710fae | ||
|
|
e4f62483ff | ||
|
|
8d9347edc5 | ||
|
|
eff821c1ca | ||
|
|
3bcd6ecbad | ||
|
|
e76f4c2ae9 | ||
|
|
f46ac45d69 | ||
|
|
1d1259a86d | ||
|
|
101f08ca75 | ||
|
|
3b7f9827ab | ||
|
|
f98bf39005 | ||
|
|
9e7df54ccd | ||
|
|
db23c2f27b | ||
|
|
9744f437d8 | ||
|
|
01f84b0e53 | ||
|
|
5dbdd36263 | ||
|
|
96b557c1f0 | ||
|
|
ebdb7c8de2 | ||
|
|
1fda842ee6 | ||
|
|
f71e20d0ce | ||
|
|
988680de33 | ||
|
|
cdf92c6300 | ||
|
|
be5b726c0a | ||
|
|
3491218915 | ||
|
|
d0f6131ba4 | ||
|
|
ca7b4df812 | ||
|
|
9cc37bdea2 | ||
|
|
3f754fd350 | ||
|
|
bc8dd57236 | ||
|
|
f4f461b8bb | ||
|
|
cbb9b6957f | ||
|
|
f6b56c9317 | ||
|
|
3717fb6c8d | ||
|
|
f6abbc01bd | ||
|
|
91438b6540 | ||
|
|
987c505906 | ||
|
|
598bb93cc2 | ||
|
|
dc531b64ae | ||
|
|
91d4b5cfed | ||
|
|
c24b8460e0 | ||
|
|
2e471daef1 | ||
|
|
7ae57a3531 | ||
|
|
11f36c0bd6 | ||
|
|
fd520eeed2 | ||
|
|
30a5dd267b | ||
|
|
2f0d683378 | ||
|
|
a1309a90ac | ||
|
|
010855a294 | ||
|
|
71ed3ff992 | ||
|
|
d4266d0063 | ||
|
|
8225064aab | ||
|
|
e5ee357903 | ||
|
|
8aef518c05 | ||
|
|
309ed77ef4 | ||
|
|
9a6d2b791f | ||
|
|
2a5010a426 | ||
|
|
be29da46f8 | ||
|
|
d0734e27ba | ||
|
|
732f6aaa30 | ||
|
|
dd422c7b8b | ||
|
|
c8f7a859ea | ||
|
|
28a2d41b85 | ||
|
|
7e76656a18 | ||
|
|
0b93f52ba4 | ||
|
|
57a71c157d | ||
|
|
cc76aeb7bb | ||
|
|
811cabf8a9 | ||
|
|
bf8d2f93d2 | ||
|
|
07d8259ad6 | ||
|
|
a00d412008 | ||
|
|
aa9c6062b0 | ||
|
|
5fb39658f1 | ||
|
|
95637fd153 | ||
|
|
5ac72211cd | ||
|
|
94525d3952 | ||
|
|
7f9a2f8adb | ||
|
|
cd0e92878f | ||
|
|
9033f07724 | ||
|
|
b7d0890bc0 | ||
|
|
b2b079a26b | ||
|
|
b886dfae4d | ||
|
|
902fbb3347 | ||
|
|
9f16c798d0 | ||
|
|
318f80d113 | ||
|
|
9df8b32f10 | ||
|
|
6f37f5752b | ||
|
|
9d0a71f245 | ||
|
|
ff1b435232 | ||
|
|
b57a272f67 | ||
|
|
ef79647e85 | ||
|
|
d3fd89552f | ||
|
|
6d43e70a93 | ||
|
|
e8333316ee | ||
|
|
85edcb858d | ||
|
|
bab5f1a93f | ||
|
|
6de8303df8 | ||
|
|
33b4114534 | ||
|
|
7a4457402f | ||
|
|
9056dcaf7d | ||
|
|
2119e4fd3e | ||
|
|
bcd5190f1d | ||
|
|
d705a92e43 | ||
|
|
614b3634d4 | ||
|
|
b234f4307f | ||
|
|
e38c213ee0 | ||
|
|
699f41e114 | ||
|
|
424e1363ed | ||
|
|
7484bc31b4 | ||
|
|
5a495cc165 | ||
|
|
9ff4717738 | ||
|
|
0c1740982d | ||
|
|
3c7c0515d8 | ||
|
|
56cb92fdaf | ||
|
|
c00b6ff999 | ||
|
|
df5cc3f0f6 | ||
|
|
eb0ff32efb | ||
|
|
cf0120e8e0 | ||
|
|
1f47dc990d | ||
|
|
9a5bcc6db0 | ||
|
|
492b20a89d | ||
|
|
fcfc8bacc0 | ||
|
|
0800d9427c | ||
|
|
4e113a7086 | ||
|
|
39f422ded8 | ||
|
|
d2cdaa041c | ||
|
|
d84dae488e | ||
|
|
79e75bfbb9 | ||
|
|
73b15c1bee | ||
|
|
b180604422 | ||
|
|
fab12ef241 | ||
|
|
917881aa48 | ||
|
|
9259e989a4 | ||
|
|
da90f484aa | ||
|
|
817e912025 | ||
|
|
7f83d38bca | ||
|
|
54de8b8e77 | ||
|
|
796956970e | ||
|
|
c0020142da | ||
|
|
ee6eea95af | ||
|
|
a257504ba4 | ||
|
|
fb0dbce15b | ||
|
|
8333551331 | ||
|
|
292d794806 | ||
|
|
91ce76af9d | ||
|
|
33bd9e80bb | ||
|
|
d310f3e9b7 | ||
|
|
8c832f4c50 | ||
|
|
31bad5f7af | ||
|
|
1cf7f3d87c | ||
|
|
9c9a9ccd5c | ||
|
|
7381236de6 | ||
|
|
fe9ffcb9d2 | ||
|
|
bea5681fd8 | ||
|
|
e11229494e | ||
|
|
ccc0fcb5b7 | ||
|
|
6e24381962 | ||
|
|
3ab905644d | ||
|
|
f46d545307 | ||
|
|
8134b0073b | ||
|
|
6ab19c7ef2 | ||
|
|
d22361f7c7 | ||
|
|
06c7e55188 | ||
|
|
b3eb8489f3 | ||
|
|
5431fca99b | ||
|
|
47c9d6ac64 | ||
|
|
d0157af13e | ||
|
|
fc04620519 | ||
|
|
d4ee165253 | ||
|
|
4f7f577a57 | ||
|
|
612def5c11 | ||
|
|
704825be96 | ||
|
|
b8be7ec90e | ||
|
|
a3d71f4b91 | ||
|
|
9250819b75 | ||
|
|
04738636ca | ||
|
|
33f67d418f | ||
|
|
07d1b3780d | ||
|
|
27d68d8fdd | ||
|
|
546b773b21 | ||
|
|
15dcaeda0f | ||
|
|
8f42ba13ef | ||
|
|
5990017d51 | ||
|
|
3197c0fd7d | ||
|
|
4580c685f1 | ||
|
|
67232453d4 | ||
|
|
b4cce80727 | ||
|
|
89a2e5ded3 | ||
|
|
9d6b4f46d4 | ||
|
|
a4019cb6aa | ||
|
|
b0703b92c3 | ||
|
|
d29bdf3e81 | ||
|
|
dd9fd3d8a7 | ||
|
|
cf0c59864f | ||
|
|
4c0404c70d | ||
|
|
573a413ee1 | ||
|
|
f633e6ca49 | ||
|
|
07b06d76be | ||
|
|
501a4af914 | ||
|
|
dad7d7e798 | ||
|
|
4b94ae8040 | ||
|
|
b04679b429 | ||
|
|
19358d1c42 | ||
|
|
8679074be7 | ||
|
|
ba09e22c30 | ||
|
|
6515b9727d | ||
|
|
4af8e5bdb5 | ||
|
|
2db8cf477b | ||
|
|
3cfefa53f7 | ||
|
|
bce89feb13 | ||
|
|
88f5220acf | ||
|
|
3e87ac75a1 | ||
|
|
9237f2a80c | ||
|
|
61aca389c4 | ||
|
|
80438c4876 | ||
|
|
70ac4fa96b | ||
|
|
6e2b348758 | ||
|
|
5ed5d7fe60 | ||
|
|
856fe2da15 | ||
|
|
f82aae65cd | ||
|
|
3fbd11a104 | ||
|
|
58a99f1907 | ||
|
|
613dd67784 | ||
|
|
58683f02ec | ||
|
|
7cb82fe8f3 | ||
|
|
0494779ecb | ||
|
|
0500990d23 | ||
|
|
22a82f1eaa | ||
|
|
13b04dc908 | ||
|
|
011106b517 | ||
|
|
7467b85019 | ||
|
|
7dea615f74 | ||
|
|
3010d182fc | ||
|
|
a72a02f0f2 | ||
|
|
614df96382 | ||
|
|
669d7a6feb | ||
|
|
d600b937f1 | ||
|
|
ae713cb099 | ||
|
|
979f1b6c39 | ||
|
|
cf86dfd317 | ||
|
|
a057b4f6d8 | ||
|
|
62b03cfddf | ||
|
|
18b827b979 | ||
|
|
0a379fc514 | ||
|
|
445c11b8d9 | ||
|
|
1fa1790da5 | ||
|
|
dd29e6e475 | ||
|
|
ae4b30a697 | ||
|
|
353299168a | ||
|
|
a50b2c3b85 | ||
|
|
ebecee3d85 | ||
|
|
194f733ca7 | ||
|
|
3907ddbcc4 | ||
|
|
e616be0a42 | ||
|
|
5eef146871 | ||
|
|
2e65686fc0 | ||
|
|
e5847f1ddf | ||
|
|
86d05e98e5 | ||
|
|
8d290ad509 | ||
|
|
b90c48b50f | ||
|
|
d19e7db09e | ||
|
|
9939904b02 | ||
|
|
ca23b15f5c | ||
|
|
ffa676f577 | ||
|
|
6d023c4df3 | ||
|
|
b31bd37a30 | ||
|
|
78faee8c7c | ||
|
|
40e2a703d0 | ||
|
|
b01edcb9bc | ||
|
|
cdd2d4cc1d | ||
|
|
3bcabad28c | ||
|
|
c629ac7168 | ||
|
|
0195d5590f | ||
|
|
e7bebb0089 | ||
|
|
7b05df8d33 | ||
|
|
a8db9ae304 | ||
|
|
e6e9b2041e | ||
|
|
77c747a8fd | ||
|
|
907fb257cd | ||
|
|
60bd60db03 | ||
|
|
0fcc28a108 | ||
|
|
ab8005f03e | ||
|
|
5e8f578e78 | ||
|
|
a4b1633e11 | ||
|
|
fea211a109 | ||
|
|
59e4f1ee0f | ||
|
|
86a0a42a8d | ||
|
|
662842126d | ||
|
|
66e3801b1e | ||
|
|
a30cf60422 | ||
|
|
c2b8b818c7 | ||
|
|
4284b0e2b8 | ||
|
|
9def9b35b9 | ||
|
|
377a2860cc | ||
|
|
0a3a5a7c65 | ||
|
|
f7fffc9be8 | ||
|
|
50e8634097 | ||
|
|
e3994e517e | ||
|
|
2bb7785189 | ||
|
|
90c8408111 | ||
|
|
64786ec12a | ||
|
|
b3c82f8886 | ||
|
|
063259dc52 | ||
|
|
c5996c0593 | ||
|
|
cde5a07981 | ||
|
|
4faef28cc5 | ||
|
|
b4c9d9c2a7 | ||
|
|
fa2b59df4b | ||
|
|
f41a169460 | ||
|
|
f567083006 | ||
|
|
a2a677e539 | ||
|
|
9123c0b733 | ||
|
|
788e3b31e1 | ||
|
|
71f0ed8b74 | ||
|
|
89b900432e | ||
|
|
8bb9d0960b | ||
|
|
59181ac5fb | ||
|
|
2a831fa547 | ||
|
|
4abadc890e | ||
|
|
b0ce551523 | ||
|
|
8b0269c264 | ||
|
|
ac2e4e593d | ||
|
|
edaa7d7748 | ||
|
|
3cdf965fba | ||
|
|
6b60d1e71f | ||
|
|
d68772d45a | ||
|
|
52cb425e33 | ||
|
|
ed3220f37f | ||
|
|
043cbec68f | ||
|
|
7d7217ef89 | ||
|
|
67c709170d | ||
|
|
f6e428ac22 | ||
|
|
45fbafae94 | ||
|
|
803b73a34b | ||
|
|
7b7fb5acd5 | ||
|
|
b1512201ab | ||
|
|
424e9cbc43 | ||
|
|
95b62a843a | ||
|
|
ccb4f44caf | ||
|
|
c788c76dc9 | ||
|
|
2e4e1c7f48 | ||
|
|
0a7d612f41 | ||
|
|
38da76bbe0 | ||
|
|
a13e045742 | ||
|
|
811620c0a0 | ||
|
|
504f5f7bdd | ||
|
|
f85d4d28d1 | ||
|
|
b4e4bdcda9 | ||
|
|
dae8b78569 | ||
|
|
32bcad51b8 | ||
|
|
e26d49efb7 | ||
|
|
a40510c241 | ||
|
|
ac8dce6599 | ||
|
|
190d525099 | ||
|
|
1b6666fa39 | ||
|
|
1dd01c99e8 | ||
|
|
d50b30a498 | ||
|
|
42a3a87f13 | ||
|
|
9dfedbe619 | ||
|
|
88957b4c9d | ||
|
|
b2f2c9322b | ||
|
|
3be2051808 | ||
|
|
ff32b0dc9b | ||
|
|
c1869a11af | ||
|
|
e22a4fdba4 | ||
|
|
29a7b2c5b5 | ||
|
|
3b6c285c2a | ||
|
|
e9e853b19a | ||
|
|
e48ea5f23a | ||
|
|
a99bab935a | ||
|
|
3eee35e1f7 | ||
|
|
c7396b0675 | ||
|
|
e3ee60e7af | ||
|
|
05b8ddac4c | ||
|
|
668724de4e | ||
|
|
71ce1a25dd | ||
|
|
cd522f524d | ||
|
|
ca559b1db6 | ||
|
|
a8e76fb345 | ||
|
|
1d445d1039 | ||
|
|
29d03ab937 | ||
|
|
575d1786af | ||
|
|
bc1c927952 | ||
|
|
f95bc85f91 | ||
|
|
4015195314 | ||
|
|
c3d883c6cb | ||
|
|
097e30321b | ||
|
|
b6ddeaacf2 | ||
|
|
b0c60ec124 | ||
|
|
46aa4d2f91 | ||
|
|
d0b4bd08e1 | ||
|
|
512e81c629 | ||
|
|
452666f742 | ||
|
|
72008d951b | ||
|
|
72146e7800 | ||
|
|
f7af1bb8e2 | ||
|
|
f88f1fca3f | ||
|
|
26e4a40cc7 | ||
|
|
8b1931072a | ||
|
|
45e15b6cc6 | ||
|
|
be7e52c882 | ||
|
|
4162ce0bc5 | ||
|
|
7e46277016 | ||
|
|
f3b788703e | ||
|
|
4bb83781e8 | ||
|
|
a73195b7cc | ||
|
|
1bd00b8a9a | ||
|
|
d84eaeafc5 | ||
|
|
3b84b99804 | ||
|
|
1786f9b1bb | ||
|
|
1e972174a6 | ||
|
|
77178e0590 | ||
|
|
9a909d9f27 | ||
|
|
90d25a40a0 | ||
|
|
c335f18be7 | ||
|
|
7dc3e73782 | ||
|
|
47dffe66aa | ||
|
|
6636c69a11 | ||
|
|
0ccaf4a1ff | ||
|
|
5cdbad7937 | ||
|
|
fc0508c047 | ||
|
|
78ca5491e6 | ||
|
|
4146475c73 | ||
|
|
329c3ab21b | ||
|
|
3b7f6641d2 | ||
|
|
781487c4dd | ||
|
|
5ba5bc8ba1 | ||
|
|
82c66ce078 | ||
|
|
9324fbf921 | ||
|
|
5e081de14a | ||
|
|
d1456ae039 | ||
|
|
115af4f565 | ||
|
|
822724d1aa | ||
|
|
87c9856b20 | ||
|
|
835136dcd3 | ||
|
|
4a80e9cb25 | ||
|
|
de80c270bd | ||
|
|
b92bff2658 | ||
|
|
42f1e26540 | ||
|
|
cfd056231b | ||
|
|
20ae84bff9 | ||
|
|
b1c7649edb | ||
|
|
853740f1e2 | ||
|
|
14986b153a | ||
|
|
9e503b21c1 | ||
|
|
67a958a326 | ||
|
|
7372c931b3 | ||
|
|
29e1b6e465 | ||
|
|
eda06993f8 | ||
|
|
4b30ef1cf2 | ||
|
|
e92e5e8eb8 | ||
|
|
4e5271fcdf | ||
|
|
3c55487a16 | ||
|
|
76a1cae5d8 | ||
|
|
3850716522 | ||
|
|
1e0a60e73d | ||
|
|
e9c99e0518 | ||
|
|
332baa4f67 | ||
|
|
08879d2a20 | ||
|
|
1292af4768 | ||
|
|
4d88a099f9 | ||
|
|
777e15bd78 | ||
|
|
f689e28958 | ||
|
|
d184231169 | ||
|
|
7225e919fc | ||
|
|
7a185f1ead | ||
|
|
c1fa5279f4 | ||
|
|
4f0fe66f69 | ||
|
|
76380b2b45 | ||
|
|
67b7d46432 | ||
|
|
29453ba196 | ||
|
|
599d77643b | ||
|
|
09d87d5ef1 | ||
|
|
2f3f075e4f | ||
|
|
17097d96b7 | ||
|
|
a3e28c2d1a | ||
|
|
03a97d87ea | ||
|
|
8cbf099054 | ||
|
|
c287452255 | ||
|
|
07ce915c66 | ||
|
|
81a97315e3 | ||
|
|
53c14d97a6 | ||
|
|
69a82eec17 | ||
|
|
45cadef22f | ||
|
|
73f58c57e8 | ||
|
|
43348a3e13 | ||
|
|
e716b1f4d7 | ||
|
|
82e74a4ebd | ||
|
|
16b260e371 | ||
|
|
3102e05da4 | ||
|
|
df4af2b550 | ||
|
|
0a033fb10a | ||
|
|
591afa0647 | ||
|
|
05eac20ffe | ||
|
|
38d263ac19 | ||
|
|
f71c204eef | ||
|
|
51147203be | ||
|
|
a931686317 | ||
|
|
5bd322bdcf | ||
|
|
bb097109f0 | ||
|
|
97132e3d38 | ||
|
|
5ad1fe77b1 | ||
|
|
8d4ed1e988 | ||
|
|
add953fb6e | ||
|
|
3854211694 | ||
|
|
58ac72f79d | ||
|
|
6d5904801e | ||
|
|
d4993c405e | ||
|
|
7af8e3937f | ||
|
|
f8eeded528 | ||
|
|
c3fa7e13cf | ||
|
|
5c18b0a94d | ||
|
|
ecbad638f1 | ||
|
|
611ce6e756 | ||
|
|
4140e9b857 | ||
|
|
8fd9d91974 | ||
|
|
d3f35dab1e | ||
|
|
487e2618cd | ||
|
|
30d5186db4 | ||
|
|
cbe59714d4 | ||
|
|
704a28ca17 | ||
|
|
8d70d10aba | ||
|
|
ddd8b16f2b | ||
|
|
b79ce77ec5 | ||
|
|
fead4bbfd9 | ||
|
|
872ecc1aed | ||
|
|
2ab6c40ff1 | ||
|
|
68bb738af2 | ||
|
|
6b968beede | ||
|
|
f68dd1bffb | ||
|
|
f92b71ca99 | ||
|
|
2b79fe2d6a | ||
|
|
44dd9af276 | ||
|
|
d3013d4f8c | ||
|
|
678524ad21 | ||
|
|
32a64481f2 | ||
|
|
1776015c6c | ||
|
|
f1c71a26e3 | ||
|
|
e78ab767d3 | ||
|
|
f01eb2f95d | ||
|
|
1450e45d97 | ||
|
|
ec8cba369c | ||
|
|
f4c248f406 | ||
|
|
f3b2a58646 | ||
|
|
c6f89c42b2 | ||
|
|
5e93cfdd9e | ||
|
|
d91d5a3ab5 | ||
|
|
907c045f33 | ||
|
|
90f189eb54 | ||
|
|
4abd5b2112 | ||
|
|
df9a665994 | ||
|
|
7a098ca0ed | ||
|
|
33716732a1 | ||
|
|
97ae594375 | ||
|
|
3f321ae9a0 | ||
|
|
161d32a7e7 | ||
|
|
d7137586a9 | ||
|
|
cd0c06ba6e | ||
|
|
899ab63d91 | ||
|
|
1097820a5a | ||
|
|
39114f91a7 | ||
|
|
4f01387edf | ||
|
|
de3e0585f1 | ||
|
|
f85f25ba82 | ||
|
|
10a2c179f9 | ||
|
|
6eea56861b | ||
|
|
21fd2064ae | ||
|
|
dcbab8e37a | ||
|
|
5677278251 | ||
|
|
a83bee993d | ||
|
|
96a31f554a | ||
|
|
d14ec6aea5 | ||
|
|
917cedf893 | ||
|
|
193dd71600 | ||
|
|
6c293a3d7f | ||
|
|
e847ddf011 | ||
|
|
7e8b448985 | ||
|
|
d1f3a87c08 | ||
|
|
9f8145e590 | ||
|
|
791efc171a | ||
|
|
144312a525 | ||
|
|
92684112ed | ||
|
|
ef114ee6cb | ||
|
|
667f209742 | ||
|
|
4ad0747c78 | ||
|
|
c5cf66402c | ||
|
|
05417049eb | ||
|
|
c7b0c46d9f | ||
|
|
df578c91ad | ||
|
|
70008c47c9 | ||
|
|
938affef32 | ||
|
|
a3c33000ee | ||
|
|
1e54b7b294 | ||
|
|
cc0dbcf3f4 | ||
|
|
c5a2cadccc | ||
|
|
9aa43416b6 | ||
|
|
8364029db8 | ||
|
|
d842d21be0 | ||
|
|
3514fd2433 | ||
|
|
6778ff27ea | ||
|
|
f32315d699 | ||
|
|
8b754b24b6 | ||
|
|
b1bee9ff38 | ||
|
|
569be2d402 | ||
|
|
78a73eac53 | ||
|
|
533cb99c33 | ||
|
|
79726940dc | ||
|
|
27c7891169 | ||
|
|
7a3a793a12 | ||
|
|
8088469eca | ||
|
|
3dcb082015 | ||
|
|
bece023028 | ||
|
|
9c4df66925 | ||
|
|
2b43ceb6c6 | ||
|
|
c143adba91 | ||
|
|
142fdc8d86 | ||
|
|
67778dcd3d | ||
|
|
ed80863eac | ||
|
|
c3fc84de12 | ||
|
|
904f83cd85 | ||
|
|
28bf100a50 | ||
|
|
accbd4e82a | ||
|
|
d7f478c154 | ||
|
|
8f7f13fea4 | ||
|
|
c82b03a74c | ||
|
|
58fb36bdb9 | ||
|
|
4297a7b0a4 | ||
|
|
1bab6d0dd7 | ||
|
|
13b85edbe2 | ||
|
|
dc53098e43 | ||
|
|
3c66feff5a | ||
|
|
218c3bc0d5 | ||
|
|
9f5eddcd13 | ||
|
|
3cba76552b | ||
|
|
e98a8b624b | ||
|
|
6c6947b01f | ||
|
|
78c91e9e5b | ||
|
|
44493ca0c4 | ||
|
|
42acf78b09 | ||
|
|
3aa9f8af18 | ||
|
|
8a32ee30a5 | ||
|
|
981dc0626b | ||
|
|
8986d14e98 | ||
|
|
5163b1a624 | ||
|
|
860aa9d6d0 | ||
|
|
64dc5212f9 | ||
|
|
6cff3214f3 | ||
|
|
fd910bd5e9 | ||
|
|
c6086bed41 | ||
|
|
1a9dfdfab8 | ||
|
|
5284cd11a9 | ||
|
|
d1a47cffad | ||
|
|
f469595eee | ||
|
|
9cfc52f114 | ||
|
|
30bfb756c2 | ||
|
|
711f85445e | ||
|
|
8aae9766e5 | ||
|
|
288b98ccbf | ||
|
|
bde50b1be8 | ||
|
|
a34dfd55be | ||
|
|
609c1d4d4c | ||
|
|
c12fe09969 | ||
|
|
bd14afe347 | ||
|
|
f445a13051 | ||
|
|
8ddf607d9f | ||
|
|
5900253b85 | ||
|
|
ccec94925f | ||
|
|
4504a9d0b5 | ||
|
|
057f98ad45 | ||
|
|
3b1c9aa026 | ||
|
|
658397dc38 | ||
|
|
0cd1c8e23e | ||
|
|
0345c1e6f8 | ||
|
|
f6c4cda0d4 | ||
|
|
39fd713b91 | ||
|
|
31d77ec580 | ||
|
|
06116382ee | ||
|
|
d2046de193 | ||
|
|
4397fe3a13 | ||
|
|
534e1fa6eb | ||
|
|
3e8cc2c670 | ||
|
|
3c565baf9d | ||
|
|
2e182e84c3 | ||
|
|
a42021655c | ||
|
|
2498a2b0bd | ||
|
|
4484411a77 | ||
|
|
61a151c803 | ||
|
|
5149c950aa | ||
|
|
18f4d846c9 | ||
|
|
db95aa250d | ||
|
|
982d1bf662 | ||
|
|
a0393e9ddf | ||
|
|
a8d6328bd4 | ||
|
|
13dab13319 | ||
|
|
c623aa0f06 | ||
|
|
79403afbe6 | ||
|
|
4c650e87fa | ||
|
|
3dde62befe | ||
|
|
8bfabbe265 | ||
|
|
e334b16aaa | ||
|
|
5626ace245 | ||
|
|
52652cb609 | ||
|
|
256f40d4f5 | ||
|
|
ef9acc54ec | ||
|
|
a9f2d25957 | ||
|
|
6fc47fbb69 | ||
|
|
9c11184238 | ||
|
|
a421c1dbfb | ||
|
|
7ec707927d | ||
|
|
837134daef | ||
|
|
4011899846 | ||
|
|
28e743ba70 | ||
|
|
a161d404ad | ||
|
|
cd607cb280 | ||
|
|
4e60ab7f53 | ||
|
|
71e7d32b08 | ||
|
|
d5e422970c | ||
|
|
871ba5a488 | ||
|
|
249e8d59cb | ||
|
|
8f4769d2ac | ||
|
|
a3ca9963a5 | ||
|
|
2d3c23876c | ||
|
|
bd8d8eef3e | ||
|
|
e786207cc2 | ||
|
|
b042095ac2 | ||
|
|
3413d1bf23 | ||
|
|
018c5ef731 | ||
|
|
fdb136f1fa | ||
|
|
9e33074735 | ||
|
|
d6d465cdf4 | ||
|
|
e76573cc1a | ||
|
|
3fa6dc71e2 | ||
|
|
6fec269844 | ||
|
|
b6004b6837 | ||
|
|
86d3b25aec | ||
|
|
8a407bfbb0 | ||
|
|
d30a590d9e | ||
|
|
f95e404be1 | ||
|
|
ffb8b4fc68 | ||
|
|
f86d6b0162 | ||
|
|
71c72ed072 | ||
|
|
a8d343e07b | ||
|
|
d020172181 | ||
|
|
e5c9f6c1fe | ||
|
|
176dc11748 | ||
|
|
c2abd02b9b | ||
|
|
12ecfdd423 | ||
|
|
67cfbfc2f3 | ||
|
|
fc83d38e67 | ||
|
|
7063c423eb | ||
|
|
36b93993cf | ||
|
|
ceffc5aa72 | ||
|
|
ccb45b6f6e | ||
|
|
d2e47e014a | ||
|
|
a5b8d7917f | ||
|
|
d0e735ee4b | ||
|
|
ece5971027 | ||
|
|
7c6b0d5c31 | ||
|
|
03151310cf | ||
|
|
baa2bc0c38 | ||
|
|
7e1b53480e | ||
|
|
6425b4f9f5 | ||
|
|
fb907f5f76 | ||
|
|
b107a1583f | ||
|
|
ced3f320eb | ||
|
|
a9d7293818 | ||
|
|
add42e9edf | ||
|
|
265ad4b96a | ||
|
|
92eeb4969f | ||
|
|
6fcddaf8fa | ||
|
|
41fd583fbc | ||
|
|
ceba6816de | ||
|
|
093cb475bb | ||
|
|
d44790b35f | ||
|
|
f8164a3dd1 | ||
|
|
c20126598f | ||
|
|
6c818bb37a | ||
|
|
8cb160b1f8 | ||
|
|
df91f3738a | ||
|
|
b5b268f606 | ||
|
|
ce6b8c94a2 | ||
|
|
6e643fe58b | ||
|
|
2bf91a0487 | ||
|
|
2775d747ac | ||
|
|
99659e4cf9 | ||
|
|
3bbcda917c | ||
|
|
7e43fb79af | ||
|
|
eb2b567da6 | ||
|
|
ab332d7b2e | ||
|
|
53e22b81ef | ||
|
|
3fc9d50adb | ||
|
|
c2da6dd45b | ||
|
|
7146f825b2 | ||
|
|
f61a5f5200 | ||
|
|
dc05dd7ca1 | ||
|
|
57dd344f3b | ||
|
|
f7f59df8aa | ||
|
|
0525a6f90f | ||
|
|
7b4305d81b | ||
|
|
94e9e93fa4 | ||
|
|
d2a1294e9a | ||
|
|
3d897f18cd | ||
|
|
68c14d1e53 | ||
|
|
48089394a5 | ||
|
|
30bd190b41 | ||
|
|
cf93cd9307 | ||
|
|
f40816e063 | ||
|
|
3759f29852 | ||
|
|
bc5555933f | ||
|
|
ead7ae8504 | ||
|
|
ad5abba8c6 | ||
|
|
61296cedd2 | ||
|
|
d9c29a2c4f | ||
|
|
f5172e6b84 | ||
|
|
544bcbe903 | ||
|
|
f35dab1b56 | ||
|
|
caee420087 | ||
|
|
e8c374113e | ||
|
|
98a241a730 | ||
|
|
be8297d6f6 | ||
|
|
09da80e9f4 | ||
|
|
df4ecf63a8 | ||
|
|
b4d1937857 | ||
|
|
0be5fbdc35 | ||
|
|
ae7e25ea65 | ||
|
|
fef45d469c | ||
|
|
e7353ec7e7 | ||
|
|
e3237f057d | ||
|
|
54d5d9d1cc | ||
|
|
31d9aebf0b | ||
|
|
5013de6770 | ||
|
|
301abac0c1 | ||
|
|
9614c48e4c | ||
|
|
c6e1ca1c22 | ||
|
|
30dc473697 | ||
|
|
65974ceabc | ||
|
|
6caf53d1c2 | ||
|
|
dee6e498d9 | ||
|
|
b3723274f7 | ||
|
|
9fb7cc796b | ||
|
|
3472208c05 | ||
|
|
fc30e1d559 | ||
|
|
cd4bb444ff | ||
|
|
e443513996 | ||
|
|
3d16f22135 | ||
|
|
6cc1ff5eeb | ||
|
|
3000b9dcde | ||
|
|
3b867462a3 | ||
|
|
b8aa9348b9 | ||
|
|
513e3a3d21 | ||
|
|
bfb0897b54 | ||
|
|
86e8b8c10d | ||
|
|
ee57c3490a | ||
|
|
77c1f54876 | ||
|
|
dc5984d0e0 | ||
|
|
7afbd4800f | ||
|
|
0720702c91 | ||
|
|
5f396e824f | ||
|
|
4f229c254c | ||
|
|
25e58df5e0 | ||
|
|
1261327fa6 | ||
|
|
09c3cc58e4 | ||
|
|
7ef31f84a7 | ||
|
|
85c2b396ce | ||
|
|
0759d72108 | ||
|
|
9b9144f25d | ||
|
|
b677e891b4 | ||
|
|
509f62f68d | ||
|
|
868bf752f3 | ||
|
|
051cdc9670 | ||
|
|
4de5c216ff | ||
|
|
ad2c7304ea | ||
|
|
4dd1309c3f | ||
|
|
541da2740d | ||
|
|
95e2bec215 | ||
|
|
72c96052b4 | ||
|
|
2ab168735f | ||
|
|
85cdf05890 | ||
|
|
bf78b7f815 | ||
|
|
ffb9874d84 | ||
|
|
228cdbe6af | ||
|
|
a303639c9e | ||
|
|
c5133f6088 | ||
|
|
27d368d48d | ||
|
|
085b599f84 | ||
|
|
3b84eb3b70 | ||
|
|
aa877a29d7 | ||
|
|
0abee77e62 | ||
|
|
114fcee2ae | ||
|
|
b488204093 | ||
|
|
322bfbaf57 | ||
|
|
2718f4c333 | ||
|
|
8c342a764b | ||
|
|
697c3f8cb9 | ||
|
|
bb292f501d | ||
|
|
723e54f74e | ||
|
|
1a8c96a3f0 | ||
|
|
a88040e4d5 | ||
|
|
47a0f46ce8 | ||
|
|
66fb352cca | ||
|
|
fd77acc217 | ||
|
|
595d1942cb | ||
|
|
b905933999 | ||
|
|
219a756abc | ||
|
|
2f76f9da89 | ||
|
|
b0b8f573bc | ||
|
|
746aa6cc0f | ||
|
|
fac610d47b | ||
|
|
93209da176 | ||
|
|
35a2a48c47 | ||
|
|
7019f6bea4 | ||
|
|
8bde47280a | ||
|
|
521c6da830 | ||
|
|
5c3e55b5b1 | ||
|
|
22dcca9832 | ||
|
|
db6c0d54cf | ||
|
|
a17abc5557 | ||
|
|
741c6f1179 | ||
|
|
43b285ef7a | ||
|
|
f4bb18b05e | ||
|
|
14885f25b4 | ||
|
|
4e16ea0f0a | ||
|
|
42a696873b | ||
|
|
cfd51db229 | ||
|
|
12f11c97ae | ||
|
|
6a78d11127 | ||
|
|
256ee7a8c7 | ||
|
|
07a51957ee | ||
|
|
37c4470f10 | ||
|
|
4dc7d1c0cd | ||
|
|
f6a85f0b0b | ||
|
|
5b8b660bd0 | ||
|
|
d9cb85df83 | ||
|
|
445e82be75 | ||
|
|
98a12c49dd | ||
|
|
b78cc7e48a | ||
|
|
ac9ce0b3ad | ||
|
|
cf2b814629 | ||
|
|
bbe7a37359 | ||
|
|
d0aa154ea6 | ||
|
|
df4616ae4a | ||
|
|
10f62db9fd | ||
|
|
5c075210d6 | ||
|
|
0cf85b0771 | ||
|
|
fa90047e52 | ||
|
|
b9f64fe19b | ||
|
|
dd072912e8 | ||
|
|
9dbdc75689 | ||
|
|
dce211dbba | ||
|
|
b4e5fa5c1b | ||
|
|
f12fa7e20a | ||
|
|
96f8f1da0c | ||
|
|
db7eec042e | ||
|
|
52aed3f8a1 | ||
|
|
cadd186f1b | ||
|
|
dd9ab16d67 | ||
|
|
d8b6aff23a | ||
|
|
b8aac3f8fc | ||
|
|
4aab97ccb1 | ||
|
|
4cd21f1e07 | ||
|
|
403f0f8c64 | ||
|
|
8c4246f2ad | ||
|
|
1859ba5ec8 | ||
|
|
54d5184255 | ||
|
|
0c5b986fc4 | ||
|
|
7b2cdd618e | ||
|
|
30bb3f1fcb | ||
|
|
b45ea66175 | ||
|
|
543c5034af | ||
|
|
c8aa7afdc6 | ||
|
|
b35bb1b50c | ||
|
|
6341be9cdf | ||
|
|
93a14a93f9 | ||
|
|
d6559e2ac9 | ||
|
|
65e6755b8b | ||
|
|
6ead9750f4 | ||
|
|
6532c7e089 | ||
|
|
8b3d934230 | ||
|
|
e2b7c30811 | ||
|
|
c8bb3c0b71 | ||
|
|
9990e8473c | ||
|
|
d765182bbb | ||
|
|
5a63d1d5a4 | ||
|
|
6d409d27ca | ||
|
|
e9c2885f34 | ||
|
|
ecb8f7362b | ||
|
|
17ccfec358 | ||
|
|
a55bb28069 | ||
|
|
a2e3dc0592 | ||
|
|
df142d4f61 | ||
|
|
fac8edd47a | ||
|
|
9a9da7b077 | ||
|
|
131441846b | ||
|
|
3ff728ab02 | ||
|
|
78bf4ef5fa | ||
|
|
318d0b3976 | ||
|
|
90a14e14f4 | ||
|
|
dea46e8d5a | ||
|
|
7e5ce623fe | ||
|
|
e17805f208 | ||
|
|
d8bcdca55a | ||
|
|
f6f2a3b366 | ||
|
|
d52c7e7a1b | ||
|
|
c4acccac14 | ||
|
|
13001c018c | ||
|
|
1b39efb694 | ||
|
|
0c343cb1c3 | ||
|
|
aead221184 | ||
|
|
16d1c9f5d6 | ||
|
|
0c464b24ad | ||
|
|
a249a630c0 | ||
|
|
f39823eac0 | ||
|
|
69de99636f | ||
|
|
afcff1fa77 | ||
|
|
9b5bae049c | ||
|
|
7a3415166e | ||
|
|
5b2b4bf13c | ||
|
|
4bd67bc298 | ||
|
|
1560749579 | ||
|
|
ed68fd4ab3 | ||
|
|
e9a9dabb49 | ||
|
|
31faafea9d | ||
|
|
6961bd61ca | ||
|
|
726fc53e62 | ||
|
|
c598686bd9 | ||
|
|
cab87e9398 | ||
|
|
680037927d | ||
|
|
ee026386e5 | ||
|
|
60f72f0ff9 | ||
|
|
debc855806 | ||
|
|
49c04ccfc7 | ||
|
|
11ba44870b | ||
|
|
f9a64d24bf | ||
|
|
e1a8dcfcc8 | ||
|
|
1ee0e29974 | ||
|
|
10e32454ef | ||
|
|
8d41e9658f | ||
|
|
086652dd50 | ||
|
|
77a9940461 | ||
|
|
9c1c180ae0 | ||
|
|
06682bd2a9 | ||
|
|
6135f0763b | ||
|
|
307964d874 | ||
|
|
f3dd50de87 | ||
|
|
c776bcc5f6 | ||
|
|
4bbc43d91a | ||
|
|
db8b5dc698 | ||
|
|
2f56c61b47 | ||
|
|
1d340e7664 | ||
|
|
ea62bc0bb2 | ||
|
|
8380c3be02 | ||
|
|
6470bcda19 | ||
|
|
2d51349d1d | ||
|
|
2f2b394d72 | ||
|
|
ba181ae9df | ||
|
|
f62546ec79 | ||
|
|
7c251fe190 | ||
|
|
1c155a0d03 | ||
|
|
8f196db778 | ||
|
|
a85455fb3f | ||
|
|
d0302d1bbe | ||
|
|
d73267df5e | ||
|
|
8bbfb5cda1 | ||
|
|
1e17d5b1cc | ||
|
|
f881917d2f | ||
|
|
99244f51b0 | ||
|
|
606d029ed9 | ||
|
|
e4b9d679fb | ||
|
|
2bf2bd8932 | ||
|
|
4a8a33ea85 | ||
|
|
ac4b83046a | ||
|
|
2a2ac35b98 | ||
|
|
8c744efd56 | ||
|
|
597e59f10d | ||
|
|
3cd07d0b54 | ||
|
|
13259225c2 | ||
|
|
7acd91331c | ||
|
|
0fdaca17a2 | ||
|
|
539c0ed171 | ||
|
|
553365b942 | ||
|
|
100308db02 | ||
|
|
ab967462e6 | ||
|
|
1bc553ea62 | ||
|
|
687ea53616 | ||
|
|
220d9528a3 | ||
|
|
fc7d3f64c0 | ||
|
|
63ab7767a3 | ||
|
|
20894d1c5e | ||
|
|
2f03d2234a | ||
|
|
dadf3d846b | ||
|
|
941a9284b9 | ||
|
|
4ee3820bd6 | ||
|
|
c155df5d79 | ||
|
|
33b70567c8 | ||
|
|
720bf51ba6 | ||
|
|
26bdb72428 | ||
|
|
90c8a1b1cf | ||
|
|
3143dbf3dc | ||
|
|
38d587aaeb | ||
|
|
fe9bafa741 | ||
|
|
8092e18158 | ||
|
|
6ed77f2a27 | ||
|
|
a73688a2be | ||
|
|
e7d327226a | ||
|
|
ae1eb9ccde | ||
|
|
860064c812 | ||
|
|
845901ab01 | ||
|
|
25f7360264 | ||
|
|
78ec7d0fe1 | ||
|
|
a1e9678b69 | ||
|
|
be5d629c13 | ||
|
|
957b399e90 | ||
|
|
5e6c164b9f | ||
|
|
5d9a889190 | ||
|
|
a9acc9c971 | ||
|
|
308010794a | ||
|
|
0ce72cbf9d | ||
|
|
6e52ab285a | ||
|
|
3da4648112 | ||
|
|
1897409476 | ||
|
|
c60d65dd8f | ||
|
|
f29949e14d | ||
|
|
75aa98ddaa | ||
|
|
06909f4f00 | ||
|
|
aca081557a | ||
|
|
a71efacd1e | ||
|
|
871063dab7 | ||
|
|
135662d6b0 | ||
|
|
a69c3c1848 | ||
|
|
50e5244e25 | ||
|
|
1c07f197de | ||
|
|
13c32111a0 | ||
|
|
28c6975732 | ||
|
|
12091fcfb1 | ||
|
|
5598826eaf | ||
|
|
3fea624cca | ||
|
|
9007dd9ab7 | ||
|
|
08166cf330 | ||
|
|
e51b6a6233 | ||
|
|
3887465d80 | ||
|
|
d84f96a571 | ||
|
|
f600e226da | ||
|
|
d775f13a03 | ||
|
|
b630afdeda | ||
|
|
c39c259078 | ||
|
|
a571c4ba33 | ||
|
|
889be6e29d | ||
|
|
d15f64ae5d | ||
|
|
a07117ea55 | ||
|
|
d0dae177cf | ||
|
|
d4db873716 | ||
|
|
de0752fd56 | ||
|
|
4204d4928b | ||
|
|
e2f6cc9c9f | ||
|
|
05de0ecec3 | ||
|
|
b05beb000f | ||
|
|
093abaad29 | ||
|
|
e84e4169f9 | ||
|
|
cd6c5cfd4c | ||
|
|
b855f2fcc2 | ||
|
|
ba69ade024 | ||
|
|
8748b2dc3f | ||
|
|
5f66af3712 | ||
|
|
31ae50b137 | ||
|
|
87e0459fcc | ||
|
|
07e58ae64f | ||
|
|
a88d18148c | ||
|
|
1cf43a9dc9 | ||
|
|
196ce8426b | ||
|
|
6a95c34a81 | ||
|
|
ea0e6d9824 | ||
|
|
14d3da0e18 | ||
|
|
b6b8fb7d73 | ||
|
|
2bca3cd247 | ||
|
|
22a353b8e3 | ||
|
|
743fa73a01 | ||
|
|
a546bfe7d9 | ||
|
|
25deae6cc7 | ||
|
|
62000670e3 | ||
|
|
ac49043fbb | ||
|
|
37a7ca7f14 | ||
|
|
4d6192adcd | ||
|
|
9f1ada898e | ||
|
|
5617521380 | ||
|
|
9835a2545d | ||
|
|
c28cefeeb0 | ||
|
|
afd5b750dc | ||
|
|
2b97b124bd | ||
|
|
d042ab87da | ||
|
|
588303b78d | ||
|
|
36704c5e18 | ||
|
|
21d747cd36 | ||
|
|
ef3494f160 | ||
|
|
2dc6c4a496 | ||
|
|
5834843b8a | ||
|
|
2777a23672 | ||
|
|
32afd92d30 | ||
|
|
762f3afb9d | ||
|
|
7fb2f15a1a | ||
|
|
7456dccd3a | ||
|
|
245f41bb7e | ||
|
|
9bfb844cfa | ||
|
|
d790d3ba3c | ||
|
|
c3dbc92766 | ||
|
|
0bd25f1e17 | ||
|
|
a4cd7411e8 | ||
|
|
bf276f6235 | ||
|
|
d916890a8f | ||
|
|
071cacc9a4 | ||
|
|
33f33323af | ||
|
|
388fae2c47 | ||
|
|
9f878b77e9 | ||
|
|
a547d2aaba | ||
|
|
c013026821 | ||
|
|
96b48a2404 | ||
|
|
9612975c2c | ||
|
|
41bfd45a2e | ||
|
|
bbdcbd1f08 | ||
|
|
6b3c525a9d | ||
|
|
83aed7051c | ||
|
|
77c6e45e65 | ||
|
|
8825393660 | ||
|
|
2b9246c6ad | ||
|
|
a9edb4de28 | ||
|
|
a076ddf38c | ||
|
|
0c809fbb40 | ||
|
|
cafc266e0b | ||
|
|
a3d020eff9 | ||
|
|
8412d94d05 | ||
|
|
d1c5bb956a | ||
|
|
70986bc120 | ||
|
|
f31fe8b865 | ||
|
|
142a9fe530 | ||
|
|
4dd2ad9b27 | ||
|
|
62f7375804 | ||
|
|
543296b5ba | ||
|
|
5fee130d00 | ||
|
|
073facea70 | ||
|
|
dbe3b6eee4 | ||
|
|
df97049647 | ||
|
|
42c5f68362 | ||
|
|
cc19e760cf | ||
|
|
0ff22a16fa | ||
|
|
47360ec906 | ||
|
|
087a9938d2 | ||
|
|
26d8e41a6b | ||
|
|
750ae1d3f3 | ||
|
|
f8a9a7a108 | ||
|
|
eb192137d6 | ||
|
|
c25b464f37 | ||
|
|
710b48d410 | ||
|
|
5e77a8199d | ||
|
|
6637db086b | ||
|
|
a271a55da7 | ||
|
|
6eeec6cbfa | ||
|
|
5e3f3b0400 | ||
|
|
923c402f69 | ||
|
|
4fed0b991c | ||
|
|
ad80acb22a | ||
|
|
bd8414f8ea | ||
|
|
2eb467c788 | ||
|
|
c436e29b89 | ||
|
|
44219d5e91 | ||
|
|
b9de3270f6 | ||
|
|
590d6faeb0 | ||
|
|
62e96e9a58 | ||
|
|
1c818ef0a0 | ||
|
|
d6ce2e3671 | ||
|
|
85b6a52662 | ||
|
|
0246082b9b | ||
|
|
3b031c6ba5 | ||
|
|
74740ca50b | ||
|
|
631baa7120 | ||
|
|
657d6edff7 | ||
|
|
737c5a9549 | ||
|
|
c5fb56f90f | ||
|
|
4cd9abe632 | ||
|
|
b67e7df38e | ||
|
|
f28c746b6b | ||
|
|
ab95027fc6 | ||
|
|
ed3bc4ab63 | ||
|
|
68064f1aa6 | ||
|
|
475ac76a5f | ||
|
|
79d4f8674c | ||
|
|
e42eed4d4c | ||
|
|
4a7042e847 | ||
|
|
7f36923eb4 | ||
|
|
2ca8d69126 | ||
|
|
70367d70c8 | ||
|
|
e068d62ac6 | ||
|
|
e6389ff5a1 | ||
|
|
b46cf57d98 | ||
|
|
6f59d71e07 | ||
|
|
f9130f42a2 | ||
|
|
faf2eeaa99 | ||
|
|
1c7de0b4ac | ||
|
|
58487e484f | ||
|
|
104075f3e0 | ||
|
|
b8097eaf2e | ||
|
|
5eb0cbc887 | ||
|
|
1a4a6f3807 | ||
|
|
a012b25335 | ||
|
|
46e8b137e9 | ||
|
|
4b25c5e8d6 | ||
|
|
2fdbae3e1f | ||
|
|
87e06793c2 | ||
|
|
8cc451a2e2 | ||
|
|
723c2c7fa9 | ||
|
|
4dd2c5cdd5 | ||
|
|
bdc257b40e | ||
|
|
4728f7c697 | ||
|
|
1c4c0fe8a1 | ||
|
|
360274a6e9 | ||
|
|
07228ff56a | ||
|
|
a61f153df7 | ||
|
|
34e91850d9 | ||
|
|
ba8e579e9b | ||
|
|
072e39c9cf | ||
|
|
8dc3f3b21a | ||
|
|
3a21241248 | ||
|
|
5c75096bcd | ||
|
|
a43b0f5253 | ||
|
|
d93271e86d | ||
|
|
4a6df9f961 | ||
|
|
a43ae2369b | ||
|
|
9a049de859 | ||
|
|
58b8398aa0 | ||
|
|
645751f680 | ||
|
|
2d3b6879f5 | ||
|
|
26c0924461 | ||
|
|
d4f801a8e9 | ||
|
|
cb1082c58c | ||
|
|
8406864963 | ||
|
|
85ef034fd0 | ||
|
|
59141f62bb | ||
|
|
d68cadba7b | ||
|
|
1207fd1f16 | ||
|
|
8aa61e230c | ||
|
|
2c7bda8a3b | ||
|
|
d58c5dd398 | ||
|
|
171da7a347 | ||
|
|
3fd70a769a | ||
|
|
4280f84535 | ||
|
|
c3d9c32615 | ||
|
|
a938b609b9 | ||
|
|
d3c7fac606 | ||
|
|
fea3f6cc72 | ||
|
|
aee5966e1c | ||
|
|
95e53ac0a0 | ||
|
|
5d11759f7d | ||
|
|
829616534e | ||
|
|
863f4d8366 | ||
|
|
bdd0c3686d | ||
|
|
91769d536d | ||
|
|
9500343d85 | ||
|
|
ef053035d0 | ||
|
|
35faafb32c | ||
|
|
f9fd868b99 | ||
|
|
8b903626c2 | ||
|
|
faf0c950fe | ||
|
|
4ecd325371 | ||
|
|
021519f295 | ||
|
|
e83685d667 | ||
|
|
81a198a76a | ||
|
|
5771d67202 | ||
|
|
b2b7974ba0 | ||
|
|
f59ca94416 | ||
|
|
22ff0d80ce | ||
|
|
5a22a0c27d | ||
|
|
287ef181ba | ||
|
|
bc63810ebd | ||
|
|
92cdea123e | ||
|
|
e4c7e343c8 | ||
|
|
6b75be183d | ||
|
|
718f6d9cef | ||
|
|
2ee43c403c | ||
|
|
24fa3f5e7b | ||
|
|
bbbda7f812 | ||
|
|
e958900380 | ||
|
|
74926c1dd3 | ||
|
|
2654888782 | ||
|
|
49597b0e9c | ||
|
|
b5ecfb4c9a | ||
|
|
07fa3764ef | ||
|
|
5acc77a163 | ||
|
|
0709878b4c | ||
|
|
662e477028 | ||
|
|
b7b7c381ee | ||
|
|
995cd95474 | ||
|
|
fe8a13f76f | ||
|
|
9252432bc0 | ||
|
|
f057f6768f | ||
|
|
806bf0be8d | ||
|
|
958506a108 | ||
|
|
e8fd771b91 | ||
|
|
fa4178fefa | ||
|
|
1af59d31b9 | ||
|
|
20758cef30 | ||
|
|
272938529d | ||
|
|
a67b7266ed | ||
|
|
75c8aecffa | ||
|
|
f26159a0e3 | ||
|
|
675e8667c2 | ||
|
|
a1a26b70bc | ||
|
|
34a7f86a07 | ||
|
|
e7311ac2f3 | ||
|
|
8d9ecc0c62 | ||
|
|
f01b991108 | ||
|
|
f80736c3d7 | ||
|
|
2c7f69cf85 | ||
|
|
348ecc1118 | ||
|
|
a9678f0ae0 | ||
|
|
461f298d2c | ||
|
|
068de7cf40 | ||
|
|
d04eb87c4f | ||
|
|
8af68db965 | ||
|
|
1cf632e98b | ||
|
|
58c11c3128 | ||
|
|
efcda95dda | ||
|
|
80d2028bac | ||
|
|
215213fc2c | ||
|
|
99d32dc0b4 | ||
|
|
0998097253 | ||
|
|
c17be5af6b | ||
|
|
b376536a3b | ||
|
|
e7edc02647 | ||
|
|
69bf835059 | ||
|
|
b97ffddfe8 | ||
|
|
6407b7c591 | ||
|
|
e14cd92d59 | ||
|
|
73cadd1798 | ||
|
|
fb9840f1f8 | ||
|
|
492aaa3375 | ||
|
|
33c5da700d | ||
|
|
48d3af7d9a | ||
|
|
9b3470eabd | ||
|
|
86a505b4f3 | ||
|
|
ed6c6296eb | ||
|
|
b27a41812f | ||
|
|
6c933d2b77 | ||
|
|
fb5610f9bd | ||
|
|
7adbd00811 | ||
|
|
1c91d19163 | ||
|
|
f491135318 | ||
|
|
a7ced00520 | ||
|
|
be3359fc67 | ||
|
|
69ed35ed71 | ||
|
|
280d35a053 | ||
|
|
eca6b9f0af | ||
|
|
aa5d05eaa4 | ||
|
|
15735552f4 | ||
|
|
d6d9dc9d95 | ||
|
|
dc57966dc3 | ||
|
|
cc9345e703 | ||
|
|
3fb8f3ec95 | ||
|
|
04ed50fb0f | ||
|
|
c9553411bb | ||
|
|
62221adf55 | ||
|
|
a6bf4746c6 | ||
|
|
72637d00e8 | ||
|
|
27d4b15925 | ||
|
|
7a77767e66 | ||
|
|
1b26621860 | ||
|
|
3db5f4d0aa | ||
|
|
b2a6e327bf | ||
|
|
9aec5fe907 | ||
|
|
fc3e0dfcd1 | ||
|
|
6513ff92a7 | ||
|
|
a0eb6d0976 | ||
|
|
7530770842 | ||
|
|
11ea72e240 | ||
|
|
c98330909a | ||
|
|
bec6fa4ad7 | ||
|
|
ac7ce73526 | ||
|
|
4c6619e6c5 | ||
|
|
e8121fdc11 | ||
|
|
21f17270a1 | ||
|
|
423cd5900e | ||
|
|
b9f535cd49 | ||
|
|
c731a82b71 | ||
|
|
e6fad97edc | ||
|
|
e228144159 | ||
|
|
9431a7b022 | ||
|
|
cd041f8574 | ||
|
|
8ba3378096 | ||
|
|
225984822d | ||
|
|
01b68db30e | ||
|
|
33fdaa5b6d | ||
|
|
70495aada1 | ||
|
|
f243f615ef | ||
|
|
6a1f5667f9 | ||
|
|
fab5f58ee0 | ||
|
|
55be8e6f52 | ||
|
|
c75b9b0d12 | ||
|
|
9b85446808 | ||
|
|
fd5d42836f | ||
|
|
4eaa82fd22 | ||
|
|
a497cc46f9 | ||
|
|
178f737971 | ||
|
|
74963bce9d | ||
|
|
33a4dbe1e5 | ||
|
|
60f32d0bce | ||
|
|
dce36d3e55 | ||
|
|
807c72b2f1 | ||
|
|
4f393553f4 | ||
|
|
91afc7b23c | ||
|
|
36d158e13e | ||
|
|
02a97b5985 | ||
|
|
b980545012 | ||
|
|
8aad152b23 | ||
|
|
74dbaade6f | ||
|
|
2deb5b7fec | ||
|
|
53677172f2 | ||
|
|
bef0ccf42a | ||
|
|
2fd5182608 | ||
|
|
7ad7caa2ae | ||
|
|
6d1710c74f | ||
|
|
233b8d0129 | ||
|
|
f55bdf07d3 | ||
|
|
6c2b532ae3 | ||
|
|
2539f294e4 | ||
|
|
b6a3ce9305 | ||
|
|
b07495aae9 | ||
|
|
686a53215d | ||
|
|
6190da1300 | ||
|
|
6fd7d8191e | ||
|
|
2ccd1cc9f0 | ||
|
|
8167bdd978 | ||
|
|
dfb3e34f7b | ||
|
|
45ee75055e | ||
|
|
5da4e321c0 | ||
|
|
e8519fecb4 | ||
|
|
ff35aa07dc | ||
|
|
06c172838c | ||
|
|
1543dd85b5 | ||
|
|
f37a1026f9 | ||
|
|
91fb7fa3d8 | ||
|
|
7b70153068 | ||
|
|
7e096ee2c5 | ||
|
|
86a90daf1b | ||
|
|
42f7df9681 | ||
|
|
2edad38c7c | ||
|
|
296ee4961e | ||
|
|
b1becddf11 | ||
|
|
667edcd9d0 | ||
|
|
b4e75bedf0 | ||
|
|
5482ef5451 | ||
|
|
a3afd5178c | ||
|
|
f1285a6dfd | ||
|
|
cf7c1afb93 | ||
|
|
f254831aa6 | ||
|
|
bd40c8649c | ||
|
|
7c53df2ed1 | ||
|
|
5ca6026787 | ||
|
|
483daa5882 | ||
|
|
e2bc92d128 | ||
|
|
5ffe3773d4 | ||
|
|
a7c68018a2 | ||
|
|
5ffb82993e | ||
|
|
07add0bd91 | ||
|
|
9a9b6fa326 | ||
|
|
ba43ec5759 | ||
|
|
008a9560fe | ||
|
|
6ff01cc72c | ||
|
|
e140a28073 | ||
|
|
de61c3b962 | ||
|
|
c46fc4531b | ||
|
|
065a9ed10f | ||
|
|
e44c0254f7 | ||
|
|
13f9f0315f | ||
|
|
1532ffe215 | ||
|
|
b24cbc68ba | ||
|
|
976fdd76c1 | ||
|
|
bbda335e02 | ||
|
|
031410c72b | ||
|
|
710def8e38 | ||
|
|
c0bda1b103 | ||
|
|
0e87ce4680 | ||
|
|
b4d594eeff | ||
|
|
ce09379bae | ||
|
|
b27fb64317 | ||
|
|
099455db25 | ||
|
|
3146bf51e6 | ||
|
|
b24a5e0662 | ||
|
|
e52ac0b187 | ||
|
|
eaa1590866 | ||
|
|
071af004bd | ||
|
|
23ab4e5e5f | ||
|
|
8e563cbccd | ||
|
|
1aee89f5ea | ||
|
|
d2dd6f7c70 | ||
|
|
e9a544fa98 | ||
|
|
fb547260d1 | ||
|
|
2065e32904 | ||
|
|
ac15581c56 | ||
|
|
9e2e882157 | ||
|
|
99ded56047 | ||
|
|
65386f52f0 | ||
|
|
5b8dce7456 | ||
|
|
de938eb621 | ||
|
|
83cc6c0835 | ||
|
|
304d78a4c8 | ||
|
|
347590751c | ||
|
|
fe4b1f96f1 | ||
|
|
9de984f7f8 | ||
|
|
b6cb9b853a | ||
|
|
50b930f283 | ||
|
|
cbeb809798 | ||
|
|
ea626368a0 | ||
|
|
c81747dd15 | ||
|
|
f8810d7caf | ||
|
|
92f54f0b59 | ||
|
|
ddce544b53 | ||
|
|
21fb7eea82 | ||
|
|
fd7eb43366 | ||
|
|
7d0ca894a4 | ||
|
|
a1add27c4c | ||
|
|
fc8194ee1e | ||
|
|
8ffcdb73e8 | ||
|
|
111528e51c | ||
|
|
5628dcf47e | ||
|
|
fb4f02cd38 | ||
|
|
d1be643c0d | ||
|
|
c9761bf6af | ||
|
|
4a47265224 | ||
|
|
f0f3017a76 | ||
|
|
d3f0b62348 | ||
|
|
6a53fb33da | ||
|
|
dcaf299864 | ||
|
|
ab2e00bc38 | ||
|
|
48d02bef15 | ||
|
|
1d67aa7bf2 | ||
|
|
e56066f721 | ||
|
|
5e3844ac13 | ||
|
|
cb4f5d454b | ||
|
|
e5c6fe1bb2 | ||
|
|
bf65a9732c | ||
|
|
1388b3219a | ||
|
|
d9e8ce22cb | ||
|
|
c85ba73371 | ||
|
|
224944528f | ||
|
|
cdcd3e77b3 | ||
|
|
ed5058a363 | ||
|
|
a670ff6d3e | ||
|
|
32f6d34904 | ||
|
|
d3ae05506d | ||
|
|
96f4394dce | ||
|
|
35567e6507 | ||
|
|
ae37e25452 | ||
|
|
c4537fe6f6 | ||
|
|
677334f5a9 | ||
|
|
3d9652ae35 | ||
|
|
a9130cb99c | ||
|
|
b1d60b5c85 | ||
|
|
99a05c56ad | ||
|
|
cfc65397b3 | ||
|
|
cd8fd1ef42 | ||
|
|
6350089e51 | ||
|
|
79f2f8cddc | ||
|
|
39fa949345 | ||
|
|
e1d7a5cbf5 | ||
|
|
f3cefaf043 | ||
|
|
b3460f3f54 | ||
|
|
8e5a67ed9f | ||
|
|
cccbcf510a | ||
|
|
a1e680fec7 | ||
|
|
1b58bd64ff | ||
|
|
196de8c758 | ||
|
|
222b777552 | ||
|
|
b5c206d3ae | ||
|
|
17ace95268 | ||
|
|
779d73f94b | ||
|
|
73307bf2e7 | ||
|
|
7623c1c5cb | ||
|
|
de568c84c2 | ||
|
|
1f5b9c6185 | ||
|
|
a5f8fd774d | ||
|
|
cc5443c38e | ||
|
|
8a86460b8f | ||
|
|
7ae9e49f51 | ||
|
|
c682d087d9 | ||
|
|
57da5c0841 | ||
|
|
a224722ae2 | ||
|
|
283ef5b163 | ||
|
|
09a188bfd9 | ||
|
|
10f086854b | ||
|
|
d67c6c37e3 | ||
|
|
136725dfb1 | ||
|
|
438895842c | ||
|
|
82b8f4f1ce | ||
|
|
0705f42cf8 | ||
|
|
cadc67ea40 | ||
|
|
054e9ecaae | ||
|
|
84fe3bfa87 | ||
|
|
2ef8403bfa | ||
|
|
1d3b2baee7 | ||
|
|
86de876b24 | ||
|
|
8a9f04f7fe | ||
|
|
98bd4dfe04 | ||
|
|
8e0e4d7c04 | ||
|
|
a5e8269c72 | ||
|
|
0acc88cde5 | ||
|
|
1e0ad1f6bf | ||
|
|
4abcb08cc9 | ||
|
|
81e7833711 | ||
|
|
3392cbbd91 | ||
|
|
e7b211f2c0 | ||
|
|
6c5bc9b4a3 | ||
|
|
cd2f65aafc | ||
|
|
3ee5093b03 | ||
|
|
6e2ad6860f | ||
|
|
8610eb84c6 | ||
|
|
a2e008347c | ||
|
|
a1ef0159e3 | ||
|
|
1c5f76635a | ||
|
|
e2a0fd7a28 | ||
|
|
5869a4ba2d | ||
|
|
ac9a93261b | ||
|
|
4b79f0047d | ||
|
|
6a789b660a | ||
|
|
0d8e44a079 | ||
|
|
f097952b42 | ||
|
|
224d511616 | ||
|
|
050c6cc4b0 | ||
|
|
bc2d23ff0d | ||
|
|
2939fadd6a | ||
|
|
ef260377c3 | ||
|
|
b9213df64b | ||
|
|
aa7694047b | ||
|
|
e2bc63217a | ||
|
|
6c5b8bcf9d | ||
|
|
e425fe3f97 | ||
|
|
6507993972 | ||
|
|
f081696f62 | ||
|
|
09157c3130 | ||
|
|
00626b1633 | ||
|
|
7e0cdbe502 | ||
|
|
ca08902d71 | ||
|
|
fad0e834d5 | ||
|
|
dc76eb6139 | ||
|
|
55e113c7a7 | ||
|
|
b62f5e079e | ||
|
|
ac1eaff6ec | ||
|
|
45f6129ae7 | ||
|
|
f3503e0026 | ||
|
|
826a654c95 | ||
|
|
08754e6ce7 | ||
|
|
3843972b05 | ||
|
|
37862f0f20 | ||
|
|
1f184f4aec | ||
|
|
db5a691693 | ||
|
|
48693250a4 | ||
|
|
570dcb6309 | ||
|
|
19e43087a8 | ||
|
|
fe0b6a1117 | ||
|
|
72851647ca | ||
|
|
1c90400081 | ||
|
|
672e18cac9 | ||
|
|
e939d667d9 | ||
|
|
8bb5a565cd | ||
|
|
7562c5751c | ||
|
|
e6e7d6dbd6 | ||
|
|
fe60c52c70 | ||
|
|
93f4590453 | ||
|
|
1098d271b8 | ||
|
|
51168169e7 | ||
|
|
d256a0e98f | ||
|
|
6717325c3f | ||
|
|
c4a0571e7a | ||
|
|
e4a06da14e | ||
|
|
36d6ead65c | ||
|
|
7eae3bc8c5 | ||
|
|
24b2198668 | ||
|
|
d29be0f460 | ||
|
|
8f93c36466 | ||
|
|
3092e5a8a5 | ||
|
|
55f95b3ac9 | ||
|
|
16218c8680 | ||
|
|
c11345c4d9 | ||
|
|
e31f0b8b0c | ||
|
|
7dd3b72a8c | ||
|
|
aeccccb33d | ||
|
|
b46a27c554 | ||
|
|
13bc15c05d | ||
|
|
cb1e644230 | ||
|
|
9bc0fada5c | ||
|
|
82e261ad33 | ||
|
|
cae2811762 | ||
|
|
09112c6869 | ||
|
|
77aaf1baee | ||
|
|
6626c2d00d | ||
|
|
019aea3d63 | ||
|
|
21439108ed | ||
|
|
754b30a7a6 | ||
|
|
89d5d480d7 | ||
|
|
fbcacb590b | ||
|
|
f97ad2b2ee | ||
|
|
e70f7141be | ||
|
|
7a08ce7ece | ||
|
|
86486336ec | ||
|
|
ec2a2522aa | ||
|
|
556f9ee39c | ||
|
|
7dad662d69 | ||
|
|
2daa3eb61f | ||
|
|
3079aa1f9d | ||
|
|
28f9a0a900 | ||
|
|
a6bb3cf60a | ||
|
|
004da5d385 | ||
|
|
0368282486 | ||
|
|
4404f20cf4 | ||
|
|
faca8bc02a | ||
|
|
5e93c05095 | ||
|
|
0f4f04eaa4 | ||
|
|
2e55d561d3 | ||
|
|
76a9049739 | ||
|
|
27bfcda20d | ||
|
|
c6d1d360a3 | ||
|
|
afc1236b06 | ||
|
|
bedd5f00f8 | ||
|
|
36239895bd | ||
|
|
738583e3d4 | ||
|
|
c513478c31 | ||
|
|
a944927b56 | ||
|
|
315f9d98f6 | ||
|
|
f087518e7a | ||
|
|
b9a8b0d146 | ||
|
|
4d15db0134 | ||
|
|
0d1a54262c | ||
|
|
e7ef7f5159 | ||
|
|
3dc989bccb | ||
|
|
75d46efd23 | ||
|
|
b83392cb04 | ||
|
|
7640d333f4 | ||
|
|
c880099deb | ||
|
|
42f5ecd4a1 | ||
|
|
733989a284 | ||
|
|
493f74d94d | ||
|
|
3b71e2abef | ||
|
|
30cad0c5f1 | ||
|
|
3a387643b3 | ||
|
|
e6b37703da | ||
|
|
990f473bb3 | ||
|
|
cf1de78205 | ||
|
|
ccea6dd74b | ||
|
|
166b490eed | ||
|
|
efd871ad2f | ||
|
|
b78896d64e | ||
|
|
e753c924ef | ||
|
|
9dc7b5a6d9 | ||
|
|
f5d21c9cdb | ||
|
|
6ce13646da | ||
|
|
151653dd98 | ||
|
|
619cfe6a1c | ||
|
|
8acf996d90 | ||
|
|
15e432204e | ||
|
|
4b1630e1ec | ||
|
|
41e63031b0 | ||
|
|
bb86f27fdf | ||
|
|
5cf4f62610 | ||
|
|
8e10a14866 | ||
|
|
94f850a588 | ||
|
|
db9997a106 | ||
|
|
0cbfb610f2 | ||
|
|
f901cd042b | ||
|
|
5719207dfa | ||
|
|
a84fbbe327 | ||
|
|
3882c11450 | ||
|
|
08f77c2b60 | ||
|
|
6269abbcc8 | ||
|
|
93c97972b9 | ||
|
|
ac61d43720 | ||
|
|
22ebe0e58f | ||
|
|
1958f78cc1 | ||
|
|
f072cbbba7 | ||
|
|
1a5b66b78d | ||
|
|
bea5973e0c | ||
|
|
0366dcf604 | ||
|
|
8211d4a1c2 | ||
|
|
fc2154ee92 | ||
|
|
76f85e6f7b | ||
|
|
81ce684b35 | ||
|
|
42bd888946 | ||
|
|
6bea346c41 | ||
|
|
8d23706354 | ||
|
|
62bfb1a273 | ||
|
|
38e86af75c | ||
|
|
607c2c5ba2 | ||
|
|
85f58eb082 | ||
|
|
a7ee64a25b | ||
|
|
2a58f22649 | ||
|
|
f066bb7716 | ||
|
|
4e3d182189 | ||
|
|
205fba74cf | ||
|
|
a9bcf8d50d | ||
|
|
54383b017e | ||
|
|
438b7b7bd0 | ||
|
|
27a40a9843 | ||
|
|
c7b0e9b05b | ||
|
|
356c829b76 | ||
|
|
ffbb5c48ed | ||
|
|
6b6c7b0920 | ||
|
|
de332a16d1 | ||
|
|
84ab3ee3af | ||
|
|
ce0d896492 | ||
|
|
eae9cb4afe | ||
|
|
459a812a54 | ||
|
|
7743647460 | ||
|
|
352ec364f0 | ||
|
|
54f684b7b3 | ||
|
|
1943b158fe | ||
|
|
a36eeb5261 | ||
|
|
a8b00faba1 | ||
|
|
bf73d0f905 | ||
|
|
193ffa06d9 | ||
|
|
9d176e35d4 | ||
|
|
cd2e8c6ef1 | ||
|
|
8461d71b52 | ||
|
|
e31cdf0df9 | ||
|
|
6f41791ea6 | ||
|
|
0bacbcd04e | ||
|
|
ffe689363f | ||
|
|
48d7fedbc0 | ||
|
|
75dff64450 | ||
|
|
f0b58c6f24 | ||
|
|
f3661b19c0 | ||
|
|
2f5106c97f | ||
|
|
0c19418e84 | ||
|
|
60c077c790 | ||
|
|
7aaa4dda22 | ||
|
|
109b3700b5 | ||
|
|
71fecf4d1f | ||
|
|
0f75c79665 | ||
|
|
9bcb01a75e | ||
|
|
4f29034f11 | ||
|
|
567bf445bf | ||
|
|
28a0c46ca7 | ||
|
|
7cc33d0f27 | ||
|
|
5fba8d773c | ||
|
|
36cd73df51 | ||
|
|
6f20889f00 | ||
|
|
8e408725e9 | ||
|
|
d053797340 | ||
|
|
c8d0f947d2 | ||
|
|
86e036c393 | ||
|
|
7652a2986b | ||
|
|
b1480167be | ||
|
|
e118e958f7 | ||
|
|
ee61dfe087 | ||
|
|
9231f420c1 | ||
|
|
0f92d021a1 | ||
|
|
cbdc3194cc | ||
|
|
993df0fd28 | ||
|
|
4294fdb0b2 | ||
|
|
082523bcea | ||
|
|
5d13c13821 | ||
|
|
21ef656e24 | ||
|
|
3c4fe8cc04 | ||
|
|
95ebd57b25 | ||
|
|
84e09aa8dd | ||
|
|
6cce3d2996 | ||
|
|
77b34fa961 | ||
|
|
024d978ae5 | ||
|
|
e0f55b9295 | ||
|
|
ccd83748f7 | ||
|
|
291ee9f86a | ||
|
|
59e4d7f0f5 | ||
|
|
4647448399 | ||
|
|
7dfe841876 | ||
|
|
34db35c36d | ||
|
|
3e9738dc66 | ||
|
|
2ecf57cdd9 | ||
|
|
c8b602038e | ||
|
|
e384fa226e | ||
|
|
cbb595ba83 | ||
|
|
fdeec0307e | ||
|
|
f084bbbf35 | ||
|
|
20d69b957f | ||
|
|
7de0a621e3 | ||
|
|
3441ea9844 | ||
|
|
83752e9349 | ||
|
|
8fdfe85b5f | ||
|
|
d4d9a85ad8 | ||
|
|
6f22452b54 | ||
|
|
a4a37d7a19 | ||
|
|
d1b1a8e490 | ||
|
|
104fe124df | ||
|
|
5bdbd74d59 | ||
|
|
e621c24270 | ||
|
|
554888318a | ||
|
|
49aaf98a7f | ||
|
|
ccdb94b06c | ||
|
|
6f7bfa71a9 | ||
|
|
fb3564fbe7 | ||
|
|
e1e365e16e | ||
|
|
5b5a18db2a | ||
|
|
3fa4dad418 | ||
|
|
0756607e32 | ||
|
|
a03be5a8a6 | ||
|
|
39c5bb95d2 | ||
|
|
4d33b089da | ||
|
|
58996b841a | ||
|
|
df03a7b3f8 | ||
|
|
ac03871174 | ||
|
|
2a086d20c6 | ||
|
|
d5cfa6d4dc | ||
|
|
f415167e59 | ||
|
|
9477db2363 | ||
|
|
8d11577ff2 | ||
|
|
037d1d9ad1 | ||
|
|
619ef2b341 | ||
|
|
f06fe76d35 | ||
|
|
eb86fdfbea | ||
|
|
c7712e2ef0 | ||
|
|
61fa770644 | ||
|
|
334bd73792 | ||
|
|
090ce262c4 | ||
|
|
d551d40886 | ||
|
|
aecfcaa8a2 | ||
|
|
61a3028788 | ||
|
|
11d048b8e3 | ||
|
|
d814a01f2a | ||
|
|
4c0916df79 | ||
|
|
e4844b9936 | ||
|
|
60aa8c527b | ||
|
|
9f7c3b8ea6 | ||
|
|
9f4f1bab39 | ||
|
|
73bd6af0f9 | ||
|
|
2aa54c5365 | ||
|
|
bc8542503d | ||
|
|
a6aea4ba58 | ||
|
|
0b41faec89 | ||
|
|
e12bd00b47 | ||
|
|
50eac9b49e | ||
|
|
e0405f1781 | ||
|
|
680d03e4d6 | ||
|
|
b4fc2e38ab | ||
|
|
16639f9d71 | ||
|
|
22f2605e25 | ||
|
|
69476b4f21 | ||
|
|
fdf92c5f3b | ||
|
|
5e22c83baa | ||
|
|
eed1a3c239 | ||
|
|
94c037821b | ||
|
|
e38e8eb636 | ||
|
|
bef8c83388 | ||
|
|
2e98324486 | ||
|
|
6e2d7445c5 | ||
|
|
90e7ace980 | ||
|
|
b0ff3bc7a3 | ||
|
|
06301e279c | ||
|
|
6d6f274648 | ||
|
|
9acefcb256 | ||
|
|
e4d0293a31 | ||
|
|
ae77542a11 | ||
|
|
980187f856 | ||
|
|
2b0a127fa5 | ||
|
|
327a8e6c59 | ||
|
|
d11e2724c4 | ||
|
|
f768ca3a2d | ||
|
|
947e902288 | ||
|
|
07c5d3277f | ||
|
|
d1d44a4fde | ||
|
|
6837a67234 | ||
|
|
3436a646b5 | ||
|
|
aed0af1e00 | ||
|
|
d6eb74262a | ||
|
|
403aa8c5a1 | ||
|
|
0d7ee2b014 | ||
|
|
2f5fd91bd8 | ||
|
|
cd1148c6aa | ||
|
|
cfd26f53f0 | ||
|
|
69ad5671ed | ||
|
|
f9e0f0d257 | ||
|
|
98f3135ad3 | ||
|
|
8c9c3a91e6 | ||
|
|
7f3518333d | ||
|
|
f1f871f103 | ||
|
|
6387b52896 | ||
|
|
077e95da85 | ||
|
|
7f6e1fbc8d | ||
|
|
06827cfcf1 | ||
|
|
6dc3097998 | ||
|
|
cd35271698 | ||
|
|
7b575f61d0 | ||
|
|
400e3ea649 | ||
|
|
622d871587 | ||
|
|
63d04645c7 | ||
|
|
3f4908c363 | ||
|
|
dd0f1d9d2d | ||
|
|
b31d171ae8 | ||
|
|
085f06594c | ||
|
|
ce3d41052c | ||
|
|
44f3df697f | ||
|
|
28c75b2283 | ||
|
|
b6e56119c4 | ||
|
|
a0e29b5435 | ||
|
|
65ff72cdf8 | ||
|
|
1da0956331 | ||
|
|
983078992d | ||
|
|
81059f80d8 | ||
|
|
a261442279 | ||
|
|
2f41eba100 | ||
|
|
91a6fb81c1 | ||
|
|
c95f0820bc | ||
|
|
830a1bd130 | ||
|
|
5c5ea8a254 | ||
|
|
5222c684d3 | ||
|
|
5798faa13b | ||
|
|
a062693875 | ||
|
|
6887d5d347 | ||
|
|
39c9669445 | ||
|
|
44565e22a0 | ||
|
|
ddec10d494 | ||
|
|
758e969cb6 | ||
|
|
a9a6a5041b | ||
|
|
59dd8ffbc6 | ||
|
|
8f9fe1b11a | ||
|
|
9ed0152cf2 | ||
|
|
250332a8d5 | ||
|
|
39825c6622 | ||
|
|
cee3070ca4 | ||
|
|
cd08e5c7da | ||
|
|
dd4beea44c | ||
|
|
5b48d59769 | ||
|
|
4dec12fcfc | ||
|
|
57ad3aca8e | ||
|
|
f677f42be7 | ||
|
|
a5760670ef | ||
|
|
f04a3ec201 | ||
|
|
f402c5fe3c | ||
|
|
9352e25392 | ||
|
|
1c90b0c19d | ||
|
|
cd776ff1a8 | ||
|
|
40a587bbaf | ||
|
|
818d729d8b | ||
|
|
dd5daa0767 | ||
|
|
ef5090c397 | ||
|
|
cf073de36c | ||
|
|
f16054639b | ||
|
|
b0983e8708 | ||
|
|
0febb218ed | ||
|
|
dfcfeeb550 | ||
|
|
820debf45a | ||
|
|
c19292c036 | ||
|
|
4ee81e6a3d | ||
|
|
87a8a3e22f | ||
|
|
e9125ef8e4 | ||
|
|
6ff394bcc9 | ||
|
|
7ce96585f5 | ||
|
|
41cc31c124 | ||
|
|
605af61a0f | ||
|
|
77e163e5b8 | ||
|
|
0e00b9009d | ||
|
|
a6dd998d31 | ||
|
|
cdd0ccc67a | ||
|
|
a918821868 | ||
|
|
c637b96f10 | ||
|
|
44b9197354 | ||
|
|
7a8f96b1dd | ||
|
|
f4f21f462d | ||
|
|
d09b8b5bd7 | ||
|
|
ee327db517 | ||
|
|
90a61b6bab | ||
|
|
00583bc4a8 | ||
|
|
2d06a8e880 | ||
|
|
e1a434edbc | ||
|
|
6b3b1cbd99 | ||
|
|
4dd861ee23 | ||
|
|
4f0f81a047 | ||
|
|
e3908c8de6 | ||
|
|
81c49fba03 | ||
|
|
eb174d5ba3 | ||
|
|
4c899e9c5a | ||
|
|
00b0f6ad51 | ||
|
|
fe1e467a49 | ||
|
|
73cb538d72 | ||
|
|
64b9e7fd48 | ||
|
|
12de22d3bb | ||
|
|
821bc6d777 | ||
|
|
6e66a5b77b | ||
|
|
cf5c10bbe6 | ||
|
|
4e30e74739 | ||
|
|
42890b9acf | ||
|
|
33a27379f9 | ||
|
|
0cf57cc7ca | ||
|
|
68fcbaf4c8 | ||
|
|
9c83d3c78c | ||
|
|
676dfabc91 | ||
|
|
60e6d1d61b | ||
|
|
975e275030 | ||
|
|
afcd5670e3 | ||
|
|
b17b53955c | ||
|
|
ff2b427cc1 | ||
|
|
5761800197 | ||
|
|
0eebacc521 | ||
|
|
4a5528697d | ||
|
|
d38034bb5c | ||
|
|
a62fe30546 | ||
|
|
b3fe3e8b3d | ||
|
|
25ebb427da | ||
|
|
c5bde10b4f | ||
|
|
e582e893cc | ||
|
|
833ec3d3cd | ||
|
|
3d446d3266 | ||
|
|
e660229c40 | ||
|
|
5489dec28d | ||
|
|
ee6e0e16cb | ||
|
|
eb1733609a | ||
|
|
8a6b4db19f | ||
|
|
df43b6a05c | ||
|
|
e2e66404d5 | ||
|
|
3ecb19d0f1 | ||
|
|
fd02c87fa2 | ||
|
|
63ac81c8f5 | ||
|
|
557bee61d5 | ||
|
|
3adca3c2fa | ||
|
|
39abd3ecb4 | ||
|
|
a4f4fc50b9 | ||
|
|
7bf638b0de | ||
|
|
56662a703c | ||
|
|
8b5f47d3a3 | ||
|
|
8bfb88840b | ||
|
|
593bb5a8a7 | ||
|
|
822ac7b100 | ||
|
|
cc70c5c67d | ||
|
|
ae7e1a22cb | ||
|
|
a289dcb9ee | ||
|
|
023b9c1e7e | ||
|
|
4c61662644 | ||
|
|
ad1b6ef0ac | ||
|
|
16944b5397 | ||
|
|
ed5c6be2f1 | ||
|
|
30cb082932 | ||
|
|
645554d12f | ||
|
|
72e44d596f | ||
|
|
8f2ca8f085 | ||
|
|
6725c2afa1 | ||
|
|
e9d4b73cc3 | ||
|
|
212b0faf0c | ||
|
|
929ec70512 | ||
|
|
6cd5d73607 | ||
|
|
80a7e1ea7d | ||
|
|
0d3b26b3aa | ||
|
|
52acea7b1f | ||
|
|
e9b49a43e2 | ||
|
|
4fa5538e2b | ||
|
|
84e74173de | ||
|
|
6cdb2a4896 | ||
|
|
d8bef3270d | ||
|
|
a33db8fe6f | ||
|
|
1c3f5517fa | ||
|
|
10972da060 | ||
|
|
a38f02541d | ||
|
|
fdba76ba47 | ||
|
|
f900ab0121 | ||
|
|
f80ab6a7a2 | ||
|
|
6ed209bbf3 | ||
|
|
fe85fa3bea | ||
|
|
76b7882f33 | ||
|
|
bf0ab2d44c | ||
|
|
276a0d9500 | ||
|
|
bcbfa560e9 | ||
|
|
8b366f0795 | ||
|
|
aa08f9692c | ||
|
|
288ba84939 | ||
|
|
4c74016b1a | ||
|
|
384b6c8288 | ||
|
|
a2af158fd3 | ||
|
|
1d8544ef3b | ||
|
|
91a12f76cd | ||
|
|
f4627acc48 | ||
|
|
2b1194d574 | ||
|
|
f33d2fb2e7 | ||
|
|
a9eec35aff | ||
|
|
8534f2d1e2 | ||
|
|
e8debd2e45 | ||
|
|
1caa41a623 | ||
|
|
bf59635280 | ||
|
|
5d6f75aaef | ||
|
|
eaf0662b75 | ||
|
|
6e8ea2a2cb | ||
|
|
b043b2a761 | ||
|
|
ac7e0dfb77 | ||
|
|
05d47bb09a | ||
|
|
575a5bd0b8 | ||
|
|
00740fb23b | ||
|
|
ae4c189e19 | ||
|
|
362a6e6d46 | ||
|
|
c76c7c68ff | ||
|
|
59ac9d39d5 | ||
|
|
ec41caade4 | ||
|
|
06ec06cdd7 | ||
|
|
b7acf86408 | ||
|
|
58c4db925b | ||
|
|
fe0c4ff3c2 | ||
|
|
7a2af0fbf4 | ||
|
|
d83127722f | ||
|
|
dc03ad05be | ||
|
|
a62df3cb8f | ||
|
|
18e32abda9 | ||
|
|
15d29da43b | ||
|
|
8b217d5313 | ||
|
|
ac62586bad | ||
|
|
c150fd9a1c | ||
|
|
674d14879f | ||
|
|
37e9010887 | ||
|
|
4bd2c75056 | ||
|
|
b9ed850b98 | ||
|
|
11cea17496 | ||
|
|
81df45a893 | ||
|
|
c1f0708a5d | ||
|
|
153f5854e2 | ||
|
|
f532964fde | ||
|
|
efea609dc3 | ||
|
|
f3a160038d | ||
|
|
f016eef48a | ||
|
|
f649514183 | ||
|
|
afd31677dd | ||
|
|
b28710b08c | ||
|
|
712ed555e6 | ||
|
|
11fb5bc3d0 | ||
|
|
2a5feb225b | ||
|
|
970e338847 | ||
|
|
0b9f650fe2 | ||
|
|
977834179a | ||
|
|
b42732743d | ||
|
|
99e6409a67 | ||
|
|
6a0a5f9693 | ||
|
|
fe9db8b369 | ||
|
|
ca035d0e8d | ||
|
|
84c9260dc4 | ||
|
|
987c02e946 | ||
|
|
5c0bc612fe | ||
|
|
0e28b53242 | ||
|
|
5fc0ce80fc | ||
|
|
af9092df39 | ||
|
|
58a5da33c2 | ||
|
|
7077eac589 | ||
|
|
b3435ae432 | ||
|
|
a31129333c | ||
|
|
2983c2a24f | ||
|
|
412bedb697 | ||
|
|
163597ef69 | ||
|
|
95f84afd33 | ||
|
|
9f7fd1fbfb | ||
|
|
940cab8620 | ||
|
|
d37811f177 | ||
|
|
5b84c99d79 | ||
|
|
b295024574 | ||
|
|
34180f1745 | ||
|
|
665031467a | ||
|
|
df33171107 | ||
|
|
53f4044890 | ||
|
|
a5049136ff | ||
|
|
705b3c6b63 | ||
|
|
6b4ac66962 | ||
|
|
0964b06240 | ||
|
|
92eeca3ba7 | ||
|
|
2a86554ac4 | ||
|
|
805caa30ce | ||
|
|
d4ca853fd3 | ||
|
|
5a8d2e8057 | ||
|
|
687fc358fd | ||
|
|
c4c2da06b7 | ||
|
|
8928cd53bf | ||
|
|
ca88fc4ed3 | ||
|
|
b83a1d79b7 | ||
|
|
cec2a837cf | ||
|
|
cff47262da | ||
|
|
da83eae754 | ||
|
|
c5409d52f5 | ||
|
|
54fc8f0e8c | ||
|
|
2ea633a2f7 | ||
|
|
9a52043fad | ||
|
|
39a5be2df9 | ||
|
|
96560e317a | ||
|
|
adb27903eb | ||
|
|
51150faa39 | ||
|
|
a56949e9fa | ||
|
|
ea96919b80 | ||
|
|
43da4c0eca | ||
|
|
5835afb849 | ||
|
|
b9c7771830 | ||
|
|
35db88affe | ||
|
|
e38faca455 | ||
|
|
0255e8710c | ||
|
|
7f3fecbdf5 | ||
|
|
a2c6d5e148 | ||
|
|
373706c92b | ||
|
|
7afe63aa06 | ||
|
|
8fab855099 | ||
|
|
062fef36f9 | ||
|
|
fefe2df3ee | ||
|
|
90b91ead72 | ||
|
|
1e98e41381 | ||
|
|
7030e8f050 | ||
|
|
74bb514a8c | ||
|
|
46914e486c | ||
|
|
f9abc561fb | ||
|
|
2e22ff2e36 | ||
|
|
8c3be4a5f0 | ||
|
|
3fe2f7337c | ||
|
|
ec24eb1d8e | ||
|
|
ffcaf85609 | ||
|
|
d0c481e44e | ||
|
|
67e2d9f9e1 | ||
|
|
dd5aa2b483 | ||
|
|
806494a254 | ||
|
|
5c3afd020a | ||
|
|
190cdfc326 | ||
|
|
13b954c765 | ||
|
|
49f6b50ed3 | ||
|
|
0f2a304d34 | ||
|
|
a142f93dca | ||
|
|
2dfe2fb22c | ||
|
|
e8564b4c90 | ||
|
|
2fd81b4932 | ||
|
|
0cf4c6ffea | ||
|
|
25f89afbfb | ||
|
|
43f3cdcd24 | ||
|
|
3454fed324 | ||
|
|
a64ffda688 | ||
|
|
8400da9934 | ||
|
|
6d89020f80 | ||
|
|
9c56c49e73 | ||
|
|
acb798e544 | ||
|
|
c5720a15c7 | ||
|
|
90709b332a | ||
|
|
81f17d10c8 | ||
|
|
773de38bd9 | ||
|
|
ae8bdd473c | ||
|
|
adfc5db3d2 | ||
|
|
a48704925d | ||
|
|
fa4beeee75 | ||
|
|
d8351772d3 | ||
|
|
68d1abdb85 | ||
|
|
7e8474a85a | ||
|
|
82da364b8b | ||
|
|
7fa91ec175 | ||
|
|
1d3a09d377 | ||
|
|
02563a35f0 | ||
|
|
d653f35bb7 | ||
|
|
a543627abd | ||
|
|
80f2ba7fca | ||
|
|
32bca64920 | ||
|
|
7fa1a84ec3 | ||
|
|
ab4bb26a0a | ||
|
|
4b8d258cff | ||
|
|
3c29aa6271 | ||
|
|
51464b4317 | ||
|
|
3f32a6b607 | ||
|
|
21aa1631a4 | ||
|
|
49968541fd | ||
|
|
cc143105b8 | ||
|
|
fed44e95b3 | ||
|
|
71ece56470 | ||
|
|
204a1de3fd | ||
|
|
80ddf4aecf | ||
|
|
12b4a666bc | ||
|
|
cfdbaf331e | ||
|
|
052d350b19 | ||
|
|
2ca18a7ee5 | ||
|
|
7dbe5f4640 | ||
|
|
432ecd1b6a | ||
|
|
7d9aa5b716 | ||
|
|
43267dc892 | ||
|
|
3ec6c26e6c | ||
|
|
7de684668b | ||
|
|
2fec463542 | ||
|
|
1affc641c4 | ||
|
|
4741d7bfe2 | ||
|
|
aea99a1222 | ||
|
|
7c8038e2da | ||
|
|
673336297d | ||
|
|
ee4b7042ce | ||
|
|
310ab7d41b | ||
|
|
fc1796f3e8 | ||
|
|
d8926ea5eb | ||
|
|
0c1e428c7d | ||
|
|
bcd97f5887 | ||
|
|
0faf86c2b9 | ||
|
|
b30957c89c | ||
|
|
dbbcbc3616 | ||
|
|
1889150013 | ||
|
|
14f9cdde6b | ||
|
|
3ab0691eec | ||
|
|
1e073a196f | ||
|
|
7b60e3916c | ||
|
|
c486c5bf5b | ||
|
|
fc0b6d143a | ||
|
|
5f4252bcd2 | ||
|
|
a588aef921 | ||
|
|
b70df57f7b | ||
|
|
e813c93e08 | ||
|
|
900c4977cc | ||
|
|
bb39fffab9 | ||
|
|
f52aefb341 | ||
|
|
aecb5630cb | ||
|
|
0f0245625a | ||
|
|
8583689fa4 | ||
|
|
7a1e026bb5 | ||
|
|
64f04ee6db | ||
|
|
5c6f538b85 | ||
|
|
00aa83a498 | ||
|
|
e44848f8c4 | ||
|
|
5ea8950a13 | ||
|
|
184557bfed | ||
|
|
b4253210d2 | ||
|
|
8e1585aa8a | ||
|
|
dee49d7488 | ||
|
|
1ecde309e4 | ||
|
|
d62a738460 | ||
|
|
0cfd4fff62 | ||
|
|
8904127c10 | ||
|
|
0f1b1bb44d | ||
|
|
16f870aa41 | ||
|
|
16f729eb22 | ||
|
|
36f0bd432c | ||
|
|
457ab8b2ce | ||
|
|
1ebf5f3bcb | ||
|
|
a928a9640f | ||
|
|
cb302476b4 | ||
|
|
31726737df | ||
|
|
082be33cbd | ||
|
|
9aada2ef19 | ||
|
|
4066b2767b | ||
|
|
de43bddc1a | ||
|
|
c46f48abec | ||
|
|
4acbf7b90d | ||
|
|
cbc1a58e93 | ||
|
|
1b5f33a435 | ||
|
|
41b4a63f2b | ||
|
|
d8fc2db910 | ||
|
|
dc11dea7cc | ||
|
|
6edfc56c9d | ||
|
|
5837a63942 | ||
|
|
3a28f456b1 | ||
|
|
4f6fc2675c | ||
|
|
c7da1821c3 | ||
|
|
1a8c3271da | ||
|
|
bd49e8e76f | ||
|
|
533699abe7 | ||
|
|
267ccc98d3 | ||
|
|
cd3c2fdb49 | ||
|
|
5cbc319e96 | ||
|
|
d435dcdca4 | ||
|
|
e5ab456df3 | ||
|
|
08bf4f74a9 | ||
|
|
a838a03412 | ||
|
|
ad4e597f74 | ||
|
|
ee3610a2d2 | ||
|
|
88b75b57d0 | ||
|
|
aa4c7055f8 | ||
|
|
4b70f9d213 | ||
|
|
79d2d1c201 | ||
|
|
406bda9b95 | ||
|
|
405f1dd027 | ||
|
|
51f349d504 | ||
|
|
4f201d1e85 | ||
|
|
03cfef100f | ||
|
|
ff89b491dd | ||
|
|
7552dff0e5 | ||
|
|
110589c0f3 | ||
|
|
3400398230 | ||
|
|
5c244e9a8c | ||
|
|
4e2f4e2091 | ||
|
|
e69bef3ce3 | ||
|
|
c1c0fc79bc | ||
|
|
02a77f6797 | ||
|
|
77b316cdfb | ||
|
|
2abfc7b87b | ||
|
|
050f0c3d8f | ||
|
|
90e6c727da | ||
|
|
d3d9a04e62 | ||
|
|
a66051216f | ||
|
|
0debba0f6e | ||
|
|
f2bd2c318c | ||
|
|
21c42819c7 | ||
|
|
5899a272ef | ||
|
|
27b4c62bc1 | ||
|
|
b227fddec7 | ||
|
|
2c1f1de33c | ||
|
|
c26622cf8f | ||
|
|
9e91873428 | ||
|
|
7363d50a1e | ||
|
|
15213a041d | ||
|
|
fb70a34c80 | ||
|
|
fbf76c6d21 | ||
|
|
811af02f56 | ||
|
|
bc00c38f9d | ||
|
|
4658bd8208 | ||
|
|
6eb1caa417 | ||
|
|
41efc1376e | ||
|
|
0f35016773 | ||
|
|
c641ca90a9 | ||
|
|
87c88fcb27 | ||
|
|
4f80a129f1 | ||
|
|
6987f2ba82 | ||
|
|
563db580ae | ||
|
|
125daea16a | ||
|
|
fd2c6b8a4b | ||
|
|
5b1db917bc | ||
|
|
8780e23ed3 | ||
|
|
be492ed108 | ||
|
|
24da14f4f7 | ||
|
|
03d2fb450f | ||
|
|
849b0563ce | ||
|
|
16a99ad515 | ||
|
|
d93172bee8 | ||
|
|
25429af122 | ||
|
|
4bfd104a23 | ||
|
|
7745067d99 | ||
|
|
b19d3629b9 | ||
|
|
84c519df09 | ||
|
|
737a56a030 | ||
|
|
67cba251c8 | ||
|
|
0bc511715b | ||
|
|
27ce80544f | ||
|
|
04f627c2af | ||
|
|
12b6959ea2 | ||
|
|
7519768cb1 | ||
|
|
9af470c92d | ||
|
|
ac8c1d0a01 | ||
|
|
921d01b59d | ||
|
|
8aa4a66ba0 | ||
|
|
2e7153d8d6 | ||
|
|
70b5a81a29 | ||
|
|
83fd822e8b | ||
|
|
e72eef421b | ||
|
|
016063c810 | ||
|
|
38f19981b2 | ||
|
|
40dd968f13 | ||
|
|
3cef348f30 | ||
|
|
b293b16007 | ||
|
|
f5f43db2da | ||
|
|
029555d192 | ||
|
|
fa4d202e71 | ||
|
|
a8ebfd7a92 | ||
|
|
b19e5720cc | ||
|
|
a254f5a3a8 | ||
|
|
143c735f96 | ||
|
|
dd3752956a | ||
|
|
bf15cac980 | ||
|
|
951bad46e0 | ||
|
|
716225cd2f | ||
|
|
bbc618b8f9 | ||
|
|
11ead56d6d | ||
|
|
e972ae4afa | ||
|
|
0709065f50 | ||
|
|
1a61b01315 | ||
|
|
c643b6ff16 | ||
|
|
b3f5b4932c | ||
|
|
b3f5f2f75f | ||
|
|
62288907dd | ||
|
|
cdbdcec715 | ||
|
|
ccf78448aa | ||
|
|
ed001e0cfb | ||
|
|
26382713c2 | ||
|
|
d6bc5c35a7 | ||
|
|
dc03f003ac | ||
|
|
7aa2104596 | ||
|
|
460cfba6ff | ||
|
|
c8b93d6573 | ||
|
|
3f5f96ac91 | ||
|
|
f37481f843 | ||
|
|
7c6b991de7 | ||
|
|
82460aa49f | ||
|
|
7e7b403043 | ||
|
|
c3f6502be2 | ||
|
|
e5217e6ce9 | ||
|
|
c98cb1d6f9 | ||
|
|
ba6f2b0467 | ||
|
|
23465ad985 | ||
|
|
7886a14b74 | ||
|
|
466b6a23cd | ||
|
|
4a04f73434 | ||
|
|
134cb6a017 | ||
|
|
8d036c4b7c | ||
|
|
c64ad78c7b | ||
|
|
4a043a915f | ||
|
|
8ff0d99092 | ||
|
|
2e47cb12c4 | ||
|
|
ff6f1655f0 | ||
|
|
0120f396ac | ||
|
|
231fffe594 | ||
|
|
b5ba94f1de | ||
|
|
cbf79769d3 | ||
|
|
e67afc35b8 | ||
|
|
5e73007b1d | ||
|
|
2d9876a261 | ||
|
|
125eb01e03 | ||
|
|
ccb13205f4 | ||
|
|
6f23e91e33 | ||
|
|
1bd8a322f5 | ||
|
|
362e73bea8 | ||
|
|
9f8c2b3b56 | ||
|
|
303d67aed2 | ||
|
|
6a7f6cdacd | ||
|
|
5715342fe0 | ||
|
|
38a0d15190 | ||
|
|
56f763a4a8 | ||
|
|
a2eb14f3b3 | ||
|
|
05c63af7c4 | ||
|
|
1f59701c46 | ||
|
|
ec3191f502 | ||
|
|
32b5654a6e | ||
|
|
674091424e | ||
|
|
6ad336743d | ||
|
|
c882568ccd | ||
|
|
f6b2899dd2 | ||
|
|
bccd4ef2f7 | ||
|
|
94c240a026 | ||
|
|
c50a0cf7bf | ||
|
|
c37f7abb79 | ||
|
|
432ce9b1de | ||
|
|
054323c2bc | ||
|
|
a8770aa606 | ||
|
|
7d5442e103 | ||
|
|
eab32f2e5d | ||
|
|
d42c0f1dc5 | ||
|
|
6ad1e4d99a | ||
|
|
7350144ab3 | ||
|
|
54c591bd9d | ||
|
|
217d88f21f | ||
|
|
394e3be482 | ||
|
|
575fbad254 | ||
|
|
fa0aa91bf9 | ||
|
|
d7f024c510 | ||
|
|
bc5a53574c | ||
|
|
3e641e2147 | ||
|
|
de7e4f0db7 | ||
|
|
a1cb1d78bd | ||
|
|
1178f2c1ab | ||
|
|
76f277eeb4 | ||
|
|
4000390dcd | ||
|
|
30df709736 | ||
|
|
8cd17ce045 | ||
|
|
1bfbced258 | ||
|
|
6ac5980a17 | ||
|
|
2e24adae89 | ||
|
|
188b94cb3e | ||
|
|
c48733e34f | ||
|
|
f36db9bb04 | ||
|
|
30dd29e251 | ||
|
|
6cf1acfb48 | ||
|
|
a7b09d3d1c | ||
|
|
8fc3768166 | ||
|
|
b07bddf742 | ||
|
|
220f957cd8 | ||
|
|
8ce48d83eb | ||
|
|
200cdb6b0a | ||
|
|
d9fb40203a | ||
|
|
2d9e972195 | ||
|
|
97a1a04116 | ||
|
|
493cd866f1 | ||
|
|
063d369672 | ||
|
|
a0fae8dacc | ||
|
|
bc840b69d5 | ||
|
|
85301853d6 | ||
|
|
7cd53fb452 | ||
|
|
538ddf7af2 | ||
|
|
d5afa181f7 | ||
|
|
8ed4124184 | ||
|
|
160242a74f | ||
|
|
81b83bc904 | ||
|
|
2a716b7a7a | ||
|
|
63272541eb | ||
|
|
464767c5fd | ||
|
|
a9c3ca8606 | ||
|
|
86dd677e0c | ||
|
|
666f700a93 | ||
|
|
b70bf938c2 | ||
|
|
d5cf41e043 | ||
|
|
b7a1954c33 | ||
|
|
6520589a37 | ||
|
|
f445b0178a | ||
|
|
f618065f7c | ||
|
|
f0be48ff90 | ||
|
|
bb922d577d | ||
|
|
990809cc21 | ||
|
|
bfcc466647 | ||
|
|
3d2558bde6 | ||
|
|
1aac0b10c9 | ||
|
|
e5ff85b63c | ||
|
|
f0bb5b84f9 | ||
|
|
07b50f6c69 | ||
|
|
61b3aaaa07 | ||
|
|
b5119d7958 | ||
|
|
d3e72e4344 | ||
|
|
60512ffa09 | ||
|
|
b1a252a64d | ||
|
|
fb90b64bac | ||
|
|
6e7a398263 | ||
|
|
44d2d9b1e8 | ||
|
|
8302ed44aa | ||
|
|
7e12aea1d8 | ||
|
|
20346b0da4 | ||
|
|
e0e65cbdf9 | ||
|
|
9d2d58c4b6 | ||
|
|
0c461c3859 | ||
|
|
0d38bd9b3b | ||
|
|
2f02e49b9f | ||
|
|
064e8a7c68 | ||
|
|
e4dd269609 | ||
|
|
19dd59f38c | ||
|
|
37501d9bc7 | ||
|
|
89f9561d10 | ||
|
|
8af3f91e78 | ||
|
|
0661fd6f7c | ||
|
|
edd003b62a | ||
|
|
10cc87e422 | ||
|
|
0470f648c6 | ||
|
|
777360149d | ||
|
|
aa7774b82b | ||
|
|
d44da875e7 | ||
|
|
f9ad73598b | ||
|
|
952fe98796 | ||
|
|
579912e52f | ||
|
|
1b5ec3e3ca | ||
|
|
fb4e6ac923 | ||
|
|
3560dc4be6 | ||
|
|
b002ea9a20 | ||
|
|
540317ea2b | ||
|
|
142d1951d2 | ||
|
|
cf06ba6d13 | ||
|
|
a8d800572e | ||
|
|
5525ea45a4 | ||
|
|
3120958a17 | ||
|
|
052726ed50 | ||
|
|
8397196fbb | ||
|
|
8547611479 | ||
|
|
fe45f28204 | ||
|
|
861067412f | ||
|
|
7eca886608 | ||
|
|
79b6f9e89e | ||
|
|
3d17c06777 | ||
|
|
d6c08fb79f | ||
|
|
ef02b20811 | ||
|
|
8bf46a665e | ||
|
|
c4fca2aa61 | ||
|
|
45310d0cf6 | ||
|
|
87268c2297 | ||
|
|
032e435490 | ||
|
|
78c43edcac | ||
|
|
f32d34b965 | ||
|
|
8a7ff6a6fd | ||
|
|
6c48aa5fae | ||
|
|
d82547acd3 | ||
|
|
441f9cc2ee | ||
|
|
9f4fc8ad33 | ||
|
|
d1e31261fe | ||
|
|
05dd9acba8 | ||
|
|
9270485723 | ||
|
|
e93975cb46 | ||
|
|
cbdaf4827f | ||
|
|
f2c28d287a | ||
|
|
90c228abca | ||
|
|
505e6bec9e | ||
|
|
ee027f237b | ||
|
|
3ae0d6f421 | ||
|
|
13b66a77c7 | ||
|
|
ed70836057 | ||
|
|
a68e52c2e3 | ||
|
|
ea37b89753 | ||
|
|
5d89aa06f7 | ||
|
|
ead034e638 | ||
|
|
a294838bcd | ||
|
|
1c03d1e87d | ||
|
|
f8804c8a56 | ||
|
|
7c444dea6e | ||
|
|
6d91d270d6 | ||
|
|
dd1cec4196 | ||
|
|
d1a8a4481e | ||
|
|
5921ffaa36 | ||
|
|
cf47b68c1e | ||
|
|
eeb8d0dbcd | ||
|
|
b6fa22bd84 | ||
|
|
a0ef27a0cd | ||
|
|
22eb831a71 | ||
|
|
01ab9acd14 | ||
|
|
74fcbb382f | ||
|
|
9836b1dddd | ||
|
|
e304d0f8ee | ||
|
|
ab7b38d4b9 | ||
|
|
a464dc681a | ||
|
|
eaf675dc92 | ||
|
|
57068e526c | ||
|
|
c14a00eec9 | ||
|
|
219c42522f | ||
|
|
e3a0f15837 | ||
|
|
a6bb27483b | ||
|
|
7ada7def9e | ||
|
|
af384d9aa6 | ||
|
|
223c129b6b | ||
|
|
421c4ae907 | ||
|
|
4907f610d6 | ||
|
|
f9d1bbbffb | ||
|
|
60589fc1cb | ||
|
|
5121316036 | ||
|
|
68bdfa9d0e | ||
|
|
97b816200d | ||
|
|
059a643188 | ||
|
|
7facad41b7 | ||
|
|
3ee59e454c | ||
|
|
43da1686da | ||
|
|
6d643f92b7 | ||
|
|
559a01f585 | ||
|
|
ba8e3f11e2 | ||
|
|
fd8a53ca3d | ||
|
|
8707aafaf7 | ||
|
|
e5a28bfd8d | ||
|
|
6e04d66a35 | ||
|
|
86e8b3b4bd | ||
|
|
a26ead035a | ||
|
|
704be54c3a | ||
|
|
2406152576 | ||
|
|
af260b5a64 | ||
|
|
4efa96df21 | ||
|
|
26bef5d209 | ||
|
|
cd6e0ff88a | ||
|
|
2ca979425f | ||
|
|
8d822ebdb4 | ||
|
|
bc5b5afcbf | ||
|
|
b373c53ce4 | ||
|
|
bc4b89c21a | ||
|
|
e10c287c93 | ||
|
|
ce42d53a09 | ||
|
|
a4f9d6d98b | ||
|
|
eebd03701a | ||
|
|
d5287682d1 | ||
|
|
7c567e3cbd | ||
|
|
58352ea69d | ||
|
|
de64b35359 | ||
|
|
7df8e1eab2 | ||
|
|
8b62127770 | ||
|
|
3158955198 | ||
|
|
d9d97bd17b | ||
|
|
94f6380d69 | ||
|
|
2ee821656f | ||
|
|
7556abb92d | ||
|
|
9d3a85d434 | ||
|
|
147d301f10 | ||
|
|
75a89c5983 | ||
|
|
2289968634 | ||
|
|
ca252804c6 | ||
|
|
7c25d83f1c | ||
|
|
8ce30c6a69 | ||
|
|
9fcaff749f | ||
|
|
3ac1475262 | ||
|
|
ad64bab5b2 | ||
|
|
f02998b106 | ||
|
|
127fe6ecf0 | ||
|
|
888ab0c89c | ||
|
|
2efd8ef52d | ||
|
|
6ad933982f | ||
|
|
854258f376 | ||
|
|
26f2d7fbae | ||
|
|
3952920492 | ||
|
|
c2001a7259 | ||
|
|
78f911ac19 | ||
|
|
0f2a7226fb | ||
|
|
f8d0ebe92f | ||
|
|
ba6ba7d4be | ||
|
|
58e6f660f3 | ||
|
|
cd482ca655 | ||
|
|
e43b56eb38 | ||
|
|
0c2d767f6f | ||
|
|
02e697032f | ||
|
|
07dc262690 | ||
|
|
6bf8d5b936 | ||
|
|
93858bf262 | ||
|
|
f64da46a98 | ||
|
|
2052a029ee | ||
|
|
c6aafff701 | ||
|
|
26f0f92210 | ||
|
|
bdc4ae2b86 | ||
|
|
9ca9341384 | ||
|
|
7f4f8b7c7d | ||
|
|
8870526457 | ||
|
|
f057e1e17a | ||
|
|
8561c9c5a6 | ||
|
|
23199719d9 | ||
|
|
a606ef0700 | ||
|
|
a234de1ee3 | ||
|
|
d266898617 | ||
|
|
69b5929c5a | ||
|
|
316c72a4ae | ||
|
|
9da88eec3e | ||
|
|
f10d9996d2 | ||
|
|
58ec9d3a73 | ||
|
|
4a503ba1ad | ||
|
|
2d096a569a | ||
|
|
e44ea5038e | ||
|
|
b111aa0111 | ||
|
|
773d24ebf7 | ||
|
|
bd371af0b3 | ||
|
|
9d79c72c17 | ||
|
|
a86aaef4d0 | ||
|
|
e463244db3 | ||
|
|
9e10b75f55 | ||
|
|
294091ce60 | ||
|
|
da6dd2dc92 | ||
|
|
40b9de66c7 | ||
|
|
aac985951a | ||
|
|
662cc5fe20 | ||
|
|
e1e62d97a8 | ||
|
|
a29cc48fec | ||
|
|
42af040fbd | ||
|
|
d383d617c2 | ||
|
|
9d04c21cc2 | ||
|
|
ed8039e223 | ||
|
|
f05743bf57 | ||
|
|
c6be661bb5 | ||
|
|
c84508ae9f | ||
|
|
f06fe1ea98 | ||
|
|
77f2cd6513 | ||
|
|
d16fb79708 | ||
|
|
baad86bcd7 | ||
|
|
8808aad529 | ||
|
|
6d7eaba845 | ||
|
|
4259b17b91 | ||
|
|
828ea700e8 | ||
|
|
7f22685fa3 | ||
|
|
40db9dff3b | ||
|
|
fa82264604 | ||
|
|
ae467aa42e | ||
|
|
c38f29ce56 | ||
|
|
67cc09416f | ||
|
|
f2a75fbfc7 | ||
|
|
b1fb09e183 | ||
|
|
cd0082c630 | ||
|
|
f78527d1e3 | ||
|
|
1f642238a7 | ||
|
|
6fe06cad98 | ||
|
|
2335fdbb5a | ||
|
|
1b6f7c3eb7 | ||
|
|
67f0d26d17 | ||
|
|
8574bcd494 | ||
|
|
02cc77cd82 | ||
|
|
d8782ce5fd | ||
|
|
dedc2986c6 | ||
|
|
74cdc0005a | ||
|
|
a756cd9565 | ||
|
|
ae27c3f4c5 | ||
|
|
6d41f36266 | ||
|
|
57cbcdf2ec | ||
|
|
455fd180b1 | ||
|
|
78abcd7df7 | ||
|
|
23dce21647 | ||
|
|
e6177c3349 | ||
|
|
e2adb82e29 | ||
|
|
bb472206de | ||
|
|
d87cf5146e | ||
|
|
87eb5cbced | ||
|
|
181edf4b53 | ||
|
|
dfa53cb88e | ||
|
|
d079cda174 | ||
|
|
4265e71d6f | ||
|
|
f66a72c66b | ||
|
|
9be90bd1c9 | ||
|
|
106e535577 | ||
|
|
194be51f05 | ||
|
|
a862e363ea | ||
|
|
2e64afca27 | ||
|
|
51cda0be2a | ||
|
|
4da3291157 | ||
|
|
52edabf2cb | ||
|
|
43a1a0f3ab | ||
|
|
e88524f274 | ||
|
|
7a929fcd27 | ||
|
|
7087fdf6c0 | ||
|
|
67093a5143 | ||
|
|
3f34016888 | ||
|
|
1307633a84 | ||
|
|
1a53f07d80 | ||
|
|
672f678ed6 | ||
|
|
b924568f79 | ||
|
|
e6e9c21275 | ||
|
|
636f5d4a1d | ||
|
|
41a4b280ee | ||
|
|
27139bf41f | ||
|
|
12ba1957d0 | ||
|
|
9b9d189a33 | ||
|
|
7c3af4f56f | ||
|
|
880ce080b7 | ||
|
|
6e84a03a35 | ||
|
|
a9f6556454 | ||
|
|
2722211ba3 | ||
|
|
e2e5cddcaa | ||
|
|
40280fa6cf | ||
|
|
8b7718fbdc | ||
|
|
fe9299ceff | ||
|
|
b44957ad91 | ||
|
|
a049f972ec | ||
|
|
069895d26b | ||
|
|
0e756e4377 | ||
|
|
ee7282ce0d | ||
|
|
d026367334 | ||
|
|
7244dc4511 | ||
|
|
56f61a6d59 | ||
|
|
4d5f610029 | ||
|
|
c94b4466d5 | ||
|
|
61f9e79ec9 | ||
|
|
cf797657ed | ||
|
|
c597538b40 | ||
|
|
43f964e28d | ||
|
|
8283f23651 | ||
|
|
7cc25f91ff | ||
|
|
5d2506e697 | ||
|
|
14908b7f28 | ||
|
|
2e122e1509 | ||
|
|
486b5b6bfc | ||
|
|
88a2f128ec | ||
|
|
45c139cfb3 | ||
|
|
3a111e5d74 | ||
|
|
fc0c5e7359 | ||
|
|
2ccfb71d12 | ||
|
|
e8a5a9b1e8 | ||
|
|
ec3568bd97 | ||
|
|
a67a881715 | ||
|
|
7a048f004d | ||
|
|
330b6a0482 | ||
|
|
aa2e4d92e0 | ||
|
|
0ea66a1275 | ||
|
|
aafff8fd5c | ||
|
|
5ac2a69940 | ||
|
|
8278a12af9 | ||
|
|
e88dd9b08b | ||
|
|
bbea6564fc | ||
|
|
1ca8d7ad45 | ||
|
|
67958f7fa7 | ||
|
|
ab9c527274 | ||
|
|
36ff991960 | ||
|
|
59d38f876a | ||
|
|
5c5c6a965c | ||
|
|
74aafe6a10 | ||
|
|
f860a2fbd6 | ||
|
|
87bcf739ee | ||
|
|
db6db51742 | ||
|
|
981be7956b | ||
|
|
8c10aa575c | ||
|
|
17b316b94b | ||
|
|
8921b4f9d1 | ||
|
|
c3f111a56c | ||
|
|
cf16d81fa4 | ||
|
|
2beb763b4f | ||
|
|
69ae879c58 | ||
|
|
08fee9a284 | ||
|
|
f89da17827 | ||
|
|
ea26da0be7 | ||
|
|
1f3d3970f6 | ||
|
|
c9a71a7176 | ||
|
|
7ed8833fd5 | ||
|
|
250318329f | ||
|
|
14c538c9c7 | ||
|
|
abe4c57663 | ||
|
|
9fb351a139 | ||
|
|
0d0ccacdf3 | ||
|
|
c8858f85d8 | ||
|
|
d1bc46ffad | ||
|
|
32e5848f34 | ||
|
|
be36c0769a | ||
|
|
f9e63dfd65 | ||
|
|
fa05dac5ae | ||
|
|
430dd3ae05 | ||
|
|
664fc76ac7 | ||
|
|
37d6cc07a7 | ||
|
|
d79b6cd8dc | ||
|
|
d6510f9578 | ||
|
|
59e8302c9d | ||
|
|
3422bd9b94 | ||
|
|
a3f3c7ba24 | ||
|
|
82ecebb393 | ||
|
|
6ba0b029e6 | ||
|
|
604c9dacdb | ||
|
|
1a619522ee | ||
|
|
88615fbff1 | ||
|
|
d4f8f67173 | ||
|
|
174a0a2efc | ||
|
|
12b5494906 | ||
|
|
aa0f06d6b7 | ||
|
|
0c47685e02 | ||
|
|
e0ca4347be | ||
|
|
e65d9408ee | ||
|
|
d8558a3af3 | ||
|
|
72eedb1c98 | ||
|
|
3c5cf9500d | ||
|
|
7a1f3177c9 | ||
|
|
f8da8b0261 | ||
|
|
393cb7fd7d | ||
|
|
e74e1256d4 | ||
|
|
96abd70c13 | ||
|
|
1f9d9c3176 | ||
|
|
94efeb2845 | ||
|
|
a73834436f | ||
|
|
85f4aeca05 | ||
|
|
7db84a961a | ||
|
|
74e95e88d8 | ||
|
|
80d9baa9e8 | ||
|
|
751995ab95 | ||
|
|
5ca6e2910a | ||
|
|
071d05465a | ||
|
|
11a9536271 | ||
|
|
41a7203c28 | ||
|
|
543a58bb87 | ||
|
|
b2b95cad20 | ||
|
|
eabec967ec | ||
|
|
e42b152037 | ||
|
|
da599e3f1a | ||
|
|
4c7b0b935b | ||
|
|
c400876df1 | ||
|
|
a960e2ef48 | ||
|
|
4fe272a7fb | ||
|
|
a7d9f248ea | ||
|
|
06aa689383 | ||
|
|
835b0c44cd | ||
|
|
54b6f8a4ae | ||
|
|
18787ebe8f | ||
|
|
47e8fcf37e | ||
|
|
5958b78459 | ||
|
|
9d9697b366 | ||
|
|
6585e18571 | ||
|
|
6f1b4292f0 | ||
|
|
ef9ef03b1f | ||
|
|
c4bea3dfe4 | ||
|
|
eaa9a1e33b | ||
|
|
3e19298c9e | ||
|
|
2a96ce97ee | ||
|
|
8cfe901391 | ||
|
|
30f1ee7a1f | ||
|
|
46ff830daa | ||
|
|
828cd6fd0b | ||
|
|
ecb67a1ed1 | ||
|
|
0ef843f138 | ||
|
|
eb79d83051 | ||
|
|
ca1a11493d | ||
|
|
69bb086ba5 | ||
|
|
11a5ee821b | ||
|
|
a8a85143f6 | ||
|
|
e2cc328eef | ||
|
|
344d10a8e3 | ||
|
|
681643ea9e | ||
|
|
fa947e02ca | ||
|
|
cd289843f7 | ||
|
|
b123392592 | ||
|
|
ccbb5c3e01 | ||
|
|
49b63e084f | ||
|
|
107321e385 | ||
|
|
1d214b4aed | ||
|
|
2e1347aba4 | ||
|
|
9ddb5931fb | ||
|
|
913064d6cc | ||
|
|
fb45b8a5c9 | ||
|
|
f5c9056430 | ||
|
|
0e39b59700 | ||
|
|
552af5455e | ||
|
|
8759bc1b41 | ||
|
|
09384df32c | ||
|
|
20538516b9 | ||
|
|
0759421d11 | ||
|
|
bf7417981f | ||
|
|
dba41e2e4a | ||
|
|
bc6472bb9e | ||
|
|
d4bd947bf5 | ||
|
|
d8e8eabf60 | ||
|
|
a70443af31 | ||
|
|
3f221e2edb | ||
|
|
56504534d8 | ||
|
|
80a45c91f9 | ||
|
|
3f695fdfaf | ||
|
|
88433bca22 | ||
|
|
34689eb2d2 | ||
|
|
211aea1441 | ||
|
|
74a46788cd | ||
|
|
7213c26798 | ||
|
|
fa1fb47d75 | ||
|
|
848ed14788 | ||
|
|
4c8a5dfb05 | ||
|
|
4f61ba766d | ||
|
|
b9eeb6e6eb | ||
|
|
d5fa2af353 | ||
|
|
a877926f08 | ||
|
|
3e4e6f7ced | ||
|
|
936eb43c0e | ||
|
|
bb66cfa780 | ||
|
|
1d626cb6ac | ||
|
|
580346f4a7 | ||
|
|
0fbcf64108 | ||
|
|
267faa3851 | ||
|
|
fe50481f7b | ||
|
|
759616abd4 | ||
|
|
eb8fd07900 | ||
|
|
c99559dbe9 | ||
|
|
966c4244cb | ||
|
|
81283f8bcb | ||
|
|
8b84e5b3f9 | ||
|
|
e1d5ddb478 | ||
|
|
2da0322329 | ||
|
|
fefb35c782 | ||
|
|
b2433a664c | ||
|
|
adad4279f3 | ||
|
|
3ca0a39a35 | ||
|
|
52594e64d0 | ||
|
|
3364c1b893 | ||
|
|
0801b3f495 | ||
|
|
657f00fe36 | ||
|
|
044c81b644 | ||
|
|
507d8fdc6f | ||
|
|
31e29e62f4 | ||
|
|
dfcb572985 | ||
|
|
1d324176d1 | ||
|
|
37b3190752 | ||
|
|
d51265d48f | ||
|
|
dc14ac7a8f | ||
|
|
fb52a24da3 | ||
|
|
fbafb19657 | ||
|
|
6c4438d8a9 | ||
|
|
be00737ced | ||
|
|
07b93dcf80 | ||
|
|
374c6a27db | ||
|
|
36c9e95969 | ||
|
|
a3142ee4e6 | ||
|
|
437caeb90f | ||
|
|
af49cace8d | ||
|
|
13b78d0d89 | ||
|
|
65c135b451 | ||
|
|
ec162f265f | ||
|
|
ba99696771 | ||
|
|
4eeea640f4 | ||
|
|
cc6f1020d0 | ||
|
|
316ddc2382 | ||
|
|
3452625fac | ||
|
|
426e0105a6 | ||
|
|
18f39aa012 | ||
|
|
631b635652 | ||
|
|
49695d47d3 | ||
|
|
5cec477131 | ||
|
|
a5d0300787 | ||
|
|
09b84c51ee | ||
|
|
afe53997bf | ||
|
|
c42e412c0a | ||
|
|
542e7feba8 | ||
|
|
dc085e0bd2 | ||
|
|
7c9517343c | ||
|
|
0b4fa41aff | ||
|
|
e138e2c880 | ||
|
|
0d6345e98b | ||
|
|
a84bcf597d | ||
|
|
4bbd4ba855 | ||
|
|
9e5b56b475 | ||
|
|
dd383037fd | ||
|
|
3cd24c0a51 | ||
|
|
8bfdb4ed0c | ||
|
|
41507d8129 | ||
|
|
317a98a5a9 | ||
|
|
1395794923 | ||
|
|
073e9d06ec | ||
|
|
fd1b04932a | ||
|
|
d4b625b48e | ||
|
|
82337dec44 | ||
|
|
f1d0700252 | ||
|
|
e1383a2d8e | ||
|
|
6773adc771 | ||
|
|
ee2afb35dd | ||
|
|
0adcda387a | ||
|
|
fc1664d9fc | ||
|
|
70bd35abe2 | ||
|
|
12768babdf | ||
|
|
bc2a1160b8 | ||
|
|
75542e8f5d | ||
|
|
fcb55f841a | ||
|
|
0efb67b51e | ||
|
|
54ebf2a699 | ||
|
|
154e601f4e | ||
|
|
4cca75b2e1 | ||
|
|
6d616e55ae | ||
|
|
95b1a640b6 | ||
|
|
ecc12c9ba1 | ||
|
|
9e50993c13 | ||
|
|
b32ec857b1 | ||
|
|
0de42d56fc | ||
|
|
6378ad69bb | ||
|
|
9616e9bf3b | ||
|
|
7c8b73bffb | ||
|
|
ae178c77bd | ||
|
|
2220651253 | ||
|
|
7fdd801479 | ||
|
|
27002ad1ea | ||
|
|
986dd2fac1 | ||
|
|
3965b490a9 | ||
|
|
b999e16406 | ||
|
|
7fb9bebd46 | ||
|
|
3b8a9dd6ec | ||
|
|
cfbee59152 | ||
|
|
b4db28fed2 | ||
|
|
c9aec3e866 | ||
|
|
1d1f8be260 | ||
|
|
38e6c0ad3f | ||
|
|
7ecf4ad54d | ||
|
|
1c02b4b9f4 | ||
|
|
d0119548c1 | ||
|
|
95ac6071b9 | ||
|
|
3a4e667078 | ||
|
|
afdefefbe4 | ||
|
|
5360c0c588 | ||
|
|
74a05a7f53 | ||
|
|
a68acf5c66 | ||
|
|
ce18c36ed9 | ||
|
|
8e39cf62e7 | ||
|
|
707d379b97 | ||
|
|
88a0a48b03 | ||
|
|
d51b90a880 | ||
|
|
e9912bcf8a | ||
|
|
4a5cc9f610 | ||
|
|
e29fc62b68 | ||
|
|
b55e1dcb5e | ||
|
|
6f4775a8ee | ||
|
|
c7e2f558a0 | ||
|
|
328860c8ba | ||
|
|
89ac111853 | ||
|
|
3d4f588a7f | ||
|
|
8f74bf314d | ||
|
|
0dd5ebbdbe | ||
|
|
2ae60767a3 | ||
|
|
64f31f70f9 | ||
|
|
23eacbd132 | ||
|
|
e9f16fca96 | ||
|
|
3d30de91f3 | ||
|
|
f68d2f7c7f | ||
|
|
f660d30138 | ||
|
|
b10276ff98 | ||
|
|
7d353bbe2a | ||
|
|
5696f91a1e | ||
|
|
3932e62fc7 | ||
|
|
729304aef5 | ||
|
|
40cce050e7 | ||
|
|
bb6ee71f08 | ||
|
|
0d0642fd67 | ||
|
|
08e6cf3dd2 | ||
|
|
044134eba0 | ||
|
|
9fa6fa522e | ||
|
|
d0cd98a63a | ||
|
|
88eae9dabb | ||
|
|
f2f1801c25 | ||
|
|
a9e351e00d | ||
|
|
d65841a2db | ||
|
|
9da57e7458 | ||
|
|
3a3fb98f79 | ||
|
|
503ed9c331 | ||
|
|
2784d65618 | ||
|
|
47ea69233b | ||
|
|
a884e37de1 | ||
|
|
0102a8665a | ||
|
|
cb63189f6b | ||
|
|
d77c83f4ba | ||
|
|
8cf3ac200b | ||
|
|
477877406a | ||
|
|
2bf2f34b12 | ||
|
|
7453c26ec4 | ||
|
|
b059ba69d6 | ||
|
|
36ca57a54e | ||
|
|
efa6678bcc | ||
|
|
b8f1850bba | ||
|
|
5268f55344 | ||
|
|
e44c9a000d | ||
|
|
ffc926bda5 | ||
|
|
07c1ba1f5e | ||
|
|
14168eadb2 | ||
|
|
58771fc41c | ||
|
|
1e06c66c77 | ||
|
|
c73771e3ce | ||
|
|
350d2bcd6e | ||
|
|
b2c523e56d | ||
|
|
5bc5abf0e7 | ||
|
|
44352e9ee4 | ||
|
|
7ccc609da2 | ||
|
|
ebc0168072 | ||
|
|
4ba7427fa0 | ||
|
|
9dc5335e3e | ||
|
|
d333de1980 | ||
|
|
96afa8bd2b | ||
|
|
797bbeabeb | ||
|
|
20cdab5546 | ||
|
|
6765234b60 | ||
|
|
4c27898ce7 | ||
|
|
d34ae0850c | ||
|
|
e9a85aa4e4 | ||
|
|
2a16fc74fd | ||
|
|
f65254680a | ||
|
|
d64edb6896 | ||
|
|
3f9ad8e104 | ||
|
|
1c772ef699 | ||
|
|
809b89b5af | ||
|
|
681e012fb5 | ||
|
|
3be36643a1 | ||
|
|
21e19ef69f | ||
|
|
69a42fc901 | ||
|
|
525789cd36 | ||
|
|
367d660c08 | ||
|
|
4d73e4d605 | ||
|
|
d86cc5bf42 | ||
|
|
5f262da09d | ||
|
|
82985a9488 | ||
|
|
afcdb65f80 | ||
|
|
6b66e86f40 | ||
|
|
cb145d290e | ||
|
|
167803d2a1 | ||
|
|
58a981d2f6 | ||
|
|
8963cd1fab | ||
|
|
6526de024a | ||
|
|
55cd5a9a78 | ||
|
|
3f4c283203 | ||
|
|
1e63e7c08b | ||
|
|
33fc3af775 | ||
|
|
6d9739165e | ||
|
|
7c5396ffb9 | ||
|
|
8319398957 | ||
|
|
a1509876de | ||
|
|
0f2cf51f43 | ||
|
|
e99ff4fdbc | ||
|
|
25431f32a2 | ||
|
|
6ba1fe7568 | ||
|
|
bfae92e307 | ||
|
|
9c5bf542d1 | ||
|
|
61161269d8 | ||
|
|
8fe004e98e | ||
|
|
09e5f17b5d | ||
|
|
db20e29af6 | ||
|
|
5f5c95cc68 | ||
|
|
68f3015712 | ||
|
|
240a697f6c | ||
|
|
5a0dc808fd | ||
|
|
befbf6bf13 | ||
|
|
2d5c21c457 | ||
|
|
25977d56c8 | ||
|
|
4dcf0b8ae0 | ||
|
|
9574d11dc8 | ||
|
|
3d4689756c | ||
|
|
90114514a9 | ||
|
|
7757e59e78 | ||
|
|
adb89e0121 | ||
|
|
b7a7953757 | ||
|
|
d25ef7eea4 | ||
|
|
30a82076ba | ||
|
|
860339c132 | ||
|
|
008723c62f | ||
|
|
9e0ce23a03 | ||
|
|
04ba433ca6 | ||
|
|
d884272ba8 | ||
|
|
e609c88334 | ||
|
|
e92a41fa3a | ||
|
|
df5f9f4a15 | ||
|
|
d9466cad0e | ||
|
|
150443b014 | ||
|
|
9e36af7916 | ||
|
|
85b8675e7a | ||
|
|
ae594ad92c | ||
|
|
8d6fedf817 | ||
|
|
f4f8fa7c94 | ||
|
|
fb5fbb8088 | ||
|
|
e06a807d30 | ||
|
|
6b09842cb6 | ||
|
|
ca813389dc | ||
|
|
e624171ba1 | ||
|
|
0bbfb28992 | ||
|
|
ee7bd695fd | ||
|
|
1cc17bfe7a | ||
|
|
8ae492dfeb | ||
|
|
e8789d7cb9 | ||
|
|
0053cd0d0d | ||
|
|
c32477a223 | ||
|
|
5e1e92626c | ||
|
|
7fee85c80a | ||
|
|
a0c25941a8 | ||
|
|
5eb468bce0 | ||
|
|
7f8dd0e939 | ||
|
|
28701cb9dd | ||
|
|
9b7f492c65 | ||
|
|
6eda79d02d | ||
|
|
fb5cf8e3ac | ||
|
|
55e128cced | ||
|
|
13056af8b2 | ||
|
|
972c52891d | ||
|
|
e10a8d95f6 | ||
|
|
97f2be348c | ||
|
|
2b21312b36 | ||
|
|
3a818b6d45 | ||
|
|
1709ab6810 | ||
|
|
ce925ba56f | ||
|
|
4ad14f6a2c | ||
|
|
579e48edbb | ||
|
|
6a08f2281a | ||
|
|
91729437a0 | ||
|
|
3af7af0b8f | ||
|
|
1ddd00433e | ||
|
|
de160bb2d1 | ||
|
|
ff62b6742b | ||
|
|
6da0af94df | ||
|
|
5d87a274a5 | ||
|
|
df9667a497 | ||
|
|
e3e2ad4ae5 | ||
|
|
ace4ba3171 | ||
|
|
0935ae330a | ||
|
|
9e02b13ab3 | ||
|
|
5a486a940c | ||
|
|
d05ae4b444 | ||
|
|
73b0610d89 | ||
|
|
57e862712a | ||
|
|
73aec9ce63 | ||
|
|
a9fefcf600 | ||
|
|
59ce67e2e5 | ||
|
|
2182209a8a | ||
|
|
e29a8b3a9c | ||
|
|
ace3f37af4 | ||
|
|
37b6899660 | ||
|
|
570b12ec13 | ||
|
|
ac286ef734 | ||
|
|
b3663b5da2 | ||
|
|
d761d8b168 | ||
|
|
fe7c6fee34 | ||
|
|
9906daeca7 | ||
|
|
5fb54095d2 | ||
|
|
3fdc678aae | ||
|
|
a0088ccce1 | ||
|
|
be081929f4 | ||
|
|
b0b086d473 | ||
|
|
6798af52b6 | ||
|
|
4d5ebafa6d | ||
|
|
ec8873b178 | ||
|
|
c45f205593 | ||
|
|
027b2063ba | ||
|
|
b531c4c2fe | ||
|
|
4b010df99e | ||
|
|
5e4dd4be9c | ||
|
|
04d5896c1c | ||
|
|
f947274626 | ||
|
|
f6939f71a7 | ||
|
|
25aa17ad89 | ||
|
|
05ee057db5 | ||
|
|
297e2747f3 | ||
|
|
77de233117 | ||
|
|
02b67edaf5 | ||
|
|
8549ccfd8c | ||
|
|
ffd16b55a6 | ||
|
|
d744c997d8 | ||
|
|
6b421cc354 | ||
|
|
37ec29b225 | ||
|
|
ca7f6a26b5 | ||
|
|
9b69d22d7e | ||
|
|
4ab4cf8532 | ||
|
|
3341b282b7 | ||
|
|
bb3b836dbb | ||
|
|
1873c67540 | ||
|
|
8fd8f23a6b | ||
|
|
f225051348 | ||
|
|
b2e3fdef0f | ||
|
|
c13810ebaa | ||
|
|
19a982cf69 | ||
|
|
746a47982b | ||
|
|
ddb5390d88 | ||
|
|
fce20e514e | ||
|
|
327cbf48f5 | ||
|
|
0f1f509be7 | ||
|
|
c8f0c7e9ed | ||
|
|
a7989077ab | ||
|
|
7e34737b2b | ||
|
|
af66ed2505 | ||
|
|
ea4068757d | ||
|
|
0a0659d737 | ||
|
|
b6df4680df | ||
|
|
e04090b477 | ||
|
|
c9fb6f7bdb | ||
|
|
ad6b05ae17 | ||
|
|
29b18d9ab7 | ||
|
|
ad309cdeae | ||
|
|
e4322a716c | ||
|
|
90886c0760 | ||
|
|
957beeb0e9 | ||
|
|
522ad4cca6 | ||
|
|
dc76b24e5f | ||
|
|
e3e3053f32 | ||
|
|
c8c3f20840 | ||
|
|
f6682aae77 | ||
|
|
0ba1b73395 | ||
|
|
4c995eb498 | ||
|
|
144cfe70bf | ||
|
|
855f26c43d | ||
|
|
f86e159536 | ||
|
|
243c4e1e83 | ||
|
|
9ae7f186bc | ||
|
|
f8d114be42 | ||
|
|
2c70251df1 | ||
|
|
d380db25be | ||
|
|
e8938b1069 | ||
|
|
4a28333039 | ||
|
|
ad7f2b2aec | ||
|
|
ff665b37cb | ||
|
|
ce73843014 | ||
|
|
bae6f653d1 | ||
|
|
eec6d09959 | ||
|
|
c5fa8ed321 | ||
|
|
abc16b919d | ||
|
|
2de7cd32ea | ||
|
|
098aa18538 | ||
|
|
cf6281a5a7 | ||
|
|
f00710a57e | ||
|
|
c953904343 | ||
|
|
ddd36338da | ||
|
|
d76b6f878e | ||
|
|
f25ef8d682 | ||
|
|
33a2c01ea2 | ||
|
|
9c637df77e | ||
|
|
29072797ca | ||
|
|
db69ceade6 | ||
|
|
b9c248e7e7 | ||
|
|
d533b59ee3 | ||
|
|
5ad2980d69 | ||
|
|
ca36ac2ba1 | ||
|
|
ba675d6a55 | ||
|
|
e4c5a4f61b | ||
|
|
a8e52ad89f | ||
|
|
8cf4fb53aa | ||
|
|
1769ae54e4 | ||
|
|
e545679265 | ||
|
|
981080500b | ||
|
|
636d28b784 | ||
|
|
188783ac1a | ||
|
|
ff650d50a2 | ||
|
|
78689645dc | ||
|
|
26970579b8 | ||
|
|
04b4f53488 | ||
|
|
c310941f69 | ||
|
|
c02f146791 | ||
|
|
a631200cca | ||
|
|
6207a3f999 | ||
|
|
0bd01824f6 | ||
|
|
4465e2c46b | ||
|
|
34b309b99a | ||
|
|
c6725884bc | ||
|
|
a31738f6f1 | ||
|
|
39a2867ea8 | ||
|
|
468c3df82d | ||
|
|
d5b017407d | ||
|
|
4b044bd8e1 | ||
|
|
aeaf64b467 | ||
|
|
a137f817f5 | ||
|
|
ff87145537 | ||
|
|
667481c371 | ||
|
|
af71605769 | ||
|
|
4657a3bd0f | ||
|
|
cb7366f472 | ||
|
|
bf803e241f | ||
|
|
8a8d023f90 | ||
|
|
5b3aa45e58 | ||
|
|
c4403c523f | ||
|
|
07b89b2bad | ||
|
|
68b79f97f3 | ||
|
|
815d72065c | ||
|
|
e0dc721324 | ||
|
|
2f873edc9c | ||
|
|
d5f46a846a | ||
|
|
f5a923b9d1 | ||
|
|
36bab6ef06 | ||
|
|
5273900b0e | ||
|
|
1451344221 | ||
|
|
8ed9f779cd | ||
|
|
f548a966f5 | ||
|
|
67ad31b8b2 | ||
|
|
35f46eaa3f | ||
|
|
ccfb125f02 | ||
|
|
f29e3ce8d5 | ||
|
|
bcb4646d6b | ||
|
|
5b8af30da1 | ||
|
|
30fadaed7f | ||
|
|
2b10ecfa37 | ||
|
|
f7eb2b697e | ||
|
|
c01282a322 | ||
|
|
0e3f18ed70 | ||
|
|
e5b1d30f1b | ||
|
|
6746b751c4 | ||
|
|
544c69c61c | ||
|
|
0ab66db7b9 | ||
|
|
f7669c201f | ||
|
|
0b3fbdba87 | ||
|
|
3dad837ca6 | ||
|
|
d7e78059b0 | ||
|
|
01f7abfc63 | ||
|
|
e57e89b9d5 | ||
|
|
bcc1f93370 | ||
|
|
b161d72326 | ||
|
|
66c013682f | ||
|
|
9f3ba737d6 | ||
|
|
f86f5ad224 | ||
|
|
8b6b3ff28a | ||
|
|
4a3dc2cea2 | ||
|
|
bd0cfffe23 | ||
|
|
8c5ea7ec55 | ||
|
|
412d1b0a01 | ||
|
|
642be502c0 | ||
|
|
5c4a42caa0 | ||
|
|
e847788569 | ||
|
|
86ca5b3f16 | ||
|
|
9b1fbdbca6 | ||
|
|
97391fd4b9 | ||
|
|
68eda78704 | ||
|
|
7c52a1c04b | ||
|
|
9d34fc394c | ||
|
|
973c9872f9 | ||
|
|
eef7ba48dd | ||
|
|
299ff2b23f | ||
|
|
f8bfea8bae | ||
|
|
e199c33c6e | ||
|
|
08296cd66d | ||
|
|
197b503f3e | ||
|
|
129eb178eb | ||
|
|
6b70f5e490 | ||
|
|
4aa6d39fd8 | ||
|
|
51adaf2c47 | ||
|
|
ea5b901bcc | ||
|
|
f1f19841bd | ||
|
|
655ad34414 | ||
|
|
017eecb8e8 | ||
|
|
b8e382b011 | ||
|
|
c9af358e4b | ||
|
|
3afcfe3330 | ||
|
|
b521d8564a | ||
|
|
53a13e8bc6 | ||
|
|
f3f5e2e162 | ||
|
|
ec41d849bb | ||
|
|
1d547fe273 | ||
|
|
b52d8fbebe | ||
|
|
b61a2c722c | ||
|
|
c455d2c1de | ||
|
|
77070f5ab9 | ||
|
|
8d5f7160ac | ||
|
|
b167ce2913 | ||
|
|
3ac15ca8d1 | ||
|
|
f703d4fc3e | ||
|
|
77c461fed7 | ||
|
|
a89c21b06a | ||
|
|
b74aa6b14c | ||
|
|
0c4a791111 | ||
|
|
1feedd4d9c | ||
|
|
0ec1808956 | ||
|
|
546e7cafa4 | ||
|
|
d9926a1c21 | ||
|
|
e50969e31c | ||
|
|
a6d9998e1d | ||
|
|
a42f9e4ee3 | ||
|
|
f16db6cd80 | ||
|
|
4943606f4a | ||
|
|
87629dda81 | ||
|
|
71928b473e | ||
|
|
a0bee9fa0a | ||
|
|
0defd927f3 | ||
|
|
6c41e8f63f | ||
|
|
fa67a4e956 | ||
|
|
bf9352fb26 | ||
|
|
7573d4e1ba | ||
|
|
bfb483898f | ||
|
|
f363788d76 | ||
|
|
714056f157 | ||
|
|
1abc96fa27 | ||
|
|
0fa98479ad | ||
|
|
02f2171010 | ||
|
|
a5e7d0a90f | ||
|
|
9fb5134f64 | ||
|
|
9aeb23dfe9 | ||
|
|
e59d8c9378 | ||
|
|
0616667688 | ||
|
|
9747cc9e58 | ||
|
|
7b44dea4b1 | ||
|
|
18aea922e9 | ||
|
|
7d194aceb6 | ||
|
|
2722b8a3df | ||
|
|
fd754ff8f8 | ||
|
|
b7738e7af3 | ||
|
|
99bebabac9 | ||
|
|
0ed48b364a | ||
|
|
b38b8b9c18 | ||
|
|
5434856136 | ||
|
|
aa1eb2f40d | ||
|
|
7260d7883c | ||
|
|
154250f551 | ||
|
|
3e4fb92cfb | ||
|
|
0da713e278 | ||
|
|
94cb1545b3 | ||
|
|
411527a240 | ||
|
|
7777057d35 | ||
|
|
dc5ef9ad01 | ||
|
|
7471f65d95 | ||
|
|
5d4b450c52 | ||
|
|
483b1f51c9 | ||
|
|
ecac7a629e | ||
|
|
21209ff46b | ||
|
|
716bdc36fd | ||
|
|
4f120f3714 | ||
|
|
dd20a3ce7e | ||
|
|
c727c86245 | ||
|
|
82b4ec22be | ||
|
|
501f1e6de0 | ||
|
|
414d5b648c | ||
|
|
a237e7f860 | ||
|
|
07a3bef25c | ||
|
|
da67260c95 | ||
|
|
2f51285349 | ||
|
|
ab9c9068d4 | ||
|
|
6b4d7d7315 | ||
|
|
64465c1318 | ||
|
|
a506adea41 | ||
|
|
f5ae1ce00b | ||
|
|
738d6f1040 | ||
|
|
ba372197fb | ||
|
|
bde27ccec3 | ||
|
|
d2cf74027c | ||
|
|
bc966577ff | ||
|
|
fdf4dff561 | ||
|
|
fab6cbed75 | ||
|
|
051eede1ed | ||
|
|
0696cac50b | ||
|
|
0c2485e86c | ||
|
|
7d696a7063 | ||
|
|
53573e950f | ||
|
|
1e99983263 | ||
|
|
5409e43fb5 | ||
|
|
f33f891c54 | ||
|
|
6e55552292 | ||
|
|
e569f82dd3 | ||
|
|
1a4940bbda | ||
|
|
22dd3c8048 | ||
|
|
04b7648e00 | ||
|
|
be0759d465 | ||
|
|
339d939873 | ||
|
|
c1950e40e6 | ||
|
|
ad76bad8fd | ||
|
|
55737e4ff6 | ||
|
|
f3b4ddee6c | ||
|
|
758b504cf3 | ||
|
|
416f7c2600 | ||
|
|
b9f02f22c4 | ||
|
|
b635610409 | ||
|
|
d4d4d6217f | ||
|
|
be47320a05 | ||
|
|
9f3ce7551a | ||
|
|
5f3b79e21d | ||
|
|
56c12bd1ea | ||
|
|
3a6da7c594 | ||
|
|
9909a80d6a | ||
|
|
a52cae1dba | ||
|
|
61b01f82ef | ||
|
|
75b847132a | ||
|
|
32ec672311 | ||
|
|
e2812f722d | ||
|
|
aa64a5328e | ||
|
|
59510f509a | ||
|
|
a35c7bc81a | ||
|
|
02769929b3 | ||
|
|
1a09003a6e | ||
|
|
a827714823 | ||
|
|
8f9e76ca42 | ||
|
|
478ace984a | ||
|
|
028fd268b8 | ||
|
|
876a095166 | ||
|
|
14c3ff58a4 | ||
|
|
2819b302c3 | ||
|
|
9fb82f9687 | ||
|
|
df80deb070 | ||
|
|
5fb72d7c8f | ||
|
|
313d1d5d83 | ||
|
|
b7d6133593 | ||
|
|
5b6bb114ad | ||
|
|
56f082c9d4 | ||
|
|
a1b798e555 | ||
|
|
c91e08fbfd | ||
|
|
f882434547 | ||
|
|
f1ca17f6a1 | ||
|
|
fe7cda57e4 | ||
|
|
a3f9abcbd1 | ||
|
|
77041e2cd2 | ||
|
|
14235f171b | ||
|
|
1f90e3ce7f | ||
|
|
676d8bb624 | ||
|
|
4bcaf5d306 | ||
|
|
70d3ad3ca1 | ||
|
|
46debfb8b5 | ||
|
|
9a4b572d34 | ||
|
|
ddc75cc46b | ||
|
|
dafd0bc49a | ||
|
|
2cb912e4f4 | ||
|
|
91a513e87d | ||
|
|
efdb41f2a6 | ||
|
|
26b850c15c | ||
|
|
9941735ae7 | ||
|
|
29e5dc4413 | ||
|
|
3a660c5527 | ||
|
|
738991494a | ||
|
|
ee4c3ff1b8 | ||
|
|
60486bcc46 | ||
|
|
79eed5182e | ||
|
|
5de0f3f36a | ||
|
|
9f316e11bd | ||
|
|
c6d8f6da70 | ||
|
|
73fd98b82e | ||
|
|
6cb725391d | ||
|
|
c13facdaca | ||
|
|
e259474362 | ||
|
|
7740855a78 | ||
|
|
d605170f9f | ||
|
|
4734af747b | ||
|
|
5d17731b73 | ||
|
|
07a7fde825 | ||
|
|
049abef2d4 | ||
|
|
7c60b50a39 | ||
|
|
4f83c60296 | ||
|
|
cd5817b67e | ||
|
|
a4d580a6f8 | ||
|
|
ca43e634b5 | ||
|
|
85324f80fe | ||
|
|
56a7fcf189 | ||
|
|
8cd15a02cd | ||
|
|
05ad335ae9 | ||
|
|
ea771c17c5 | ||
|
|
7faeb2ff2b | ||
|
|
65ebfb16c9 | ||
|
|
44a65fc5de | ||
|
|
f031eb1ef2 | ||
|
|
b50d79542c | ||
|
|
8351543c0f | ||
|
|
8add78ed5e | ||
|
|
4b3a3d6faa | ||
|
|
71d012fa61 | ||
|
|
114df1f137 | ||
|
|
00adf7ff17 | ||
|
|
3f0415fa24 | ||
|
|
348d0c944e | ||
|
|
e9ba5fcaf3 | ||
|
|
48097745f6 | ||
|
|
1091ca969f | ||
|
|
09d62cc630 | ||
|
|
a2ead993e6 | ||
|
|
b330aa8dd5 | ||
|
|
1b8053a618 | ||
|
|
70e5ab3fde | ||
|
|
f4490f6918 | ||
|
|
dadd987bf4 | ||
|
|
a1ced29279 | ||
|
|
791d6c1336 | ||
|
|
10abb07960 | ||
|
|
040a5ddad5 | ||
|
|
e7eb04954d | ||
|
|
09b00fa4e3 | ||
|
|
74842fd6d4 | ||
|
|
f23b47ba17 | ||
|
|
15eedfbb12 | ||
|
|
cfc25e08dc | ||
|
|
1583eb36e4 | ||
|
|
406452f019 | ||
|
|
12b139beaf | ||
|
|
2ed1c22227 | ||
|
|
eb23ef1747 | ||
|
|
970b10d01b | ||
|
|
61b938d6fa | ||
|
|
0c34555b02 | ||
|
|
83a988e2e4 | ||
|
|
91efe1cb5a | ||
|
|
735241f049 | ||
|
|
dd82370a80 | ||
|
|
dab052e53d | ||
|
|
322b061632 | ||
|
|
43847f2244 | ||
|
|
8f9ba96c59 | ||
|
|
10406c73b3 | ||
|
|
67a6a12916 | ||
|
|
139122c57f | ||
|
|
fdd76b3461 | ||
|
|
959d7ca9d0 | ||
|
|
e490e5d0ab | ||
|
|
3b568b0943 | ||
|
|
b2e1b38864 | ||
|
|
5c6fe97b35 | ||
|
|
2071070f39 | ||
|
|
89a78a5f3c | ||
|
|
bc23a6bb05 | ||
|
|
ac1983eae3 | ||
|
|
33c5fc95b4 | ||
|
|
6a953394f4 | ||
|
|
c152a88ff6 | ||
|
|
cbf57e7421 | ||
|
|
3f3ae48ff4 | ||
|
|
27ca0db7a6 | ||
|
|
49f34fbf68 | ||
|
|
fe6094a822 | ||
|
|
8a30c7992d | ||
|
|
70eb9335bd | ||
|
|
da80f91e1c | ||
|
|
cc60d193ce | ||
|
|
3a05c421e0 | ||
|
|
0f99410ba1 | ||
|
|
442dadd6fe | ||
|
|
da9dd58f34 | ||
|
|
bd01d80ffc | ||
|
|
7eda72d440 | ||
|
|
c75339edcc | ||
|
|
b0b7244b3a | ||
|
|
a9e849ff4f | ||
|
|
4c95a4d7c6 | ||
|
|
eac9fabd48 | ||
|
|
e2a08fa824 | ||
|
|
d403749d09 | ||
|
|
582c2105a9 | ||
|
|
f39a34ccfa | ||
|
|
08f5b9f1f9 | ||
|
|
793962c5b8 | ||
|
|
0d20130d07 | ||
|
|
617090cfda | ||
|
|
a9e604d51d | ||
|
|
e599b86424 | ||
|
|
da9e584921 | ||
|
|
e9d764d7ad | ||
|
|
6268955778 | ||
|
|
4ddfc6e9a2 | ||
|
|
dcbc05a9cd | ||
|
|
4c705334fa | ||
|
|
c12da599b9 | ||
|
|
f685a48008 | ||
|
|
7c15e41da5 | ||
|
|
7b540f0226 | ||
|
|
e29c22e662 | ||
|
|
f0d3b47ad8 | ||
|
|
bfe7533546 | ||
|
|
880bf17dae | ||
|
|
c9da3363a0 | ||
|
|
9bd4ed3e60 | ||
|
|
68fcc19565 | ||
|
|
8e4efd071e | ||
|
|
f2ad9f6fad | ||
|
|
968c5eb767 | ||
|
|
19424e95db | ||
|
|
0f9ef2506f | ||
|
|
1f1195975f | ||
|
|
87fce8ef27 | ||
|
|
d2a4f64fd6 | ||
|
|
a357d84dce | ||
|
|
48c96bbaea | ||
|
|
c666794ce3 | ||
|
|
1ee3df6976 | ||
|
|
d4dea53ae9 | ||
|
|
d477a9222e | ||
|
|
69a9d29190 | ||
|
|
e2425592b6 | ||
|
|
964b2661d8 | ||
|
|
8b65b524d5 | ||
|
|
f1ac2cd336 | ||
|
|
e73d0df2b6 | ||
|
|
af3f483924 | ||
|
|
809b0eb1f5 | ||
|
|
b5f3bfce92 | ||
|
|
aeb2baa495 | ||
|
|
afc70c120e | ||
|
|
ea9aff1d3f | ||
|
|
cecae419fb | ||
|
|
df4db50904 | ||
|
|
decc4002a0 | ||
|
|
5bb563e3bc | ||
|
|
9be82891b0 | ||
|
|
c97685fe6c | ||
|
|
358b671033 | ||
|
|
92a4bf4441 | ||
|
|
d7f80eab68 | ||
|
|
e30b356eb0 | ||
|
|
09a0803116 | ||
|
|
20ffedc745 | ||
|
|
0b1ad27ba8 | ||
|
|
6a1b2f0387 | ||
|
|
5465647c2e | ||
|
|
a2baeed329 | ||
|
|
92aa464edb | ||
|
|
da29298d4d | ||
|
|
afcf0795c4 | ||
|
|
394e2815db | ||
|
|
f3bbe4bb1f | ||
|
|
2a3a18a283 | ||
|
|
431c80f4f0 | ||
|
|
9ac18c39a1 | ||
|
|
d1b7473418 | ||
|
|
1ad52f131c | ||
|
|
8064bbbc3f | ||
|
|
64e898f6db | ||
|
|
fb34519b96 | ||
|
|
91fed47648 | ||
|
|
c05691b546 | ||
|
|
1732166328 | ||
|
|
8edde7a4b3 | ||
|
|
d11a0c9f14 | ||
|
|
7be2abe6b5 | ||
|
|
4a62cd4ad8 | ||
|
|
6d21b9448a | ||
|
|
2d1a3073f6 | ||
|
|
d7b9886387 | ||
|
|
1543e529f1 | ||
|
|
4043f320fe | ||
|
|
32b834aa04 | ||
|
|
b43ec3d6f0 | ||
|
|
316a25dead | ||
|
|
bfe020e06c | ||
|
|
5aae560683 | ||
|
|
86e72ffefb | ||
|
|
6416198e9f | ||
|
|
3c4cd9d08b | ||
|
|
6b3b8c6f2e | ||
|
|
fdb02ee5ca | ||
|
|
35f85ddd86 | ||
|
|
e30fa7d15e | ||
|
|
c476305149 | ||
|
|
45ad7696fe | ||
|
|
d86cd4e4b4 | ||
|
|
0e84d71559 | ||
|
|
5f14704eee | ||
|
|
a191db84f2 | ||
|
|
52dca859c7 | ||
|
|
e4d69f38b0 | ||
|
|
97fc001180 | ||
|
|
f544316314 | ||
|
|
ecdebb315f | ||
|
|
1f523be72d | ||
|
|
f2a20a0a80 | ||
|
|
e5a2efaa65 | ||
|
|
c44cb3246d | ||
|
|
9cfd9d7ce0 | ||
|
|
42a09ff17a | ||
|
|
66d90dd412 | ||
|
|
d5dfe7d457 | ||
|
|
0db0b4e302 | ||
|
|
635d6a19ef | ||
|
|
777844ae0c | ||
|
|
a10a4ad900 | ||
|
|
c330d694c7 | ||
|
|
73555f9088 | ||
|
|
e1ec65bd53 | ||
|
|
65b8e52d80 | ||
|
|
4b7a418e28 | ||
|
|
73d917b76e | ||
|
|
527a6003e2 | ||
|
|
26c731a382 | ||
|
|
8297563978 | ||
|
|
1da0526072 | ||
|
|
635a67afac | ||
|
|
c7e7c819a2 | ||
|
|
fbf677d9b2 | ||
|
|
d37b788ea8 | ||
|
|
cb336ff666 | ||
|
|
e2e5433beb | ||
|
|
c7b1038a9d | ||
|
|
c170fed6f9 | ||
|
|
d43aa12987 | ||
|
|
8e38b4f83c | ||
|
|
db4ae19246 | ||
|
|
82a89c6bfe | ||
|
|
166c70cab3 | ||
|
|
de78fe38c8 | ||
|
|
96fa69ff6b | ||
|
|
39d94bd3ea | ||
|
|
695ca29274 | ||
|
|
02e8da6c98 | ||
|
|
ca69ad8beb | ||
|
|
e42637226f | ||
|
|
ae25582178 | ||
|
|
5d85792178 | ||
|
|
acba9c0f61 | ||
|
|
ad7302a032 | ||
|
|
9f3bead99f | ||
|
|
38afc89407 | ||
|
|
c161bb287c | ||
|
|
06d7169674 | ||
|
|
8bf1640932 | ||
|
|
da50c888fe | ||
|
|
62dc8e4131 | ||
|
|
dc554ca61f | ||
|
|
cbb9149a82 | ||
|
|
dab7348da8 | ||
|
|
378e8a6224 | ||
|
|
289fdcc52b | ||
|
|
83e6e3e31f | ||
|
|
c387031252 | ||
|
|
403bd77eff | ||
|
|
b397c46184 | ||
|
|
0a6c4c31b2 | ||
|
|
02fcf184b5 | ||
|
|
b978126bb0 | ||
|
|
9f51d19087 | ||
|
|
859184000f | ||
|
|
1ad2f18c9e | ||
|
|
06a49a5f9e | ||
|
|
b811927e0e | ||
|
|
83cdd0a0c8 | ||
|
|
53c69cd2ce | ||
|
|
c6cf8e992d | ||
|
|
0c53e8c2d0 | ||
|
|
e1901e97c2 | ||
|
|
d694150372 | ||
|
|
4ab586aaf1 | ||
|
|
8a5209ad93 | ||
|
|
308fdf6e9a | ||
|
|
9f4e96fdfa | ||
|
|
c36af35730 | ||
|
|
424f478c3f | ||
|
|
5e0c272061 | ||
|
|
d99bdca094 | ||
|
|
187069bec9 | ||
|
|
01de768f09 | ||
|
|
73a861abf1 | ||
|
|
b4f60ee95c | ||
|
|
85e587a882 | ||
|
|
d91f6dc1b5 | ||
|
|
78c0d8cc88 | ||
|
|
b23d2ad43b | ||
|
|
ef68946e74 | ||
|
|
a5574f9189 | ||
|
|
ba61a92897 | ||
|
|
68fc3704e9 | ||
|
|
69867015e9 | ||
|
|
923f18ef76 | ||
|
|
7e8d254b95 | ||
|
|
6325c3f14a | ||
|
|
074a23e6b4 | ||
|
|
2fb61534a1 | ||
|
|
12b6c6ccf7 | ||
|
|
55ed7bd34d | ||
|
|
eeeef3eab5 | ||
|
|
96413b1604 | ||
|
|
2278fe42e5 | ||
|
|
3a183f869f | ||
|
|
6c5828822c | ||
|
|
9dd824ba50 | ||
|
|
d744ea3fca | ||
|
|
07352e82f1 | ||
|
|
1003cc9bf9 | ||
|
|
0ea5f4ac3a | ||
|
|
2b717997e2 | ||
|
|
20ebacf489 | ||
|
|
c6ef0e8887 | ||
|
|
f761d583b5 | ||
|
|
cee1ac150e | ||
|
|
71b47ae3ef | ||
|
|
36e3fda554 | ||
|
|
2b44a2c9bd | ||
|
|
af3b454805 | ||
|
|
3a0f3eaa50 | ||
|
|
80eb8d9e26 | ||
|
|
30c4136c4d | ||
|
|
83e4475021 | ||
|
|
c071d6d9f6 | ||
|
|
1df426aa5c | ||
|
|
023482406f | ||
|
|
04ba40981f | ||
|
|
fc10bdf24d | ||
|
|
28ad79c97a | ||
|
|
7661ad6653 | ||
|
|
e1436063ff | ||
|
|
3e11a28cd9 | ||
|
|
3ed80f3139 | ||
|
|
a698cc8112 | ||
|
|
916aaacb68 | ||
|
|
aaeb8150b7 | ||
|
|
5ba90cd8ea | ||
|
|
e9127523db | ||
|
|
92004f2e7e | ||
|
|
0eefc7a43c | ||
|
|
3a666702af | ||
|
|
3c0c939689 | ||
|
|
413f7c64e5 | ||
|
|
6f47c1ca20 | ||
|
|
abeebfe070 | ||
|
|
1a002eb23d | ||
|
|
71bc15aca1 | ||
|
|
65b24ce557 | ||
|
|
cfdd5edc49 | ||
|
|
b9035d3e0a | ||
|
|
e504913b0f | ||
|
|
af4133e3c9 | ||
|
|
a788b7e747 | ||
|
|
bb288f0284 | ||
|
|
f90abe9530 | ||
|
|
47c50c079d | ||
|
|
46bab7e4b9 | ||
|
|
3b0fea5fae | ||
|
|
443516cdda | ||
|
|
22fb49fa90 | ||
|
|
957d187ae4 | ||
|
|
b88ea6735b | ||
|
|
51de8fd10a | ||
|
|
2ef6052536 | ||
|
|
394b1e6351 | ||
|
|
c95d068ef5 | ||
|
|
dbda35ffe1 | ||
|
|
6396e23a2a | ||
|
|
529b4bd185 | ||
|
|
85b51e4e77 | ||
|
|
e53a25cbae | ||
|
|
41e7145973 | ||
|
|
db238cc23f | ||
|
|
75e9c798e0 | ||
|
|
99527051b5 | ||
|
|
57e0cc5442 | ||
|
|
73f45d87d5 | ||
|
|
ae88ba986e | ||
|
|
d6247902ec | ||
|
|
a566c28a49 | ||
|
|
2eddb63a83 | ||
|
|
fc7d5b055d | ||
|
|
87c8953e8e | ||
|
|
45d27a52f1 | ||
|
|
bed98303a3 | ||
|
|
d22acc59c9 | ||
|
|
c064e8d62f | ||
|
|
099a2cb586 | ||
|
|
042fe2a9d0 | ||
|
|
ff1c1107f3 | ||
|
|
41a3fd0fd0 | ||
|
|
b9169a5670 | ||
|
|
2ecd5fa28d | ||
|
|
e719b6cc41 | ||
|
|
67b8124a1d | ||
|
|
51ec499c89 | ||
|
|
3a4df25db2 | ||
|
|
37cf78ef45 | ||
|
|
727c622659 | ||
|
|
74a778e65f | ||
|
|
1fc0c9fe8a | ||
|
|
740d8ec5ab | ||
|
|
0bcc477d46 | ||
|
|
d2679f59c5 | ||
|
|
4ee147ea34 | ||
|
|
f1ca61d7d7 | ||
|
|
a80b5cf19b | ||
|
|
44ac84767e | ||
|
|
a40d7ae4dd | ||
|
|
35297f8d4f | ||
|
|
6f4202408c | ||
|
|
0b6548a282 | ||
|
|
faf5821816 | ||
|
|
188673b746 | ||
|
|
287c70e361 | ||
|
|
f6b44af998 | ||
|
|
84c3d9674f | ||
|
|
47d3758820 | ||
|
|
573ff3a24f | ||
|
|
32fcc22cb3 | ||
|
|
daba1238b5 | ||
|
|
d125567f4a | ||
|
|
993eca9327 | ||
|
|
e314844a4d | ||
|
|
017bc564af | ||
|
|
e076ff9085 | ||
|
|
2789493a5f | ||
|
|
4ed0635447 | ||
|
|
1904e504be | ||
|
|
834715ea2f | ||
|
|
380a3bbff4 | ||
|
|
6219326e02 | ||
|
|
6c4de5106b | ||
|
|
e936705840 | ||
|
|
9b2603b6f6 | ||
|
|
88856b847c | ||
|
|
f679878f7b | ||
|
|
f33acf8758 | ||
|
|
a846a4c643 | ||
|
|
899c2bb9cc | ||
|
|
f8f95e2dbd | ||
|
|
77c63511d8 | ||
|
|
0be5a6ab2b | ||
|
|
9802e74859 | ||
|
|
8e7d6eb151 | ||
|
|
5c18e4f114 | ||
|
|
fd2eafa7c6 | ||
|
|
422b8472fe | ||
|
|
5b213b0504 | ||
|
|
ad27d06979 | ||
|
|
c4b1251d0a | ||
|
|
01891f8815 | ||
|
|
adb68450ce | ||
|
|
2520f6fe49 | ||
|
|
c9278bfcdf | ||
|
|
8b838ff9ea | ||
|
|
154bdf0bca | ||
|
|
ed436c6f0c | ||
|
|
ae5dd2da4f | ||
|
|
f4b61e8c8d | ||
|
|
e49a3d377f | ||
|
|
b631b552bb | ||
|
|
3f21581a81 | ||
|
|
bb62ecf157 | ||
|
|
a268ab35ea | ||
|
|
62baec1841 | ||
|
|
7bca61f5bb | ||
|
|
ecf12a60e8 | ||
|
|
6de85cb047 | ||
|
|
39257717d8 | ||
|
|
b54762a8f6 | ||
|
|
bcae86196c | ||
|
|
7adfea8ca2 | ||
|
|
eab1a77683 | ||
|
|
84f5e0c0de | ||
|
|
2ce3900071 | ||
|
|
bf2c1f3e9e | ||
|
|
8ccd8a008d | ||
|
|
9513c1a8d6 | ||
|
|
0a1be2bfc3 | ||
|
|
8c6727949c | ||
|
|
ff9b717bf6 | ||
|
|
8c834a4ff6 | ||
|
|
8c01004219 | ||
|
|
8555b65c50 | ||
|
|
304fa5ecac | ||
|
|
88e630170e | ||
|
|
da8bdd62c8 | ||
|
|
54abeab80b | ||
|
|
1dc8a9f0e7 | ||
|
|
a62d54425c | ||
|
|
c8b2591ac2 | ||
|
|
ee1d8e1091 | ||
|
|
672fc8d79b | ||
|
|
84ff1a680a | ||
|
|
90c899407a | ||
|
|
55868eecd0 | ||
|
|
50dc98367c | ||
|
|
c4d3030d24 | ||
|
|
c6f101884b | ||
|
|
c0c0526fc8 | ||
|
|
375c88b110 | ||
|
|
a65f63747b | ||
|
|
a21edddf27 | ||
|
|
a88c23b6e8 | ||
|
|
216e37bf33 | ||
|
|
7bb3987acc | ||
|
|
6a147a17af | ||
|
|
2b7529e905 | ||
|
|
1ed321f964 | ||
|
|
2aee1b86f3 | ||
|
|
b5fc21b9f4 | ||
|
|
44581dbef5 | ||
|
|
205448c1e8 | ||
|
|
2d11c6ab29 | ||
|
|
6859c22b69 | ||
|
|
2d5413fc3b | ||
|
|
a6aa0e4cbf | ||
|
|
163848ab3b | ||
|
|
03747ba93e | ||
|
|
095c390df7 | ||
|
|
20597b3632 | ||
|
|
4728735acf | ||
|
|
9dcbd005f0 | ||
|
|
0ad2eb34c7 | ||
|
|
0e8a15e813 | ||
|
|
5b0d6a59cf | ||
|
|
fd3dc7e5fb | ||
|
|
c37edfd3e9 | ||
|
|
4a99b1df4b | ||
|
|
12e9b7eafa | ||
|
|
de1261ba28 | ||
|
|
5ee5a89a7f | ||
|
|
1ad2475f9e | ||
|
|
5b5675cc12 | ||
|
|
e699f6781e | ||
|
|
5f13c1cd9c | ||
|
|
a577944ab5 | ||
|
|
17ec3b0c2d | ||
|
|
fb75137540 | ||
|
|
6f87164ad6 | ||
|
|
a4d82cfe1e | ||
|
|
9f21eee2ec | ||
|
|
a40246d312 | ||
|
|
4a5aad0948 | ||
|
|
85ae7e9c9a | ||
|
|
2098b94b47 | ||
|
|
59ad6265a1 | ||
|
|
067572c6dd | ||
|
|
7f03f68fcc | ||
|
|
de862f9f1b | ||
|
|
b5e31c89c0 | ||
|
|
e898400fbd | ||
|
|
3ac7de7a22 | ||
|
|
ade66e7ece | ||
|
|
6673f9e39d | ||
|
|
2db2c0f0b7 | ||
|
|
17dc638c18 | ||
|
|
d6e28c42e5 | ||
|
|
6d475c40de | ||
|
|
ed7891bf01 | ||
|
|
e17da71a70 | ||
|
|
610bef9ff5 | ||
|
|
961c7d0f78 | ||
|
|
c1ba47beee | ||
|
|
ac8e5be9f4 | ||
|
|
c76952534e | ||
|
|
f0060718de | ||
|
|
982ab9e496 | ||
|
|
b74bcf2274 | ||
|
|
645cb5833d | ||
|
|
dc328e0c4a | ||
|
|
92c85bd20d | ||
|
|
f629eb8cb2 | ||
|
|
e4f41ff61d | ||
|
|
dae6ecb680 | ||
|
|
a57a7b1a76 | ||
|
|
03073b366b | ||
|
|
1bd8a9e744 | ||
|
|
0a5c991ab5 | ||
|
|
93deb84499 | ||
|
|
c4d4011c63 | ||
|
|
3d12f8d246 | ||
|
|
c3e720279c | ||
|
|
f1027ed198 | ||
|
|
fe3c5e4e8e | ||
|
|
d110131ad6 | ||
|
|
10bc1a9acc | ||
|
|
3f899f83ff | ||
|
|
fc05768374 | ||
|
|
03b57df630 | ||
|
|
4de3b6dc80 | ||
|
|
c7bbfef19a | ||
|
|
7f1130b52b | ||
|
|
2d696f46c3 | ||
|
|
2f43e4bc66 | ||
|
|
f8c23488c9 | ||
|
|
1e2cda9239 | ||
|
|
20cba9e89f | ||
|
|
f6d67ac260 | ||
|
|
74904b9cf2 | ||
|
|
82059645f1 | ||
|
|
13e9f18403 | ||
|
|
875821f2ba | ||
|
|
cc3be3aeed | ||
|
|
72af3c0489 | ||
|
|
65e54f6ed1 | ||
|
|
10196496f3 | ||
|
|
86f08862e4 | ||
|
|
83c726a34f | ||
|
|
a0415f73d4 | ||
|
|
93068f10ec | ||
|
|
7142c81c05 | ||
|
|
c0421a57da | ||
|
|
8f1ec1dfdf | ||
|
|
222dc8a239 | ||
|
|
0e4d2e7277 | ||
|
|
2bbff77e48 | ||
|
|
3315c67f0f | ||
|
|
b879bcb1eb | ||
|
|
ae99135c8d | ||
|
|
1defb38a6f | ||
|
|
56bc9e12ee | ||
|
|
116ebe0494 | ||
|
|
5ec843dcc8 | ||
|
|
a78b2d84ed | ||
|
|
cf4d80fc65 | ||
|
|
8118bc93a8 | ||
|
|
c772bc45c6 | ||
|
|
c1e7be3b8e | ||
|
|
17ecc56e83 | ||
|
|
6a42e6f6d4 | ||
|
|
75ba961e97 | ||
|
|
c2d5ce0ca2 | ||
|
|
32645b80c4 | ||
|
|
ff626ac763 | ||
|
|
59f8144c50 | ||
|
|
5a7c931293 | ||
|
|
1373d40fea | ||
|
|
3274bb54ad | ||
|
|
7db124068f | ||
|
|
39e2ffe212 | ||
|
|
0a213ddf03 | ||
|
|
5dc4cbdf82 | ||
|
|
1434e5a22e | ||
|
|
9acc1e1e97 | ||
|
|
daa47546c7 | ||
|
|
c5194d0a8f | ||
|
|
7ece8ff85c | ||
|
|
a4effeb3f9 | ||
|
|
d3f28a1d7f | ||
|
|
03cddd0acf | ||
|
|
04a737e04c | ||
|
|
966c54bef5 | ||
|
|
efcd9dfc35 | ||
|
|
db44a6e948 | ||
|
|
d6553fc6a7 | ||
|
|
fc9014f7ec | ||
|
|
b39ab76118 | ||
|
|
90777f78c9 | ||
|
|
7cb803ad5c | ||
|
|
8e063829c4 | ||
|
|
139c6be370 | ||
|
|
b6ac249c3c | ||
|
|
5e103b5fb7 | ||
|
|
de5be62da5 | ||
|
|
b5f608d026 | ||
|
|
58fe352fda | ||
|
|
b105093dcd | ||
|
|
d1c401fe7a | ||
|
|
964aa42b04 | ||
|
|
bf8660b21c | ||
|
|
43863a70c8 | ||
|
|
bd5a70c712 | ||
|
|
909ff4b8a9 | ||
|
|
bcfc62a3f2 | ||
|
|
d1924867db | ||
|
|
abfbd55305 | ||
|
|
b3611524f4 | ||
|
|
a63613dba0 | ||
|
|
7fec2b02d4 | ||
|
|
608a98c873 | ||
|
|
f951e5356b | ||
|
|
080ee87e07 | ||
|
|
fa60b9ae94 | ||
|
|
0d33ae52c6 | ||
|
|
77e4b28092 | ||
|
|
4817437d31 | ||
|
|
354b5a9365 | ||
|
|
58502b38d3 | ||
|
|
d44880dfa9 | ||
|
|
0c63632cc2 | ||
|
|
b93523c0b1 | ||
|
|
7ef40de98b | ||
|
|
196ec25682 | ||
|
|
c85af12d45 | ||
|
|
e452d1f5b4 | ||
|
|
ffea268d2e | ||
|
|
8e676db633 | ||
|
|
f6d74012b7 | ||
|
|
32dfc11c23 | ||
|
|
aad0ea6e23 | ||
|
|
05de2e998c | ||
|
|
24780d99e6 | ||
|
|
7c1cf61728 | ||
|
|
eb10d08671 | ||
|
|
abb0549e4b | ||
|
|
5327ea13ac | ||
|
|
be8ceae6e6 | ||
|
|
67ae033de7 | ||
|
|
161f7ced96 | ||
|
|
72bc11b180 | ||
|
|
15c2538532 | ||
|
|
fd9dd9343b | ||
|
|
1b8a1d4140 | ||
|
|
e132d10aec | ||
|
|
3dbda2dda2 | ||
|
|
a0105b45ae | ||
|
|
551b7768fc | ||
|
|
d6967db761 | ||
|
|
b0967cae69 | ||
|
|
401a799a1b | ||
|
|
ba98518c69 | ||
|
|
5e26e2ab1d | ||
|
|
08eca827b6 | ||
|
|
6b2b5af344 | ||
|
|
f32fbd9ed1 | ||
|
|
e3511d0ee0 | ||
|
|
fa13a6616f | ||
|
|
d4c2f91182 | ||
|
|
084fd8df63 | ||
|
|
328131b7aa | ||
|
|
85003429af | ||
|
|
6db77dcf75 | ||
|
|
1cde86823d | ||
|
|
dbd88e6aef | ||
|
|
45418583e9 | ||
|
|
77a1133723 | ||
|
|
25c208d81d | ||
|
|
67f87db511 | ||
|
|
7de96275dd | ||
|
|
e13d0bf656 | ||
|
|
8ed9f7effa | ||
|
|
12ab556477 | ||
|
|
509f8dab89 | ||
|
|
77429b6dd3 | ||
|
|
84d20d9e43 | ||
|
|
0c13703da3 | ||
|
|
b97b7a7493 | ||
|
|
be2951b45f | ||
|
|
1dd1a705b5 | ||
|
|
e4e80ff0cb | ||
|
|
9508ea982b | ||
|
|
47d655ea7f | ||
|
|
62271bf6ce | ||
|
|
0b27ac2f5c | ||
|
|
6fd481df97 | ||
|
|
b915e43391 | ||
|
|
c96b295700 | ||
|
|
9067da2df8 | ||
|
|
8cf2f52f7a | ||
|
|
681352ac3b | ||
|
|
d9c662d51f | ||
|
|
ad631d563b | ||
|
|
7cbaf11dda | ||
|
|
3be63549c0 | ||
|
|
17c6db6c33 | ||
|
|
86316b1828 | ||
|
|
efc3a69dbf | ||
|
|
ec883e1901 | ||
|
|
060814daa8 | ||
|
|
c53492a76a | ||
|
|
43675717b8 | ||
|
|
b21ed2fa36 | ||
|
|
0214baad5a | ||
|
|
c2d3ed2acc | ||
|
|
0339c8d025 | ||
|
|
0e0be0243b | ||
|
|
a2ce2447a6 | ||
|
|
9a1076256d | ||
|
|
72ef38d4a7 | ||
|
|
d397ce68dc | ||
|
|
5e20b7976f | ||
|
|
36f712b949 | ||
|
|
a446775d80 | ||
|
|
ccd7f0825a | ||
|
|
d0896ea7c4 | ||
|
|
a73d1e4b1c | ||
|
|
d05bb2a0af | ||
|
|
6765901687 | ||
|
|
c5d05ac0cf | ||
|
|
939003c1f1 | ||
|
|
a10f3a8aec | ||
|
|
ef663810a2 | ||
|
|
ada67a6a4f | ||
|
|
b6a5d1ad5a | ||
|
|
d8c5a63bc2 | ||
|
|
bcb2db62c9 | ||
|
|
079ef93121 | ||
|
|
b2789c598e | ||
|
|
92a93c1217 | ||
|
|
96b70835f9 | ||
|
|
7fa3b7a267 | ||
|
|
f3fc76e3c8 | ||
|
|
3216f4b257 | ||
|
|
ce1d897575 | ||
|
|
17e108a10a | ||
|
|
5bc4ab899f | ||
|
|
44faf1080c | ||
|
|
e354c5c2a8 | ||
|
|
04bc9005ae | ||
|
|
3c92c69bc7 | ||
|
|
52ee132d92 | ||
|
|
7ca0aedcfc | ||
|
|
a2c4037a24 | ||
|
|
d7b0073ce1 | ||
|
|
585b68d2ae | ||
|
|
89d2d648cc | ||
|
|
7532f24d58 | ||
|
|
69a5df2f98 | ||
|
|
1c65908cdb | ||
|
|
3aaf013dd1 | ||
|
|
5f2705ab07 | ||
|
|
9af620982c | ||
|
|
1ee6a78cb7 | ||
|
|
bf4ee48efa | ||
|
|
08e6d222a2 | ||
|
|
cf98b0e261 | ||
|
|
a24589d46e | ||
|
|
84533b6cad | ||
|
|
8dca38e979 | ||
|
|
662bed6a00 | ||
|
|
ae5e0cb02b | ||
|
|
0b3e1c4706 | ||
|
|
ce08a7a932 | ||
|
|
5d5f21bfc5 | ||
|
|
fcccedc588 | ||
|
|
0d73a49327 | ||
|
|
6239dd96f2 | ||
|
|
57a4700fb9 | ||
|
|
2b676dc5fc | ||
|
|
3f267b1795 | ||
|
|
7a4c9f5f4c | ||
|
|
3330aa6f6a | ||
|
|
8929f88e6d | ||
|
|
5348808bf5 | ||
|
|
fccba1af2a | ||
|
|
26d92c80ed | ||
|
|
9605e24655 | ||
|
|
7d0269d2ce | ||
|
|
52ffdb0a55 | ||
|
|
681d6bbdc5 | ||
|
|
867b82b6de | ||
|
|
5101ef4b02 | ||
|
|
ee9e238179 | ||
|
|
29030b54c9 | ||
|
|
c9fcc7f148 | ||
|
|
d1f4a31b5e | ||
|
|
b691d3123b | ||
|
|
f68e36f8c2 | ||
|
|
4db119c01b | ||
|
|
bbd7115564 | ||
|
|
8d36367fe2 | ||
|
|
3deca8fccd | ||
|
|
7af24c4d3a | ||
|
|
7f0ce4e94e | ||
|
|
5c48d3fbba | ||
|
|
00420ef9ca | ||
|
|
b9d30595d6 | ||
|
|
c1f4f1fdb6 | ||
|
|
342333f72a | ||
|
|
94cdc47786 | ||
|
|
cc511e7b60 | ||
|
|
bb2af791e9 | ||
|
|
f3f4b332ae | ||
|
|
84ac79bb08 | ||
|
|
be0c8495cd | ||
|
|
cbd0709d1c | ||
|
|
371d635da8 | ||
|
|
85216966fa | ||
|
|
1c823e9d1f | ||
|
|
25e338a098 | ||
|
|
81175b0717 | ||
|
|
d23c907a94 | ||
|
|
018f4155eb | ||
|
|
9ab0a1f5f1 | ||
|
|
c043b337b1 | ||
|
|
090bc6fa79 | ||
|
|
b63db1c1aa | ||
|
|
0287ac794e | ||
|
|
0005221533 | ||
|
|
23d2c0f1c6 | ||
|
|
377b6f05ea | ||
|
|
3ac2e9d31f | ||
|
|
b76a29a69a | ||
|
|
abe090ec1f | ||
|
|
dff05c71e6 | ||
|
|
f6f4742410 | ||
|
|
977004c350 | ||
|
|
fdc7d13ad1 | ||
|
|
355dd5cb24 | ||
|
|
123dd5fe2d | ||
|
|
953e3190ca | ||
|
|
44a0e21795 | ||
|
|
fafaf567f9 | ||
|
|
870cc1d928 | ||
|
|
d86ee93801 | ||
|
|
87b7328463 | ||
|
|
3f846cf6b8 | ||
|
|
f2ce8c3b62 | ||
|
|
4223657ab8 | ||
|
|
930128a7ea | ||
|
|
db447440ff | ||
|
|
b70d38dc10 | ||
|
|
a27d105dcd | ||
|
|
67e44b0f2c | ||
|
|
bf840700e4 | ||
|
|
47e16dbee3 | ||
|
|
66f678023f | ||
|
|
132971f8eb | ||
|
|
3f04a4d635 | ||
|
|
17c8e839b6 | ||
|
|
348bdcd7b7 | ||
|
|
a32443c63b | ||
|
|
7e53934ce3 | ||
|
|
7c2b553364 | ||
|
|
409fc837ab | ||
|
|
6d0ada7f45 | ||
|
|
af63372d2b | ||
|
|
3e91f757a9 | ||
|
|
498491ec05 | ||
|
|
85b77b81ca | ||
|
|
5bf2ec5a74 | ||
|
|
9e715089a4 | ||
|
|
1a852bc365 | ||
|
|
9326ce53ec | ||
|
|
d8217c364a | ||
|
|
3a34fd181d | ||
|
|
fcb7233b25 | ||
|
|
fe53a376a3 | ||
|
|
65842cd99e | ||
|
|
bf6ed643e0 | ||
|
|
a0beb5fa26 | ||
|
|
f54bcc1f16 | ||
|
|
ca0d09c50f | ||
|
|
81c3224076 | ||
|
|
7a1d466fb2 | ||
|
|
83f4c48c8a | ||
|
|
acd742d225 | ||
|
|
d1e7b4e381 | ||
|
|
67f591a9ce | ||
|
|
7ff988275f | ||
|
|
363050f44c | ||
|
|
dbe04c4207 | ||
|
|
d59a332ef9 | ||
|
|
105b431e4c | ||
|
|
ba79f4c1f9 | ||
|
|
8b2dcf7018 | ||
|
|
44621f7326 | ||
|
|
8ead8f7ea6 | ||
|
|
7f9402bd22 | ||
|
|
cbd38327e7 | ||
|
|
06f898cc12 | ||
|
|
6a9ab8bc0e | ||
|
|
9a0061c511 | ||
|
|
7a3aac1843 | ||
|
|
da1f4b3ede | ||
|
|
dac740ee17 | ||
|
|
28030d7edb | ||
|
|
648196319f | ||
|
|
c75cb67c44 | ||
|
|
cd1bb2bafa | ||
|
|
a9d2dc6144 | ||
|
|
46b9388bb0 | ||
|
|
a1a97d663e | ||
|
|
cac3c159bc | ||
|
|
43166130b5 | ||
|
|
14f21378e3 | ||
|
|
bd42aeab46 | ||
|
|
cde6a3a00c | ||
|
|
96b763067e | ||
|
|
dd5ba062cc | ||
|
|
ba161ec572 | ||
|
|
43f613d9be | ||
|
|
2277d143fa | ||
|
|
6b6d9e64bd | ||
|
|
f016a99f24 | ||
|
|
2eed9d64ce | ||
|
|
1688b6dda9 | ||
|
|
33aedc887a | ||
|
|
258d0ea97e | ||
|
|
d3641766a5 | ||
|
|
b25d5c5d33 | ||
|
|
352d7f477e | ||
|
|
1fcf35ad3b | ||
|
|
c8054e569a | ||
|
|
ef48eca9ca | ||
|
|
906d2fbadf | ||
|
|
2b579aeb4f | ||
|
|
e9e55b0812 | ||
|
|
49a3845135 | ||
|
|
21dac6c05d | ||
|
|
1d9b84a5af | ||
|
|
a688745bdc | ||
|
|
459d824c50 | ||
|
|
96019f4a02 | ||
|
|
896015bf53 | ||
|
|
df3e7a9248 | ||
|
|
b2d3d15e97 | ||
|
|
08dfd263ba | ||
|
|
abaabe92d6 | ||
|
|
257b42b87f | ||
|
|
31bc94160a | ||
|
|
9e5d2c5bb7 | ||
|
|
2df2a989af | ||
|
|
4a800b311f | ||
|
|
a4a13a3825 | ||
|
|
a28df6123f | ||
|
|
c5c43c4541 | ||
|
|
0954f580fa | ||
|
|
3a2254c91f | ||
|
|
4aeec4bb60 | ||
|
|
750b2ad6a8 | ||
|
|
86c276f538 | ||
|
|
166569200a | ||
|
|
e903d00968 | ||
|
|
7d5d95ad53 | ||
|
|
cc6c452854 | ||
|
|
f492c78e2e | ||
|
|
6b83d08228 | ||
|
|
dc415b761e | ||
|
|
f1034eb657 | ||
|
|
ac9ebe1439 | ||
|
|
7b5f7c041b | ||
|
|
8ce9b53093 | ||
|
|
0b9e52bd5f | ||
|
|
5dd728d802 | ||
|
|
ce7c97b6ba | ||
|
|
9a4c049675 | ||
|
|
cb8449a66d | ||
|
|
621467717d | ||
|
|
506c716cf2 | ||
|
|
9f625b0a0d | ||
|
|
bc1b4131cb | ||
|
|
80ba3c5932 | ||
|
|
e63420a8c2 | ||
|
|
e02d8ad8d2 | ||
|
|
d300e6bf21 | ||
|
|
1729388634 | ||
|
|
c654c7630a | ||
|
|
3f3b26fb0e | ||
|
|
0921180b90 | ||
|
|
14df240f5b | ||
|
|
2090911363 | ||
|
|
3cc7be0fa6 | ||
|
|
6728b8c1a3 | ||
|
|
450c26c471 | ||
|
|
7ec1121cc8 | ||
|
|
f84e288ad7 | ||
|
|
8e31366431 | ||
|
|
1bfa04f80e | ||
|
|
98cbc0ea79 | ||
|
|
dca1115196 | ||
|
|
96882175f1 | ||
|
|
484841fc9e | ||
|
|
8052c76489 | ||
|
|
3477acee48 | ||
|
|
2c4b998170 | ||
|
|
0a9c7ff6cf | ||
|
|
cd71038655 | ||
|
|
1894aed261 | ||
|
|
f3832bcaa8 | ||
|
|
436335e9a3 | ||
|
|
a30eb194d5 | ||
|
|
8becbb8b08 | ||
|
|
e0c2c77c2a | ||
|
|
6f2e1c2415 | ||
|
|
fc0ad8674b | ||
|
|
19c67ab724 | ||
|
|
a046b6e105 | ||
|
|
8017301de5 | ||
|
|
46528783ef | ||
|
|
6f4bb6cd2c | ||
|
|
2cf31e905b | ||
|
|
28a60db5aa | ||
|
|
496f70fc0d | ||
|
|
9ede4c5f3c | ||
|
|
214a526945 | ||
|
|
d5b756413a | ||
|
|
af99176581 | ||
|
|
57e825dfe7 | ||
|
|
e06dd129dd | ||
|
|
00baddcd9e | ||
|
|
7e92820c50 | ||
|
|
5692e20fd5 | ||
|
|
3b3c9334c8 | ||
|
|
96dc0a318a | ||
|
|
a4223aac38 | ||
|
|
2bb751d9fa | ||
|
|
3b620112ca | ||
|
|
99526219b7 | ||
|
|
d818b618af | ||
|
|
c64700e7ae | ||
|
|
5bd1917705 | ||
|
|
178c6c20cd | ||
|
|
92d71cc7fa | ||
|
|
227eca7d28 | ||
|
|
9399b0ea52 | ||
|
|
17dca254a3 | ||
|
|
f6b50d2387 | ||
|
|
a9ce0218c1 | ||
|
|
7bb5a960fd | ||
|
|
e6b04d1b50 | ||
|
|
12613356fc | ||
|
|
3894450b10 | ||
|
|
ec07f6ec83 | ||
|
|
a7a10d03c9 | ||
|
|
ef99d6ce3d | ||
|
|
0ac06d77f1 | ||
|
|
469e233428 | ||
|
|
86a0f9cf9b | ||
|
|
e6a91d291d | ||
|
|
bf35972714 | ||
|
|
e0c645a270 | ||
|
|
e42734c3f3 | ||
|
|
eab78ab99c | ||
|
|
f2491c88c8 | ||
|
|
1b175025fe | ||
|
|
ccdf7184be | ||
|
|
7764136211 | ||
|
|
0307801d51 | ||
|
|
72cf8dd8a0 | ||
|
|
3c2b464dfa | ||
|
|
361404fd59 | ||
|
|
762c91b7f1 | ||
|
|
f2a8d4d289 | ||
|
|
9ee52d85d7 | ||
|
|
5ed9f02c4d | ||
|
|
378ebad1c8 | ||
|
|
e44e0fab9f | ||
|
|
c434077728 | ||
|
|
6e47e79790 | ||
|
|
d9ea3082fb | ||
|
|
2d63c26936 | ||
|
|
3cdd01aa1b | ||
|
|
d25195447a | ||
|
|
aa8ab2fc89 | ||
|
|
d664baff26 | ||
|
|
3275d4c6fa | ||
|
|
cd0d003197 | ||
|
|
cfeeb7af2e | ||
|
|
ac887d3afb | ||
|
|
e294ccae24 | ||
|
|
72070f292b | ||
|
|
823c618d24 | ||
|
|
51cb6a0a44 | ||
|
|
a1b1ec3d11 | ||
|
|
595b6a4f6c | ||
|
|
daa4647712 | ||
|
|
c67668d6dd | ||
|
|
9cfaa9c7b0 | ||
|
|
c5ea586882 | ||
|
|
f2a3a37dff | ||
|
|
01dd540d7e | ||
|
|
8142080633 | ||
|
|
9920a3e8fc | ||
|
|
f7d8e6c40c | ||
|
|
4ecf09f9e6 | ||
|
|
47a8369d79 | ||
|
|
6805fa2fa0 | ||
|
|
4d6b9611ae | ||
|
|
16afdfd874 | ||
|
|
701fff03d2 | ||
|
|
8e0575ca9b | ||
|
|
5e8f51a963 | ||
|
|
be3d2188d6 | ||
|
|
18e429a87e | ||
|
|
3576a8fd9f | ||
|
|
f260cd031c | ||
|
|
18c4b536f2 | ||
|
|
fa51db449f | ||
|
|
cb9a05ac77 | ||
|
|
f1f22019f5 | ||
|
|
6d79a1cdfc | ||
|
|
ad5eb2f8d6 | ||
|
|
39d56d6b65 | ||
|
|
a291415326 | ||
|
|
4ad7456428 | ||
|
|
73f36858bb | ||
|
|
fe3f0332f7 | ||
|
|
718fd97612 | ||
|
|
f8ff45b212 | ||
|
|
f5c0b0d316 | ||
|
|
ba51045d9e | ||
|
|
fa34dd7bd3 | ||
|
|
9f0fb8f6a8 | ||
|
|
a42f9fd4e2 | ||
|
|
e66005563e | ||
|
|
8cad20585d | ||
|
|
a8b75dc4df | ||
|
|
e4455962c6 | ||
|
|
20f85745e7 | ||
|
|
feb8d5b82f | ||
|
|
eb8922f346 | ||
|
|
84eb95466b | ||
|
|
3dd8beb380 | ||
|
|
ae77406b8e | ||
|
|
2d16069211 | ||
|
|
d18314fa05 | ||
|
|
26a9ce7b29 | ||
|
|
76417d4446 | ||
|
|
cffc78ad6a | ||
|
|
dcf55c7e32 | ||
|
|
e565cd4404 | ||
|
|
5934ccbb74 | ||
|
|
e39969a0d0 | ||
|
|
d68185aa28 | ||
|
|
4cab151ed2 | ||
|
|
8ac9b77e5c | ||
|
|
1b9da5d978 | ||
|
|
ab2b7358cb | ||
|
|
8ceea85813 | ||
|
|
d0a812d2df | ||
|
|
3dad2e1c0f | ||
|
|
70e4399334 | ||
|
|
00f8c2d46f | ||
|
|
0dd4b52b63 | ||
|
|
88c17926e4 | ||
|
|
541192c941 | ||
|
|
2e9f054ec0 | ||
|
|
2aa34882b7 | ||
|
|
27f8ef2f33 | ||
|
|
2cbe21c791 | ||
|
|
0988056471 | ||
|
|
95c3f57b30 | ||
|
|
068f191c0d | ||
|
|
6bf6c9215b | ||
|
|
a65afa8090 | ||
|
|
8155784990 | ||
|
|
44725e485d | ||
|
|
e98e2a0b07 | ||
|
|
943064bb51 | ||
|
|
7149a8ae4f | ||
|
|
3c7cf94643 | ||
|
|
3bd35d1883 | ||
|
|
6f3d70b5e2 | ||
|
|
257a0dee75 | ||
|
|
e995cd928c | ||
|
|
292d7c3fdf | ||
|
|
0273cd44b0 | ||
|
|
3203a7dd8c | ||
|
|
86b0adc82c | ||
|
|
ba49f20f68 | ||
|
|
a3ee26da64 | ||
|
|
a9b62a2ece | ||
|
|
49567f1f3e | ||
|
|
94fffb332b | ||
|
|
dc2e64c92b | ||
|
|
06fb7c671b | ||
|
|
ef93cdf4a8 | ||
|
|
4ad90e2d52 | ||
|
|
7c0e4dfb56 | ||
|
|
9ec069104f | ||
|
|
7d21d60dba | ||
|
|
ed8562c300 | ||
|
|
22ec1c3498 | ||
|
|
9cc90b1fbe | ||
|
|
0c9f22507f | ||
|
|
9c870e4276 | ||
|
|
5cffe693b0 | ||
|
|
e01615fd1e | ||
|
|
c1daa857a5 | ||
|
|
3928c4e9ae | ||
|
|
32799fef5c | ||
|
|
e1b03b4a71 | ||
|
|
e6ed592b8a | ||
|
|
6f4560184c | ||
|
|
e5039c478a | ||
|
|
8901514506 | ||
|
|
21fe376d1d | ||
|
|
e22ef6c481 | ||
|
|
2bb01093c0 | ||
|
|
36c814d26e | ||
|
|
d769b74d61 | ||
|
|
601495fa0f | ||
|
|
1998633739 | ||
|
|
0194217f9d | ||
|
|
b0bbb8b693 | ||
|
|
cab84af72e | ||
|
|
74500eacca | ||
|
|
1105e61f29 | ||
|
|
b7cf279d6d | ||
|
|
c614e550d9 | ||
|
|
452a30d7af | ||
|
|
49e79620fd | ||
|
|
ae5a721df9 | ||
|
|
0dd5f2915a | ||
|
|
a0ebd444ad | ||
|
|
0c6072c4e4 | ||
|
|
8917264110 | ||
|
|
e90d606f0a | ||
|
|
5bb2d64ddb | ||
|
|
bc66dc45e6 | ||
|
|
7087935656 | ||
|
|
5822daa63d | ||
|
|
4808c7ef39 | ||
|
|
7071126770 | ||
|
|
2101daef5a | ||
|
|
083065f433 | ||
|
|
4cfc4a5a94 | ||
|
|
1c7ee737e6 | ||
|
|
39439b80f5 | ||
|
|
396480cf94 | ||
|
|
3e03527930 | ||
|
|
4fa724461e | ||
|
|
1e2018ce83 | ||
|
|
3fcf17cb79 | ||
|
|
f9fc3a42cc | ||
|
|
76bc28ab1e | ||
|
|
f47f86ef02 | ||
|
|
31268ffa24 | ||
|
|
0634be9724 | ||
|
|
f56c6a18c1 | ||
|
|
aa4c506fcd | ||
|
|
d3a479b7fa | ||
|
|
92fb0e829a | ||
|
|
43a9928537 | ||
|
|
c8b408beae | ||
|
|
8e3982dd42 | ||
|
|
e83f805b8f | ||
|
|
be98afe34d | ||
|
|
f53dadcc6d | ||
|
|
90ab65f8c7 | ||
|
|
abb0fcb203 | ||
|
|
eef4f33a29 | ||
|
|
0226440a2d | ||
|
|
9d770d6084 | ||
|
|
7f0297dc44 | ||
|
|
49f3855407 | ||
|
|
905d493fd7 | ||
|
|
5def2a09bd | ||
|
|
a98aa66620 | ||
|
|
631a268996 | ||
|
|
85074f5ac6 | ||
|
|
12a8ed39d4 | ||
|
|
b9ac5e9e76 | ||
|
|
2758a734a2 | ||
|
|
01f3131c81 | ||
|
|
2ca9236864 | ||
|
|
3bb711837e | ||
|
|
ed8798e82f | ||
|
|
38474961fd | ||
|
|
3dd38e7b7f | ||
|
|
3711a97657 | ||
|
|
911411e630 | ||
|
|
c02cc199bc | ||
|
|
dd6c21e092 | ||
|
|
7801ca86b9 | ||
|
|
10fc288c91 | ||
|
|
b8cda53bd3 | ||
|
|
43806d524d | ||
|
|
e0a97a030f | ||
|
|
33ba288622 | ||
|
|
d5516dee00 | ||
|
|
06e0741a52 | ||
|
|
0b93445380 | ||
|
|
483ba5ea1c | ||
|
|
18076ac9b7 | ||
|
|
ad15ca7104 | ||
|
|
53117ac204 | ||
|
|
51a8c109ab | ||
|
|
ea25e0ee55 | ||
|
|
e6fdae431f | ||
|
|
34afc272fd | ||
|
|
a5673fcb28 | ||
|
|
5c3c506638 | ||
|
|
ecd5eb02c5 | ||
|
|
3be57dc4a3 | ||
|
|
a93caf3cfe | ||
|
|
26ebfc04b0 | ||
|
|
8782f6d232 | ||
|
|
5faf443038 | ||
|
|
8eacd13ce7 | ||
|
|
d3e1b72d38 | ||
|
|
b5e1bd5705 | ||
|
|
4bef0a1e62 | ||
|
|
3e5f09be0b | ||
|
|
e86e77ad67 | ||
|
|
3c4bb9ff4e | ||
|
|
a890dadfd2 | ||
|
|
6b4374583a | ||
|
|
78f4171a7a | ||
|
|
f8a99a391e | ||
|
|
2564f763d7 | ||
|
|
377a2b9e07 | ||
|
|
045993001c | ||
|
|
affc446690 | ||
|
|
255ee646c2 | ||
|
|
0308ec564e | ||
|
|
6cafec8ae6 | ||
|
|
8ef87be482 | ||
|
|
6c57047362 | ||
|
|
e29bc6912b | ||
|
|
ce57b8b6df | ||
|
|
d81a9029db | ||
|
|
620ae7790b | ||
|
|
23b2b7144b | ||
|
|
bf4311cd9b | ||
|
|
8f7adf79a3 | ||
|
|
97b164d03b | ||
|
|
61e7e531c2 | ||
|
|
ceb652915f | ||
|
|
cdaf504ab8 | ||
|
|
9fb5aad157 | ||
|
|
a6301d45f4 | ||
|
|
b83d069266 | ||
|
|
960b9a9664 | ||
|
|
acb45caa42 | ||
|
|
39060b528a | ||
|
|
4a36323f1b | ||
|
|
c6281b2680 | ||
|
|
5b8b7d1412 | ||
|
|
53e5139b99 | ||
|
|
2b8ce83c9b | ||
|
|
52638c68f5 | ||
|
|
400ff1c812 | ||
|
|
d360f17a59 | ||
|
|
a6ee6be960 | ||
|
|
47911f9544 | ||
|
|
48025c2279 | ||
|
|
a68302e50b | ||
|
|
333a08ebf9 | ||
|
|
989c9a7317 | ||
|
|
975370c084 | ||
|
|
c3c776bc6a | ||
|
|
9f4b906e6c | ||
|
|
804900df36 | ||
|
|
3781f6cf39 | ||
|
|
227da2377a | ||
|
|
ffb3a9f526 | ||
|
|
6936c0e2ab | ||
|
|
108242042e | ||
|
|
70652abf97 | ||
|
|
e202b407ec | ||
|
|
2cc89e60cc | ||
|
|
d536944beb | ||
|
|
1a8ef3cdab | ||
|
|
7be33eba48 | ||
|
|
46ed91b53d | ||
|
|
73f6fc428a | ||
|
|
44d260f911 | ||
|
|
07249fc395 | ||
|
|
bc1e8e01f3 | ||
|
|
fe8e77e556 | ||
|
|
b0833084a6 | ||
|
|
3cacaa5dad | ||
|
|
e89bd30db5 | ||
|
|
2a9d933a81 | ||
|
|
81f3d893d9 | ||
|
|
05c91082e3 | ||
|
|
7267558ba1 | ||
|
|
ac6803e7b7 | ||
|
|
ffabf8b013 | ||
|
|
e9b71a0d28 | ||
|
|
efbfe66f21 | ||
|
|
6886063703 | ||
|
|
c04e1ad401 | ||
|
|
223b90d0d4 | ||
|
|
692b2cfb79 | ||
|
|
447a86c922 | ||
|
|
e3a2bd3a1e | ||
|
|
f0be6a4b9e | ||
|
|
bdab5d5f6e | ||
|
|
15a4246ead | ||
|
|
9a71845700 | ||
|
|
22f0a1547c | ||
|
|
de0ab43bc1 | ||
|
|
e12cc01aa4 | ||
|
|
71c697288b | ||
|
|
a7d1daee93 | ||
|
|
77a99cc61d | ||
|
|
fb337418a5 | ||
|
|
9d312ab208 | ||
|
|
06be0a1997 | ||
|
|
9e4509b846 | ||
|
|
fc1f0eeda7 | ||
|
|
3d5c094804 | ||
|
|
6abc94ec07 | ||
|
|
6837e5a6a0 | ||
|
|
9761abf3b5 | ||
|
|
599a562170 | ||
|
|
d29a251547 | ||
|
|
31da4bc566 | ||
|
|
0f1a180e15 | ||
|
|
01a45a53aa | ||
|
|
59400d38a9 | ||
|
|
5155b0f608 | ||
|
|
d919f8d50a | ||
|
|
d67aa7c19d | ||
|
|
7a982169c9 | ||
|
|
f2510d60fa | ||
|
|
1e0ea57dc4 | ||
|
|
70b87f2eb6 | ||
|
|
94b2ee627c | ||
|
|
e30a2dd2d7 | ||
|
|
7e07daf8cb | ||
|
|
981906ecd1 | ||
|
|
90fe4c5124 | ||
|
|
2452447c81 | ||
|
|
93f0bb8307 | ||
|
|
47fc08bffe | ||
|
|
c0f2024a2e | ||
|
|
28f3e190c8 | ||
|
|
c4090b670d | ||
|
|
ddf112378b | ||
|
|
b25cce464a | ||
|
|
a2297558ff | ||
|
|
84cdf0cacc | ||
|
|
9e99e5bef9 | ||
|
|
9023ba4a81 | ||
|
|
83488848e1 | ||
|
|
f5a92d6cc3 | ||
|
|
3e8047e583 | ||
|
|
440ac51cf0 | ||
|
|
d3293b889d | ||
|
|
b4b0b34e5a | ||
|
|
fa3d1156a6 | ||
|
|
0eb05b827f | ||
|
|
0c245bc271 | ||
|
|
d65ad1bf15 | ||
|
|
43cbbe111b | ||
|
|
9ceb8a717a | ||
|
|
8331de424a | ||
|
|
98dbdf72b3 | ||
|
|
51a2d09eb7 | ||
|
|
22f0ef6d6b | ||
|
|
975deca85b | ||
|
|
3bbb502387 | ||
|
|
0023dffd0b | ||
|
|
b715e522cf | ||
|
|
4b0b8315a9 | ||
|
|
a654f146d1 | ||
|
|
67b46a151d | ||
|
|
83c7e1e129 | ||
|
|
a6371e2e66 | ||
|
|
7768baa4d1 | ||
|
|
a9a5907a0f | ||
|
|
dc32d1f3f3 | ||
|
|
cbdaa1369f | ||
|
|
8fb20fcdf8 | ||
|
|
72bf226608 | ||
|
|
d4b5699403 | ||
|
|
1dc27be015 | ||
|
|
230a3eb400 | ||
|
|
e39382dedd | ||
|
|
fd016f4507 | ||
|
|
9d728b365d | ||
|
|
ddc0283339 | ||
|
|
b8fdb452be | ||
|
|
6b416ce6be | ||
|
|
ef0392e854 | ||
|
|
efbf184fe8 | ||
|
|
dd577fb857 | ||
|
|
ebd90dbb1a | ||
|
|
c9e700f079 | ||
|
|
3c2d73d161 | ||
|
|
343de8b8ab | ||
|
|
c645b906f3 | ||
|
|
9c1d1ef268 | ||
|
|
ade0483641 | ||
|
|
03a401e477 | ||
|
|
9994521b8c | ||
|
|
e5fd1924db | ||
|
|
cbdd042adc | ||
|
|
a9419da09c | ||
|
|
ccd7104cdc | ||
|
|
1cf4b5ce47 | ||
|
|
1badb3b5d5 | ||
|
|
038d216f18 | ||
|
|
9e3f843291 | ||
|
|
e166ddf46f | ||
|
|
31e1be7570 | ||
|
|
d793b7c03f | ||
|
|
9a715267ad | ||
|
|
eafa432cc6 | ||
|
|
d95e538020 | ||
|
|
adbe8c409a | ||
|
|
58e600f408 | ||
|
|
d34e55c370 | ||
|
|
fbcbcdc001 | ||
|
|
4227a325a5 | ||
|
|
d115507502 | ||
|
|
43d8252050 | ||
|
|
674b4ab647 | ||
|
|
fe8fc1081a | ||
|
|
c7748fedab | ||
|
|
c392efb481 | ||
|
|
1ddd9dd52a | ||
|
|
aa171dcc18 | ||
|
|
b4d8cb7bc1 | ||
|
|
f672e4016f | ||
|
|
76e3dec723 | ||
|
|
d0c3fa0150 | ||
|
|
609f6ce66d | ||
|
|
7298b6c846 | ||
|
|
acec9c4fd7 | ||
|
|
9cdbde4f5e | ||
|
|
f9147a0706 | ||
|
|
33364edfb3 | ||
|
|
5e9ccdec63 | ||
|
|
071aca60be | ||
|
|
133e4d5c51 | ||
|
|
fd56461d5f | ||
|
|
d5f59f8c86 | ||
|
|
a5d8b27671 | ||
|
|
f3f25d5d40 | ||
|
|
f118812c34 | ||
|
|
98dbc95913 | ||
|
|
145c1d214c | ||
|
|
b62a8e3e3e | ||
|
|
e47240931a | ||
|
|
a84874426d | ||
|
|
f38dfd9231 | ||
|
|
510c4a3ef1 | ||
|
|
e7e52c24f5 | ||
|
|
e2a574e2a0 | ||
|
|
ba6ef53ef9 | ||
|
|
c93a28c641 | ||
|
|
7088a679a2 | ||
|
|
04c02a1eb8 | ||
|
|
1536b5a9d6 | ||
|
|
bab756a5d0 | ||
|
|
8c763fe458 | ||
|
|
886255e38a | ||
|
|
0240e75426 | ||
|
|
7102ed8026 | ||
|
|
ebf481e1a1 | ||
|
|
5a52e91350 | ||
|
|
18e458154a | ||
|
|
015e1ab183 | ||
|
|
2a4c799471 | ||
|
|
41487426f5 | ||
|
|
0d24250aa7 | ||
|
|
2050e2f886 | ||
|
|
013e8479af | ||
|
|
27535a7f78 | ||
|
|
333d226ed0 | ||
|
|
04a9dec952 | ||
|
|
6ee76b7154 | ||
|
|
36b1c08ad7 | ||
|
|
7b35d5e9d4 | ||
|
|
6d4ca071a5 | ||
|
|
684a3d30a6 | ||
|
|
25740d27bf | ||
|
|
fb0a52a34a | ||
|
|
c852970cf6 | ||
|
|
def21cc87e | ||
|
|
488c1eb87b | ||
|
|
acaa725478 | ||
|
|
f351550534 | ||
|
|
e8df7e8da5 | ||
|
|
af4252bc80 | ||
|
|
695ffedef9 | ||
|
|
66ecf39efe | ||
|
|
5ad21d7e98 | ||
|
|
1c3e03837c | ||
|
|
7968fa3779 | ||
|
|
31009bb1f6 | ||
|
|
3b8532f3fb | ||
|
|
f45616e5f6 | ||
|
|
ef5125f8f4 | ||
|
|
bf2e07074b | ||
|
|
20695ef369 | ||
|
|
e391f4b17b | ||
|
|
2bd344549b | ||
|
|
e96779de48 | ||
|
|
eb54337c40 | ||
|
|
916a020173 | ||
|
|
c2e4fe983d | ||
|
|
81e898375b | ||
|
|
3c0dea811d | ||
|
|
a6ac0f8965 | ||
|
|
4e1eb03287 | ||
|
|
fcf0f8291d | ||
|
|
0ed71fa027 | ||
|
|
affe21f7c1 | ||
|
|
9facf7897d | ||
|
|
8422402c39 | ||
|
|
9374e0f445 | ||
|
|
19ed233118 | ||
|
|
faa4fff4dd | ||
|
|
2276e7677b | ||
|
|
b5fde6dfa5 | ||
|
|
784d666a8e | ||
|
|
c035910df9 | ||
|
|
efccb6ac82 | ||
|
|
93f9c2ab6b | ||
|
|
4a993cd79e | ||
|
|
02325d2ede | ||
|
|
9c83464b95 | ||
|
|
b1bbd70f0f | ||
|
|
c31d11bfe0 | ||
|
|
c8ec85d649 | ||
|
|
e291f3d257 | ||
|
|
7d27d2ea5e | ||
|
|
dc22846d58 | ||
|
|
c9aaabb5d4 | ||
|
|
335d5d5d72 | ||
|
|
51d793bec1 | ||
|
|
249dcd967e | ||
|
|
302972e9fc | ||
|
|
31b380b266 | ||
|
|
a869dfea85 | ||
|
|
12838c6294 | ||
|
|
49c7102547 | ||
|
|
5cc3338267 | ||
|
|
1ae8972859 | ||
|
|
adcd2c8eac | ||
|
|
45ff355835 | ||
|
|
f8bf3afeae | ||
|
|
f703da1516 | ||
|
|
a582deee2c | ||
|
|
3047bdf653 | ||
|
|
12be9e818f | ||
|
|
a0478f98af | ||
|
|
5e2c62db2f | ||
|
|
d488d796f4 | ||
|
|
f794b1e1aa | ||
|
|
8c425c758c | ||
|
|
0b9e912297 | ||
|
|
d35d2b269f | ||
|
|
fa84ed412d | ||
|
|
16951099d1 | ||
|
|
050ba302cb | ||
|
|
c1f90a99f4 | ||
|
|
510097cc37 | ||
|
|
6a83721c55 | ||
|
|
ca9795c30a | ||
|
|
dc2fa246a9 | ||
|
|
b46bb611b3 | ||
|
|
aa55d759f5 | ||
|
|
2043579f71 | ||
|
|
346e31efa0 | ||
|
|
b504d63117 | ||
|
|
b4b1728b6f | ||
|
|
21792386d8 | ||
|
|
63a2ac21e1 | ||
|
|
c42b206292 | ||
|
|
733d6a6b16 | ||
|
|
8d2725234e | ||
|
|
0823711106 | ||
|
|
860e9eb8c9 | ||
|
|
3d2092ee23 | ||
|
|
8855efebc0 | ||
|
|
7725577a53 | ||
|
|
668e3f664f | ||
|
|
9e51733c71 | ||
|
|
6b39a5621d | ||
|
|
0d46e11826 | ||
|
|
ff58207034 | ||
|
|
b3d76b7e5c | ||
|
|
4d6c816abb | ||
|
|
f35ceaee0a | ||
|
|
a64a2a65a9 | ||
|
|
1a75abffa5 | ||
|
|
c6a0f5d3f9 | ||
|
|
bb75e3ea55 | ||
|
|
814eebf976 | ||
|
|
e08d4f28aa | ||
|
|
6f3c65dc64 | ||
|
|
0a3ada4fea | ||
|
|
8bdf7917c4 | ||
|
|
67d16a086e | ||
|
|
b8018f12ba | ||
|
|
607780b7f9 | ||
|
|
af1c497759 | ||
|
|
8e331cfc65 | ||
|
|
edf811fa02 | ||
|
|
b25b7693ba | ||
|
|
9dc9459f3a | ||
|
|
37b92967c5 | ||
|
|
768504e956 | ||
|
|
2571accfc3 | ||
|
|
0d2abdb5d9 | ||
|
|
79200a8611 | ||
|
|
123ae985d5 | ||
|
|
659d1c7cf7 | ||
|
|
281cd7c057 | ||
|
|
63e8766091 | ||
|
|
18da582c87 | ||
|
|
0562cf99ba | ||
|
|
60ac702038 | ||
|
|
1dedb96478 | ||
|
|
7537722a44 | ||
|
|
4ebd69193e | ||
|
|
d4d92ac1a7 | ||
|
|
5385d1fa80 | ||
|
|
dbee2f1996 | ||
|
|
6dd70926fa | ||
|
|
5dfc0918c3 | ||
|
|
2eb14658d3 | ||
|
|
c1f196dbec | ||
|
|
ce108acebb | ||
|
|
0555e2c781 | ||
|
|
6bfd1f1727 | ||
|
|
baa77c8ae3 | ||
|
|
7235dbadfd | ||
|
|
ecec41025f | ||
|
|
799843cc97 | ||
|
|
16e91baa79 | ||
|
|
f2536445f7 | ||
|
|
ede70ee3a4 | ||
|
|
66ed427a57 | ||
|
|
c9e63e9fdb | ||
|
|
ddf7f5c131 | ||
|
|
660e40d07e | ||
|
|
9f3db5a70b | ||
|
|
1a59730782 | ||
|
|
20029e7ce8 | ||
|
|
fcb7950811 | ||
|
|
4eb57e1e9a | ||
|
|
1d52e2cc77 | ||
|
|
209aceeb14 | ||
|
|
ae70875f45 | ||
|
|
eda7410f4c | ||
|
|
e60141b4dd | ||
|
|
5b21742095 | ||
|
|
5665de5ee7 | ||
|
|
d5b9be0393 | ||
|
|
d2d9b45a81 | ||
|
|
9ebbdb9b0b | ||
|
|
48da345e79 | ||
|
|
edbfa46cbc | ||
|
|
90709a6de4 | ||
|
|
992c2fa2d4 | ||
|
|
ed915fed92 | ||
|
|
8aa29d5a66 | ||
|
|
9604e0aad2 | ||
|
|
25d053cbf2 | ||
|
|
055257a210 | ||
|
|
50cfb997cc | ||
|
|
d662c4c0cc | ||
|
|
457d98c860 | ||
|
|
6bb166aaaa | ||
|
|
cca9bc5176 | ||
|
|
8b6b25220d | ||
|
|
3c3f1b7ff2 | ||
|
|
57d89131e9 | ||
|
|
7c6d1896a4 | ||
|
|
ad83c7f704 | ||
|
|
6b52d040b1 | ||
|
|
404fa89937 | ||
|
|
89377556cd | ||
|
|
ec93114347 | ||
|
|
df1c5ce314 | ||
|
|
a0e4b6e266 | ||
|
|
0de39b64cb | ||
|
|
36a7b4e275 | ||
|
|
d3cc8e0ac0 | ||
|
|
db1ce4eeeb | ||
|
|
c22cbbf828 | ||
|
|
5acee73fc8 | ||
|
|
466c337bcb | ||
|
|
98a468a101 | ||
|
|
47c58c01d1 | ||
|
|
a9edf85a69 | ||
|
|
e7a1862517 | ||
|
|
f930f37d35 | ||
|
|
4feb57e895 | ||
|
|
712e3eb120 | ||
|
|
d8e423df1a | ||
|
|
09aa0dc676 | ||
|
|
83174de420 | ||
|
|
8ff0197a43 | ||
|
|
a2b5db0003 | ||
|
|
2803ec2e96 | ||
|
|
ddd4f675a2 | ||
|
|
d271dd2cce | ||
|
|
ebfdd37451 | ||
|
|
f6d6110aaa | ||
|
|
a0730cf264 | ||
|
|
ec61b3a5fc | ||
|
|
521f2294cb | ||
|
|
2f0674807c | ||
|
|
de0f46b947 | ||
|
|
1a57fa095f | ||
|
|
167242fec0 | ||
|
|
81208d78ac | ||
|
|
da8b01771f | ||
|
|
725fbe946b | ||
|
|
b99ecb4dc9 | ||
|
|
208a96b211 | ||
|
|
43774455cc | ||
|
|
5b61e077e0 | ||
|
|
921cc3e5db | ||
|
|
51dce3d161 | ||
|
|
c10f013fc2 | ||
|
|
2874d68bdb | ||
|
|
11e83eb7e7 | ||
|
|
9ec9a8705e | ||
|
|
170635e3a6 | ||
|
|
a5d1444ef4 | ||
|
|
55708b39c3 | ||
|
|
8c5ebdff36 | ||
|
|
1c84f324a1 | ||
|
|
3dba09f339 | ||
|
|
7ebf8e66c9 | ||
|
|
62218fe59d | ||
|
|
95d9bb6dfc | ||
|
|
33986075ef | ||
|
|
766905ba9f | ||
|
|
a29c64b6c7 | ||
|
|
777e1cabc5 | ||
|
|
396e97fc94 | ||
|
|
9c6a4505c8 | ||
|
|
238c3adad1 | ||
|
|
c1d0a8b5ce | ||
|
|
08ce24ec3f | ||
|
|
79eb7623ef | ||
|
|
b9e64d0472 | ||
|
|
4f500149af | ||
|
|
281b8714ef | ||
|
|
d5be3cce9c | ||
|
|
8dcefaf2e3 | ||
|
|
48e3432a63 | ||
|
|
69d3c611aa | ||
|
|
36827e1134 | ||
|
|
351ac4a2c0 | ||
|
|
36fff59a38 | ||
|
|
1e60a4386a | ||
|
|
e9f1b53ae6 | ||
|
|
5016839b90 | ||
|
|
faf35e6082 | ||
|
|
d07a6edd2f | ||
|
|
553d4e9283 | ||
|
|
7cef52478d | ||
|
|
e7ce362d22 | ||
|
|
c551c8b31b | ||
|
|
9c36e71081 | ||
|
|
c9c57af5f7 | ||
|
|
2516496993 | ||
|
|
3b565b5f97 | ||
|
|
0742976138 | ||
|
|
1a63663c85 | ||
|
|
00a20fc8a5 | ||
|
|
6ab4fb368c | ||
|
|
fa39bb0a50 | ||
|
|
645663cdfe | ||
|
|
ee2bcbb41d | ||
|
|
12b4ebf8d4 | ||
|
|
8da4750ee2 | ||
|
|
d22df2915c | ||
|
|
e77d96cf89 | ||
|
|
ae28ba84d2 | ||
|
|
b3f3b01958 | ||
|
|
52e9cab1c1 | ||
|
|
1baaaa40cc | ||
|
|
b8ed420058 | ||
|
|
ed16ee3029 | ||
|
|
7338b16c18 | ||
|
|
f529441400 | ||
|
|
03664d0426 | ||
|
|
652cfb7caf | ||
|
|
5540fbaec2 | ||
|
|
0a0b473765 | ||
|
|
df2d041483 | ||
|
|
ffc6e19548 | ||
|
|
d874d7661f | ||
|
|
1d66e714e6 | ||
|
|
d98a863b82 | ||
|
|
3b6790c7dc | ||
|
|
5ee3a9a9ca | ||
|
|
dd26fa67f2 | ||
|
|
89f5e60422 | ||
|
|
c616165f81 | ||
|
|
103832742d | ||
|
|
3e7e0bcb18 | ||
|
|
7d3d8f20ab | ||
|
|
e1e3ce980a | ||
|
|
7855a32579 | ||
|
|
9c92afa5fe | ||
|
|
edac498d03 | ||
|
|
d7d9dbd2c2 | ||
|
|
f8eece22c8 | ||
|
|
df563db294 | ||
|
|
01b0d9eb97 | ||
|
|
a7f13d841f | ||
|
|
686d8bbe69 | ||
|
|
4b36af4a34 | ||
|
|
4a23a4bfee | ||
|
|
ac3ad452c0 | ||
|
|
027c01511c | ||
|
|
4fdcc0496f | ||
|
|
0c4a2bea69 | ||
|
|
2ba3401238 | ||
|
|
1735284a2a | ||
|
|
8a3192ffc1 | ||
|
|
ffea273a28 | ||
|
|
1783aac438 | ||
|
|
29bf3d2c04 | ||
|
|
ee16fc958c | ||
|
|
5d73215a8d | ||
|
|
b7356bc526 | ||
|
|
8ec8282f38 | ||
|
|
43b7b98949 | ||
|
|
f791065a98 | ||
|
|
d95db28695 | ||
|
|
851fb16e7c | ||
|
|
a4cbaafd10 | ||
|
|
c5f2cdb822 | ||
|
|
1892d29be0 | ||
|
|
9e5a49b8cb | ||
|
|
767ade02f4 | ||
|
|
6e05071a47 | ||
|
|
c8a990b9d3 | ||
|
|
6868ceae9b | ||
|
|
cace646346 | ||
|
|
abcc225763 | ||
|
|
b9673fc521 | ||
|
|
b0ea3f4261 | ||
|
|
0103219f00 | ||
|
|
e15b4f40d6 | ||
|
|
66235fddff | ||
|
|
f9c5d026f4 | ||
|
|
c46239af22 | ||
|
|
48eb3ff8d9 | ||
|
|
5646dcc791 | ||
|
|
5d9876e338 | ||
|
|
083340a937 | ||
|
|
378fa5ee6a | ||
|
|
4764daf3c2 | ||
|
|
6357496d17 | ||
|
|
001e2a604b | ||
|
|
f370911c15 | ||
|
|
ef5cf40fa6 | ||
|
|
837bd79b20 | ||
|
|
3edd4a24af | ||
|
|
535a61b5a9 | ||
|
|
e87b7daab5 | ||
|
|
f20689519d | ||
|
|
ee9c460f74 | ||
|
|
84ba14fa29 | ||
|
|
3c75963352 | ||
|
|
5f9dd8287c | ||
|
|
d99f074eb7 | ||
|
|
a989140a07 | ||
|
|
420a4c163d | ||
|
|
1bab735580 | ||
|
|
a0fcd0cf22 | ||
|
|
5d5c753c74 | ||
|
|
7e7e3eb8d5 | ||
|
|
2e5f8aeba1 | ||
|
|
c2fe961db1 | ||
|
|
2a6acc04a1 | ||
|
|
a467128093 | ||
|
|
abf41eb85c | ||
|
|
d83dea4463 | ||
|
|
ec43721c3c | ||
|
|
39d52762d1 | ||
|
|
8d45d0d104 | ||
|
|
26ec62714c | ||
|
|
7873b5e78b | ||
|
|
1b889c527f | ||
|
|
9937ff8ac0 | ||
|
|
abd1949825 | ||
|
|
4e6bc77a70 | ||
|
|
531948358b | ||
|
|
0d3ec9c324 | ||
|
|
21caca4aea | ||
|
|
fbf3edf07d | ||
|
|
76fcf25898 | ||
|
|
56257f072b | ||
|
|
44401158e8 | ||
|
|
95b2df8261 | ||
|
|
1ebadf8620 | ||
|
|
9179d9592d | ||
|
|
f208217412 | ||
|
|
43c5058682 | ||
|
|
97b4a6b51f | ||
|
|
f405d27c56 | ||
|
|
99949c8f6f | ||
|
|
3a9697adf2 | ||
|
|
78c4351e04 | ||
|
|
0a427890fe | ||
|
|
e735abe334 | ||
|
|
c0070b2f13 | ||
|
|
cfedc6e9b4 | ||
|
|
b66d7f7e0b | ||
|
|
e01df06cd7 | ||
|
|
6584897b69 | ||
|
|
aa4f45b9a5 | ||
|
|
96ad5b8444 | ||
|
|
097e5dfbdc | ||
|
|
2ef7ee6ca7 | ||
|
|
2685b53b30 | ||
|
|
533e4fcdad | ||
|
|
006b8fa3f0 | ||
|
|
6a01153ce4 | ||
|
|
34aab116ae | ||
|
|
33232face9 | ||
|
|
b88b2b3d79 | ||
|
|
744d729dab | ||
|
|
71b5e43153 | ||
|
|
8459f27312 | ||
|
|
7dfbdef505 | ||
|
|
94386374ff | ||
|
|
f5d3859238 | ||
|
|
ef39da5973 | ||
|
|
81e8c4bbff | ||
|
|
8ca3642429 | ||
|
|
1dc000c06a | ||
|
|
4f093d5b97 | ||
|
|
e1b032cbad | ||
|
|
6f365c30eb | ||
|
|
718e180423 | ||
|
|
cead5e5bd7 | ||
|
|
cf15629aea | ||
|
|
a727d0bb0b | ||
|
|
0a218ee56a | ||
|
|
74beefcaf6 | ||
|
|
399a3abefc | ||
|
|
cee5036aca | ||
|
|
790823abb4 | ||
|
|
f546849352 | ||
|
|
a85af593f1 | ||
|
|
07067f8b95 | ||
|
|
a1e824ada0 | ||
|
|
f5f1bfbef1 | ||
|
|
cd108ba3aa | ||
|
|
2bb5bfa74e | ||
|
|
624e7a447d | ||
|
|
37420c342b | ||
|
|
ef40e362c9 | ||
|
|
ef369c2e2b | ||
|
|
6452461c39 | ||
|
|
1e89ca0994 | ||
|
|
92bb10eed8 | ||
|
|
8465c5fe0e | ||
|
|
42e248a8da | ||
|
|
e71a652985 | ||
|
|
bfef0fbff3 | ||
|
|
545685bc32 | ||
|
|
13ad2b4dc2 | ||
|
|
d019343017 | ||
|
|
e977ec924c | ||
|
|
b7d5652bf6 | ||
|
|
725e48fce4 | ||
|
|
43816c268b | ||
|
|
72e80db823 | ||
|
|
7b33c343f8 | ||
|
|
6d0601b99f | ||
|
|
b6e713711d | ||
|
|
c53edeeb6c | ||
|
|
dfb98417b3 | ||
|
|
9716c3a30e | ||
|
|
c4c44c4445 | ||
|
|
0debe9bd6f | ||
|
|
f1da118a6c | ||
|
|
c30c46cd5f | ||
|
|
d394017926 | ||
|
|
04525c0259 | ||
|
|
08a0bb756d | ||
|
|
20c6159c04 | ||
|
|
a47e9d1a4b | ||
|
|
e93dd374a4 | ||
|
|
0847ca4ec2 | ||
|
|
572d8d0cc4 | ||
|
|
c9a57d354d | ||
|
|
52b77f6e31 | ||
|
|
4c9782ee28 | ||
|
|
26225307d3 | ||
|
|
0129d1e158 | ||
|
|
ece6037a1e | ||
|
|
bea678a7cd | ||
|
|
1fb3fbb4de | ||
|
|
2c38d19af2 | ||
|
|
311e627463 | ||
|
|
8e1e36a0d5 | ||
|
|
db0bb425e7 | ||
|
|
e001dd2d45 | ||
|
|
c38772c97f | ||
|
|
3a31589fdd | ||
|
|
460522bb67 | ||
|
|
176debaf37 | ||
|
|
072f83b240 | ||
|
|
cbd6770f2f | ||
|
|
0c3a7bcf12 | ||
|
|
389fbaaca2 | ||
|
|
9652efd107 | ||
|
|
f3ea834322 | ||
|
|
02a6a46e86 | ||
|
|
75ad90abc7 | ||
|
|
4104593180 | ||
|
|
78e1704122 | ||
|
|
b9e99575ce | ||
|
|
fa5e06f95d | ||
|
|
3041409334 | ||
|
|
71536eb412 | ||
|
|
fe77230d84 | ||
|
|
accd262561 | ||
|
|
3057d19cdf | ||
|
|
8dd83a2cf3 | ||
|
|
49b84f9229 | ||
|
|
b43bf4dd74 | ||
|
|
5ed0eb51d1 | ||
|
|
72a1ca3b99 | ||
|
|
14424281a0 | ||
|
|
2b3fd0d4d3 | ||
|
|
894b9cfdb9 | ||
|
|
72ff9bd3e6 | ||
|
|
7ecbb0454f | ||
|
|
fa7fa2a55f | ||
|
|
5c0576ca55 | ||
|
|
039b354490 | ||
|
|
b2f03e76ff | ||
|
|
63b33b6ec5 | ||
|
|
23670795db | ||
|
|
8ea6c113b5 | ||
|
|
37f026a0a6 | ||
|
|
f67136df19 | ||
|
|
e07073ff28 | ||
|
|
64b0ba6da7 | ||
|
|
99d4ae0c1a | ||
|
|
f185b35088 | ||
|
|
4e909f9411 | ||
|
|
99f49e266c | ||
|
|
0458211ebc | ||
|
|
8a7b9d9f45 | ||
|
|
3fcf463f9e | ||
|
|
f77cd63286 | ||
|
|
2378c2d754 | ||
|
|
bbdb4a67e1 | ||
|
|
21851c0673 | ||
|
|
83f6498aac | ||
|
|
7e219c362c | ||
|
|
525a791987 | ||
|
|
fb19210cfd | ||
|
|
203f48d1fd | ||
|
|
371c82b2bf | ||
|
|
8176880173 | ||
|
|
b0b2c5b3e0 | ||
|
|
29742d23d3 | ||
|
|
533a6b0240 | ||
|
|
0c0400b6fc | ||
|
|
2e83af7c21 | ||
|
|
a3f7947ad2 | ||
|
|
7d9d459ac2 | ||
|
|
3ea1073809 | ||
|
|
76a959a578 | ||
|
|
f43873dc5f | ||
|
|
921553d7bb | ||
|
|
c476819cb1 | ||
|
|
77a56c7c5a | ||
|
|
46deb7ca82 | ||
|
|
b03f9ece05 | ||
|
|
27946a981f | ||
|
|
74617389c8 | ||
|
|
1d8840412f | ||
|
|
df1152ee0f | ||
|
|
b4a8b8c0d4 | ||
|
|
ffa9f4b47f | ||
|
|
667e22bbc7 | ||
|
|
d4d838c8bb | ||
|
|
c61a889c86 | ||
|
|
567fe89a77 | ||
|
|
950772ab8a | ||
|
|
0bd0e2a3ec | ||
|
|
47774ce882 | ||
|
|
3c9bcdd347 | ||
|
|
3934d2d30c | ||
|
|
423ce9557a | ||
|
|
947848ebf6 | ||
|
|
5e22fe488e | ||
|
|
c666cf1c44 | ||
|
|
79435dbdec | ||
|
|
27206368da | ||
|
|
2be245b75e | ||
|
|
17927f5c26 | ||
|
|
754f26a97c | ||
|
|
29241c4f83 | ||
|
|
6f655eb9b9 | ||
|
|
65dfd90141 | ||
|
|
59abdbd2dd | ||
|
|
a6d6873856 | ||
|
|
e99df3a3be | ||
|
|
8b657255cc | ||
|
|
0e1dc79321 | ||
|
|
0ef15e5fac | ||
|
|
9ea8a840a9 | ||
|
|
7b88089593 | ||
|
|
b513943893 | ||
|
|
edffc56600 | ||
|
|
856b0e6886 | ||
|
|
bf1eb46b87 | ||
|
|
7e27d660e2 | ||
|
|
53174ea45f | ||
|
|
87b624f5d5 | ||
|
|
443e96381a | ||
|
|
1cbba4fc59 | ||
|
|
344b6dd179 | ||
|
|
d8c829fa0c | ||
|
|
e1efc71ad3 | ||
|
|
f804a739b1 | ||
|
|
2ed870c854 | ||
|
|
ce35ba9ac9 | ||
|
|
724a59aaf7 | ||
|
|
42d8c2981f | ||
|
|
9aa91e0f17 | ||
|
|
5aabee8996 | ||
|
|
48a84ca23e | ||
|
|
8751783a1b | ||
|
|
3a2ec50d5f | ||
|
|
ce9aeed4cb | ||
|
|
f2be6432a9 | ||
|
|
e96f8c0444 | ||
|
|
2bf3bc3e10 | ||
|
|
28143f86f9 | ||
|
|
76ec3d3248 | ||
|
|
d0c85a5a96 | ||
|
|
46ed717af4 | ||
|
|
ad37c88f80 | ||
|
|
8c6e8a6eb8 | ||
|
|
dd33317f45 | ||
|
|
c344d63fb3 | ||
|
|
62557f4d6b | ||
|
|
9c46cc4ea0 | ||
|
|
a236a439cc | ||
|
|
c779e2674a | ||
|
|
a94d4be466 | ||
|
|
b7d2d4cfe8 | ||
|
|
a6c797ee4b | ||
|
|
3e40b2249f | ||
|
|
2fe1b5034d | ||
|
|
b4430839a3 | ||
|
|
412cf974a4 | ||
|
|
3fc6beeff0 | ||
|
|
2ff35c8bfa | ||
|
|
169db88c20 | ||
|
|
ca419c84b8 | ||
|
|
aede71b1dc | ||
|
|
14d573cbf1 | ||
|
|
7819aa6b20 | ||
|
|
7cc6b63aac | ||
|
|
4af6362751 | ||
|
|
d54075197f | ||
|
|
5cce56199b | ||
|
|
3cc12817f6 | ||
|
|
68875ba600 | ||
|
|
c345c5ebae | ||
|
|
2119a16e24 | ||
|
|
9f5c938ff3 | ||
|
|
b42a8d2364 | ||
|
|
61fc01e79e | ||
|
|
cceaec1d74 | ||
|
|
8e5f9c8160 | ||
|
|
c620fd42f4 | ||
|
|
2a859f870a | ||
|
|
b680753db8 | ||
|
|
35af940166 | ||
|
|
bc0fec0afe | ||
|
|
e3eca82cc3 | ||
|
|
e7651d0d0f | ||
|
|
5cf4ce9318 | ||
|
|
6a6f28668f | ||
|
|
dadf1339b5 | ||
|
|
c2c4228722 | ||
|
|
5469941f2b | ||
|
|
3d3bca5338 | ||
|
|
6a3008d7ff | ||
|
|
1401621913 | ||
|
|
3c034b0a0c | ||
|
|
395191bd75 | ||
|
|
ec7d8fb6bd | ||
|
|
062948b110 | ||
|
|
7f3dc5f040 | ||
|
|
dd0798a317 | ||
|
|
9209ccfa40 | ||
|
|
2525d32e17 | ||
|
|
f3ac8a7cd9 | ||
|
|
f3d95f70e2 | ||
|
|
57526067f5 | ||
|
|
0545bab35d | ||
|
|
293836494d | ||
|
|
ae8bda190e | ||
|
|
34d9d8abd4 | ||
|
|
bd67e986f4 | ||
|
|
e587518d85 | ||
|
|
210b6c38bd | ||
|
|
9592c0b466 | ||
|
|
a33537b2b9 | ||
|
|
81d5c9757c | ||
|
|
f34124a50b | ||
|
|
74a39c715b | ||
|
|
195496333b | ||
|
|
9ccaa90439 | ||
|
|
4733c5fef0 | ||
|
|
a97ddc8cb9 | ||
|
|
59a5b000e0 | ||
|
|
d49a2ccb08 | ||
|
|
4a75acb46c | ||
|
|
453368078b | ||
|
|
6e3b643bdf | ||
|
|
a769352a74 | ||
|
|
8a63c27925 | ||
|
|
310895f060 | ||
|
|
4428894aba | ||
|
|
4f021cbced | ||
|
|
ba31d176c8 | ||
|
|
68edbc3e4a | ||
|
|
5068227a46 | ||
|
|
f8f3bc89e7 | ||
|
|
635f7026b0 | ||
|
|
0f1e4f0326 | ||
|
|
89355edb8a | ||
|
|
37c8f5c1da | ||
|
|
5bba2df526 | ||
|
|
1935694440 | ||
|
|
12dd6ea8bb | ||
|
|
a1f922b040 | ||
|
|
017cf088a1 | ||
|
|
df627cc417 | ||
|
|
1b20300b73 | ||
|
|
3b9ffea36f | ||
|
|
e242f3999c | ||
|
|
523f89cc8c | ||
|
|
0575a6d652 | ||
|
|
08b88714e0 | ||
|
|
bcaff4b844 | ||
|
|
82f336a78f | ||
|
|
350aa33022 | ||
|
|
d6290a2f1a | ||
|
|
71e9d08863 | ||
|
|
9729dc7594 | ||
|
|
92c1b8f31e | ||
|
|
9ffa2604f8 | ||
|
|
03b1fad4d4 | ||
|
|
72eb4c534f | ||
|
|
47d936e9cc | ||
|
|
8e08407090 | ||
|
|
c0a4558c62 | ||
|
|
5ecb6fecc4 | ||
|
|
eea726740b | ||
|
|
0ea4c970d7 | ||
|
|
57936a1374 | ||
|
|
9242fde6b8 | ||
|
|
d1f653be65 | ||
|
|
0035dceb0a | ||
|
|
b159bc0c5f | ||
|
|
a222c4879c | ||
|
|
eb2f413cf0 | ||
|
|
e54748d355 | ||
|
|
08e2e2e791 | ||
|
|
531c0067ec | ||
|
|
e228caaca6 | ||
|
|
9ac8f89b1d | ||
|
|
c6a72a14ac | ||
|
|
c74edd0e33 | ||
|
|
98acf3f281 | ||
|
|
fe30db935b | ||
|
|
6303d54cbb | ||
|
|
9d91aa23e6 | ||
|
|
c2ada39fd3 | ||
|
|
77b6e27500 | ||
|
|
99640171e2 | ||
|
|
38b3ab791f | ||
|
|
a86fc52eea | ||
|
|
6d3ed3f16f | ||
|
|
be798998bf | ||
|
|
c3b425d570 | ||
|
|
a25743875f | ||
|
|
124d1a5942 | ||
|
|
eec77b3ae7 | ||
|
|
640bac1aa4 | ||
|
|
0b12fae84d | ||
|
|
d9353c4fd3 | ||
|
|
0c9fc2f809 | ||
|
|
1a954748a0 | ||
|
|
2abad0f479 | ||
|
|
2fb40fe728 | ||
|
|
b57330cf75 | ||
|
|
8cd91fabf9 | ||
|
|
e0580ee385 | ||
|
|
144d092637 | ||
|
|
2bde9afdb9 | ||
|
|
f8b09c194f | ||
|
|
0e69ad32c1 | ||
|
|
9b4e14df71 | ||
|
|
03f7803f26 | ||
|
|
c6cbcc2c25 | ||
|
|
27aa34d4ae | ||
|
|
79e0db4ca0 | ||
|
|
9ae3acf2e7 | ||
|
|
731ea9b489 | ||
|
|
18b30b5019 | ||
|
|
24d51b9d14 | ||
|
|
a1edc199df | ||
|
|
db4aa81528 | ||
|
|
319ba94a52 | ||
|
|
1025f0be91 | ||
|
|
77d3b5e8f1 | ||
|
|
a0ad96a787 | ||
|
|
39c5af5dbc | ||
|
|
acca6a799b | ||
|
|
b77e62260a | ||
|
|
b6995ca011 | ||
|
|
715844fd08 | ||
|
|
2b29ca796e | ||
|
|
5184008812 | ||
|
|
cf696ce443 | ||
|
|
1a2ea4c06c | ||
|
|
a800afcbf8 | ||
|
|
ff4534613a | ||
|
|
b8fe2c74bc | ||
|
|
be3b5199b0 | ||
|
|
d849a40af6 | ||
|
|
4f48c10312 | ||
|
|
5274fee8a7 | ||
|
|
5462f34ed0 | ||
|
|
0958ed5844 | ||
|
|
e3cba18532 | ||
|
|
9bf7fde49f | ||
|
|
4783ebc918 | ||
|
|
8bda52783b | ||
|
|
07feec7ea6 | ||
|
|
e7471f589a | ||
|
|
24208be5cf | ||
|
|
8db5f66498 | ||
|
|
be670bfd1f | ||
|
|
19acf090ed | ||
|
|
2de7f6b457 | ||
|
|
a2e265e9a2 | ||
|
|
28d7b29d72 | ||
|
|
9cb4aaf3c2 | ||
|
|
80dc602193 | ||
|
|
c7f5a87258 |
63
.gitignore
vendored
63
.gitignore
vendored
@@ -1,61 +1,8 @@
|
||||
*.Plo
|
||||
*.Po
|
||||
*.a
|
||||
*.bz2
|
||||
*.d
|
||||
*.gz
|
||||
*.la
|
||||
*.lo
|
||||
*.o
|
||||
.deps
|
||||
.dirstamp
|
||||
Makefile
|
||||
Makefile.in
|
||||
aclocal.m4
|
||||
autom4te.cache
|
||||
compile
|
||||
config.guess
|
||||
config.h
|
||||
config.h.in
|
||||
config.log
|
||||
config.mk
|
||||
config.status
|
||||
config.sub
|
||||
config_detected.h
|
||||
config_detected.mk
|
||||
configure
|
||||
configure.lineno
|
||||
depcomp
|
||||
depmode
|
||||
install-sh
|
||||
libtool
|
||||
ltmain.sh
|
||||
missing
|
||||
mkinstalldirs
|
||||
mpd
|
||||
mpd.exe
|
||||
stamp-h1
|
||||
tags
|
||||
*~
|
||||
|
||||
.#*
|
||||
.stgit*
|
||||
doc/protocol.html
|
||||
doc/protocol
|
||||
doc/user
|
||||
doc/developer
|
||||
doc/sticker
|
||||
doc/api
|
||||
test/software_volume
|
||||
test/run_convert
|
||||
test/run_decoder
|
||||
test/read_tags
|
||||
test/run_filter
|
||||
test/run_encoder
|
||||
test/run_output
|
||||
test/read_conf
|
||||
test/run_input
|
||||
test/read_mixer
|
||||
test/dump_playlist
|
||||
test/run_normalize
|
||||
test/tmp
|
||||
test/run_inotify
|
||||
|
||||
/output/
|
||||
|
||||
__pycache__/
|
||||
|
||||
82
.travis.yml
Normal file
82
.travis.yml
Normal file
@@ -0,0 +1,82 @@
|
||||
language: cpp
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
dist: trusty
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- sourceline: 'ppa:mhier/libboost-latest'
|
||||
- sourceline: 'ppa:saiarcot895/chromium-dev' # for ninja-build
|
||||
- sourceline: 'ppa:deadsnakes/ppa' # for Python 3.7 (required by Meson)
|
||||
packages:
|
||||
- g++-6
|
||||
- libgtest-dev
|
||||
- boost1.67
|
||||
- python3.6
|
||||
- python3-urllib3
|
||||
- ninja-build
|
||||
before_install:
|
||||
- wget https://bootstrap.pypa.io/get-pip.py
|
||||
- /usr/bin/python3.6 get-pip.py --user
|
||||
install:
|
||||
- /usr/bin/python3.6 $HOME/.local/bin/pip install --user meson
|
||||
env:
|
||||
# use gold as workaround for https://sourceware.org/bugzilla/show_bug.cgi?id=17068
|
||||
- MATRIX_EVAL="export CC=gcc-6 CXX=g++-6 LDFLAGS=-fuse-ld=gold PATH=$HOME/.local/bin:$PATH"
|
||||
|
||||
- os: linux
|
||||
dist: trusty
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- sourceline: 'ppa:mhier/libboost-latest'
|
||||
- sourceline: 'ppa:saiarcot895/chromium-dev' # for ninja-build
|
||||
- sourceline: 'ppa:deadsnakes/ppa' # for Python 3.7 (required by Meson)
|
||||
packages:
|
||||
- g++-8
|
||||
- libgtest-dev
|
||||
- boost1.67
|
||||
- python3.6
|
||||
- python3-urllib3
|
||||
- ninja-build
|
||||
before_install:
|
||||
- wget https://bootstrap.pypa.io/get-pip.py
|
||||
- /usr/bin/python3.6 get-pip.py --user
|
||||
install:
|
||||
- /usr/bin/python3.6 $HOME/.local/bin/pip install --user meson
|
||||
env:
|
||||
# use gold as workaround for https://sourceware.org/bugzilla/show_bug.cgi?id=17068
|
||||
- MATRIX_EVAL="export CC=gcc-8 CXX=g++-8 LDFLAGS=-fuse-ld=gold PATH=$HOME/.local/bin:$PATH"
|
||||
|
||||
- os: osx
|
||||
osx_image: xcode9.3beta
|
||||
env:
|
||||
- MATRIX_EVAL=""
|
||||
|
||||
cache:
|
||||
- apt
|
||||
- ccache
|
||||
|
||||
before_install:
|
||||
- eval "${MATRIX_EVAL}"
|
||||
# C++14
|
||||
- test "$TRAVIS_OS_NAME" != "osx" || brew update
|
||||
|
||||
install:
|
||||
# C++14
|
||||
- test "$TRAVIS_OS_NAME" != "osx" || brew install ccache meson
|
||||
- test "$TRAVIS_OS_NAME" != "osx" || brew install --HEAD https://gist.githubusercontent.com/Kronuz/96ac10fbd8472eb1e7566d740c4034f8/raw/gtest.rb
|
||||
|
||||
before_script:
|
||||
- ccache -s
|
||||
|
||||
script:
|
||||
- eval "${MATRIX_EVAL}"
|
||||
- OPTIONS="-Dtest=true"
|
||||
- meson . output --werror $OPTIONS
|
||||
- ninja -C output -v test
|
||||
- ccache -s
|
||||
112
AUTHORS
112
AUTHORS
@@ -1,67 +1,49 @@
|
||||
Current Developers
|
||||
------------------
|
||||
Music Player Daemon - http://www.musicpd.org
|
||||
Copyright 2003-2018 The Music Player Daemon Project
|
||||
|
||||
Avuton Olrich <avuton@gmail.com>
|
||||
release manager
|
||||
The following people have contributed code to MPD:
|
||||
|
||||
Max Kellermann <max@duempel.org>
|
||||
lead developer
|
||||
|
||||
Laszlo Ashin <kodest@gmail.com>
|
||||
WavPack support
|
||||
|
||||
Viliam Mateicka <viliam.mateicka@gmail.com>
|
||||
FFmpeg support, mixer and archive API
|
||||
|
||||
Eric Wollesen <encoded@xmtp.net>
|
||||
encoder API, shout output
|
||||
|
||||
Thomas Jansen <mithi@mithi.net>
|
||||
multithreading tweaks, miscellaneous
|
||||
|
||||
Romain Bignon <romain@peerfuse.org>
|
||||
playlist manipulation
|
||||
|
||||
David Guibert <david.guibert@gmail.com>
|
||||
PulseAudio mixer
|
||||
|
||||
Jochen Keil <jochen.keil@gmail.com>
|
||||
CUE sheet support
|
||||
|
||||
Jeffrey Middleton <jefromi@gmail.com>
|
||||
playlist manipulation
|
||||
|
||||
Sean McNamara <smcnam@gmail.com>
|
||||
WIN32 compatibility
|
||||
|
||||
|
||||
Former Developers
|
||||
-----------------
|
||||
|
||||
Warren Dukes <warren.dukes@gmail.com>
|
||||
former lead developer and project founder
|
||||
|
||||
Niklas Hofer
|
||||
'next' and 'previous' patch
|
||||
|
||||
Jim Ramsay <i.am@jimramsay.com>
|
||||
Zerconf/avahi support
|
||||
|
||||
Guus Sliepen <guus@sliepen.eu.org>
|
||||
libsamplerate code
|
||||
|
||||
J. Alexander Treuman <jat@spatialrift.net>
|
||||
general, MP3, ID3, PulseAudio, format conversion, stored playlists
|
||||
AudioCompress, much much more...
|
||||
|
||||
Eric Wong
|
||||
former lead developer
|
||||
|
||||
José Anarch <anarchsss@gmail.com>
|
||||
JACK plugin
|
||||
|
||||
Patrik Weiskircher <pat@icore.at>
|
||||
Stored playlist commands
|
||||
|
||||
Nick Welch <mack@incise.org>
|
||||
Sighandlers
|
||||
Warren Dukes <warren.dukes@gmail.com>
|
||||
Avuton Olrich <avuton@gmail.com>
|
||||
Max Kellermann <max.kellermann@gmail.com>
|
||||
Laszlo Ashin <kodest@gmail.com>
|
||||
Viliam Mateicka <viliam.mateicka@gmail.com>
|
||||
Eric Wollesen <encoded@xmtp.net>
|
||||
Thomas Jansen <mithi@mithi.net>
|
||||
Romain Bignon <romain@peerfuse.org>
|
||||
David Guibert <david.guibert@gmail.com>
|
||||
Jochen Keil <jochen.keil@gmail.com>
|
||||
Jeffrey Middleton <jefromi@gmail.com>
|
||||
Sean McNamara <smcnam@gmail.com>
|
||||
Niklas Hofer
|
||||
Jim Ramsay <i.am@jimramsay.com>
|
||||
Guus Sliepen <guus@sliepen.eu.org>
|
||||
J. Alexander Treuman <jat@spatialrift.net>
|
||||
Eric Wong
|
||||
José Anarch <anarchsss@gmail.com>
|
||||
Patrik Weiskircher <pat@icore.at>
|
||||
Nick Welch <mack@incise.org>
|
||||
Jonathan Neuschäfer <j.neuschaefer@gmx.net>
|
||||
Anton Khirnov <anton@khirnov.net>
|
||||
Simon Kagstrom <simon.kagstrom@gmail.com>
|
||||
Denis Krjuchkov <denis@crazydev.net>
|
||||
Jurgen Kramer <gtmkramer@xs4all.nl>
|
||||
Jean-Francois Dockes <jf@dockes.org>
|
||||
Yue Wang <yuleopen@gmail.com>
|
||||
Matthew Leon Grinshpun <ml@matthewleon.com>
|
||||
Dimitris Papastamos <sin@2f30.org>
|
||||
Florian Schlichting <fsfs@debian.org>
|
||||
François Revol <revol@free.fr>
|
||||
Jacob Vosmaer <contact@jacobvosmaer.nl>
|
||||
Thomas Guillem <thomas@gllm.fr>
|
||||
Andrew Basterfield <abasterfield@gmail.com>
|
||||
Bart Nagel <bart@tremby.net>
|
||||
Christian Kröner <ckroener@gmx.net>
|
||||
Christopher Zimmermann <madroach@gmerlin.de>
|
||||
John Regan <john@jrjrtech.com>
|
||||
Joshua Wise <joshua@joshuawise.com>
|
||||
Ryan Walklin
|
||||
Stefan Roellin <stefan@roellin-baumann.ch>
|
||||
Stefano Miccoli <stefano.miccoli@polimi.it>
|
||||
Steven O'Brien <steven_obrien1@yahoo.co.uk>
|
||||
Thomas Zander <thomas.e.zander@googlemail.com>
|
||||
|
||||
214
INSTALL
214
INSTALL
@@ -1,214 +0,0 @@
|
||||
Music Player Daemon (MPD) - INSTALL
|
||||
|
||||
|
||||
Introduction
|
||||
------------
|
||||
This document is a very small amount of documentation about what is needed to
|
||||
install MPD. If more information is desired see the community wiki at
|
||||
http://mpd.wikia.com.
|
||||
|
||||
Dependencies
|
||||
------------
|
||||
|
||||
gcc - http://gcc.gnu.org/
|
||||
Any other C99 compliant compiler should also work.
|
||||
|
||||
GLib 2.12 - http://www.gtk.org/
|
||||
General-purpose utility library.
|
||||
|
||||
|
||||
Optional Output Dependencies
|
||||
----------------------------
|
||||
|
||||
You will need at least one of these to compile MPD.
|
||||
|
||||
Most of these are available as packages on major distributions. Be sure to
|
||||
install both the library package as well as the development package.
|
||||
|
||||
AO - http://www.xiph.org/ao/
|
||||
A portable library that abstracts many audio output types as one API. Should
|
||||
be used only if there is no native plugin available or if the native plugin
|
||||
doesn't work. You will need libao.
|
||||
|
||||
ALSA - http://www.alsa-project.org/
|
||||
The Advanced Linux Sound Architecture. Recommended audio output if you use
|
||||
Linux. You will need libasound.
|
||||
|
||||
FIFO
|
||||
This is a mostly undocumented, developer plugin to transmit raw data.
|
||||
|
||||
MVP - http://en.wikipedia.org/wiki/Hauppauge_MediaMVP
|
||||
A network media player.
|
||||
|
||||
OSS - http://www.opensound.com
|
||||
Open Sound System.
|
||||
|
||||
OSX - http://www.apple.com
|
||||
Necessary if you are on Mac OSX.
|
||||
|
||||
PulseAudio - http://www.pulseaudio.org/
|
||||
An advanced sound daemon. You will need libpulse.
|
||||
|
||||
JACK - http://www.jackaudio.org/
|
||||
A low-latency sound daemon.
|
||||
|
||||
libshout - http://www.icecast.org/
|
||||
For streaming to an Icecast or Shoutcast server.
|
||||
You also need an encoder: either libvorbisenc (ogg), or liblame (mp3).
|
||||
|
||||
OpenAL - http://kcat.strangesoft.net/openal.html
|
||||
Open Audio Library
|
||||
|
||||
libffado - http://www.ffado.org/
|
||||
For FireWire audio devices.
|
||||
|
||||
|
||||
Optional Input Dependencies
|
||||
---------------------------
|
||||
|
||||
You will need at least one of these to compile MPD.
|
||||
|
||||
Most of these are available as packages on major distributions. Be sure to
|
||||
install both the library package as well as the development package.
|
||||
|
||||
MAD - http://www.underbit.com/products/mad/
|
||||
For MP3 support. You will need libmad, and optionally libid3tag if you want
|
||||
ID3 tag support.
|
||||
|
||||
libmpg123 - http://www.mpg123.de/
|
||||
Alternative for MP3 support.
|
||||
|
||||
Ogg Vorbis - http://www.xiph.org/ogg/vorbis/
|
||||
For Ogg Vorbis support. You will need libogg and libvorbis.
|
||||
|
||||
FLAC - http://flac.sourceforge.net/
|
||||
For FLAC support. You will need version 1.1.0 or higher of libflac.
|
||||
|
||||
OggFLAC - http://www.xiph.org/ogg/vorbis/ and http://flac.sourceforge.net/
|
||||
For OggFLAC support. You will need liboggflac, which can be built from the
|
||||
FLAC sources if libogg is already installed. Versions of flac 1.1.3 and
|
||||
greater will automatically detect and use OggFLAC if it's available.
|
||||
|
||||
Audio File - http://www.68k.org/~michael/audiofile/
|
||||
For WAVE, AIFF, and AU support. You will need libaudiofile.
|
||||
|
||||
FAAD2 - http://www.audiocoding.com/
|
||||
For MP4/AAC support. You will need libmp4ff.
|
||||
|
||||
libmpcdec - http://www.musepack.net/
|
||||
For Musepack support.
|
||||
|
||||
MikMod - http://mikmod.raphnet.net/
|
||||
For MOD support. You will need libmikmod.
|
||||
|
||||
libavcodec, libavformat (ffmpeg) - http://ffmpeg.mplayerhq.hu/
|
||||
Multi-codec library.
|
||||
|
||||
libsidplay2 - http://sidplay2.sourceforge.net/
|
||||
For C64 SID support.
|
||||
|
||||
libfluidsynth - http://fluidsynth.resonance.org/
|
||||
For MIDI support (DO NOT USE - use libwildmidi instead)
|
||||
|
||||
libwildmidi - http://wildmidi.sourceforge.net/
|
||||
For MIDI support.
|
||||
|
||||
libsndfile - http://www.mega-nerd.com/libsndfile/
|
||||
WAVE, AIFF, and many others.
|
||||
|
||||
libwavpack - http://www.wavpack.com/
|
||||
For WavPack playback.
|
||||
|
||||
|
||||
Optional Miscellaneous Dependencies
|
||||
-----------------------------------
|
||||
|
||||
Avahi - http://www.avahi.org/
|
||||
For Zeroconf support.
|
||||
|
||||
libsamplerate - http://www.mega-nerd.com/SRC/
|
||||
For advanced samplerate conversions.
|
||||
|
||||
libcurl - http://curl.haxx.se/
|
||||
For playing HTTP streams.
|
||||
|
||||
libmms - https://launchpad.net/libmms
|
||||
For playing MMS streams.
|
||||
|
||||
SQLite - http://www.sqlite.org/
|
||||
For the sticker database.
|
||||
|
||||
libcue - http://libcue.sourceforge.net/
|
||||
For CUE sheet support.
|
||||
|
||||
|
||||
pkg-config
|
||||
----------
|
||||
|
||||
MPD uses pkg-config to locate most external libraries. If you do not
|
||||
have pkg-config, or if your version of the library does not ship the
|
||||
".pc" file, you have to provide the library's build options in
|
||||
environment variables. These variables are documented in "./configure
|
||||
--help". Example:
|
||||
|
||||
FLAC_CFLAGS=-I/usr/include/FLAC FLAC_LIBS=-lFLAC ./configure
|
||||
|
||||
|
||||
Download
|
||||
--------
|
||||
|
||||
Get the latest release from of MPD from <http://www.musicpd.org/>.
|
||||
|
||||
Compile
|
||||
-------
|
||||
|
||||
1) unzip and untar the archive
|
||||
|
||||
$ tar zxvf mpd-x.x.x.tar.gz
|
||||
|
||||
or
|
||||
|
||||
$ tar jxvf mpd-x.x.x.tar.bz2
|
||||
|
||||
2) change to directory created
|
||||
|
||||
$ cd mpd-x.x.x
|
||||
|
||||
3) Run configure script (this will determine what dependencies you have)
|
||||
|
||||
$ ./configure
|
||||
|
||||
4) Compile
|
||||
|
||||
$ make
|
||||
|
||||
Install (Optional)
|
||||
-------
|
||||
|
||||
(as root)
|
||||
$ make install
|
||||
|
||||
Run
|
||||
---
|
||||
|
||||
1) run mpd:
|
||||
|
||||
$ mpd <config file>
|
||||
|
||||
First default is ~/.mpdconf then ~/.mpd/mpd.conf then /etc/mpd.conf. If
|
||||
neither of these exist a mpd configuration file must be specified at
|
||||
runtime.
|
||||
|
||||
A sample config file is included with the source of MPD, mpdconf.example.
|
||||
|
||||
The first time MPD is run it will attempt to discover all music in your
|
||||
music root, recursively. This can be affected by the symbolic link
|
||||
options specified in the example mpd.conf.
|
||||
|
||||
Using MPD
|
||||
---------
|
||||
|
||||
You can download many different interfaces for MPD at
|
||||
<http://mpd.wikia.com/wiki/Clients>
|
||||
|
||||
MPD can be interfaced directly using telnet (see COMMANDS, if you are brave).
|
||||
1175
Makefile.am
1175
Makefile.am
File diff suppressed because it is too large
Load Diff
17
README
17
README
@@ -1,17 +0,0 @@
|
||||
|
||||
Music Player Daemon (MPD)
|
||||
http://www.musicpd.org
|
||||
|
||||
A daemon for playing music of various formats. Music is played through the
|
||||
server's audio device. The daemon stores info about all available music,
|
||||
and this info can be easily searched and retrieved. Player control, info
|
||||
retrieval, and playlist management can all be managed remotely.
|
||||
|
||||
For basic installation information see the INSTALL file.
|
||||
|
||||
MPD is released under the GNU General Public License version 2, which is
|
||||
distributed in the COPYING file.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
29
README.md
Normal file
29
README.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# Music Player Daemon
|
||||
|
||||
http://www.musicpd.org
|
||||
|
||||
A daemon for playing music of various formats. Music is played through the
|
||||
server's audio device. The daemon stores info about all available music,
|
||||
and this info can be easily searched and retrieved. Player control, info
|
||||
retrieval, and playlist management can all be managed remotely.
|
||||
|
||||
For basic installation instructions
|
||||
[read the manual](https://www.musicpd.org/doc/user/install.html).
|
||||
|
||||
# Users
|
||||
|
||||
- [Manual](http://www.musicpd.org/doc/user/)
|
||||
- [Forum](http://forum.musicpd.org/)
|
||||
- [IRC](irc://chat.freenode.net/#mpd)
|
||||
- [Bug tracker](https://github.com/MusicPlayerDaemon/MPD/issues/)
|
||||
|
||||
# Developers
|
||||
|
||||
- [Protocol specification](http://www.musicpd.org/doc/protocol/)
|
||||
- [Developer manual](http://www.musicpd.org/doc/developer/)
|
||||
|
||||
# Legal
|
||||
|
||||
MPD is released under the
|
||||
[GNU General Public License version 2](https://www.gnu.org/licenses/gpl-2.0.txt),
|
||||
which is distributed in the COPYING file.
|
||||
92
UPGRADING
92
UPGRADING
@@ -1,92 +0,0 @@
|
||||
Music Player Daemon (MPD) - UPGRADING
|
||||
|
||||
Upgrading to 0.14
|
||||
-----------------
|
||||
|
||||
The filesystem character set is determined by GLib, if it is not
|
||||
configured. GLib has an affinity towards UTF-8, while older MPD
|
||||
versions used to choose ISO-Latin-1.
|
||||
|
||||
|
||||
Upgrading to 0.13.0
|
||||
-------------------
|
||||
|
||||
JACK, Avahi, and libsamplerate have been added as optional dependencies.
|
||||
FLAC/OggFLAC now supports the 1.1.3 API, and libmikmod 3.2.0 betas are
|
||||
supported as well.
|
||||
|
||||
New mpd.conf parameters include zeroconf_name, samplerate_converter, and
|
||||
gapless_mp3_playback. See the mpd.conf man page or updated mpconf.example for
|
||||
more information on these parameters.
|
||||
|
||||
Support for the ID3v2 "Original Artist/Performer" tag has been added. Your
|
||||
MP3s will need to be rescanned for these tags to be included in the database.
|
||||
This can be done by running mpd --create-db.
|
||||
|
||||
Upgrading to 0.12.0
|
||||
-------------------
|
||||
|
||||
The ao_driver and ao_driver_options config parameters have been removed and
|
||||
replaced with the audio_output config section. You will have to update your
|
||||
config file to use this instead. See the mpd.conf man page or the new
|
||||
mpdconf.example for details on specifying audio_output sections.
|
||||
|
||||
The db_file parameter is no longer optional. If you did not specify it in your
|
||||
old config file then you will have to add it in order to run 0.12.0.
|
||||
|
||||
Support for OggFLAC and Musepack audio files has been added. Additionally,
|
||||
scanning of MP3 files has been improved. To make use of these updates it is
|
||||
highly recommended that you run mpd --create-db to recreate your entire
|
||||
database.
|
||||
|
||||
Upgrading to 0.11.0
|
||||
-------------------
|
||||
|
||||
The database format has changed a little bit, but in a backward compatible way.
|
||||
This means that if you upgrade to 0.11.0 from 0.10.x, you do not need to make
|
||||
any changes. However, if you downgrade back to 0.10.x, then you will need
|
||||
to recreate your db.
|
||||
|
||||
The default port for MPD is now 6600, so update your mpd and client
|
||||
configurations appropriately.
|
||||
|
||||
Upgrading to 0.10.0
|
||||
-------------------
|
||||
|
||||
All information is now stored in the db in UTF-8 format, and the character
|
||||
set used for the filesystem is stored in the db. Thus, it is highly
|
||||
recommended that you recreate the db. To do so, run mpd with the
|
||||
"--create-db" command line option. Also, note that the filesystem
|
||||
character set will be determined from your current locale settings.
|
||||
If your locale settings are not the same as those used for the filesystem,
|
||||
then use the config file parameter "filesystem_charset" to specify the
|
||||
correct character set (this maybe necessary if you create the db with root).
|
||||
|
||||
Upgrading to 0.9.3
|
||||
------------------
|
||||
|
||||
Wave support was added, so to have your wave files added, update the db (mpc
|
||||
update).
|
||||
|
||||
Also, song lengths are now stored in the db. To get this stuff
|
||||
added to the db, you will need to recreate the db from scratch. To do this,
|
||||
run mpd with the "--create-db" commandline option.
|
||||
|
||||
Upgrading to 0.9.0
|
||||
------------------
|
||||
|
||||
The "stop_on_error" config parameter was removed, so be sure to remove this
|
||||
parameter from your config file.
|
||||
|
||||
Upgrading to 0.8.x
|
||||
------------------
|
||||
|
||||
If you have FLACs, then to have them added to your list of available music,
|
||||
just use "update".
|
||||
|
||||
Upgrading from 0.5.x to 0.6.x
|
||||
-----------------------------
|
||||
If you have not compiled MPD with "make ogg", then nothing is needed.
|
||||
|
||||
If you compiled with "make ogg", just use "update" (available via the phpMp
|
||||
interface) to add your OGGs to MPD's list of available music.
|
||||
33
android/AndroidManifest.xml
Normal file
33
android/AndroidManifest.xml
Normal file
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.musicpd"
|
||||
android:installLocation="auto"
|
||||
android:versionCode="25"
|
||||
android:versionName="0.21.3">
|
||||
|
||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="26"/>
|
||||
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
|
||||
<application android:allowBackup="true"
|
||||
android:icon="@drawable/icon"
|
||||
android:label="@string/app_name">
|
||||
<activity android:name=".Settings"
|
||||
android:label="@string/app_name">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<receiver android:name=".Receiver">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
<service android:name=".Main" android:process=":main"/>
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
21
android/apk/make-unsigned-apk.sh
Executable file
21
android/apk/make-unsigned-apk.sh
Executable file
@@ -0,0 +1,21 @@
|
||||
#!/bin/sh -e
|
||||
|
||||
S=`dirname "$0"`
|
||||
ANDROID_ABI=$1
|
||||
STRIP=$2
|
||||
ZIP=$3
|
||||
UNSIGNED_APK=$4
|
||||
LIBMPD_SO=$5
|
||||
CLASSES_DEX=$6
|
||||
RESOURCES_APK=$7
|
||||
D=`dirname "$UNSIGNED_APK"`
|
||||
|
||||
rm -rf "$D/apk"
|
||||
mkdir -p "$D/apk/lib/$ANDROID_ABI"
|
||||
|
||||
"$STRIP" "$LIBMPD_SO" -o "$D/apk/lib/$ANDROID_ABI/`basename $LIBMPD_SO`"
|
||||
cp "$CLASSES_DEX" "$D/apk/"
|
||||
cp "$RESOURCES_APK" "$UNSIGNED_APK"
|
||||
|
||||
cd "$D/apk"
|
||||
exec zip -q -r -X "../`basename $UNSIGNED_APK`" .
|
||||
59
android/apk/meson.build
Normal file
59
android/apk/meson.build
Normal file
@@ -0,0 +1,59 @@
|
||||
unsigned_apk = custom_target(
|
||||
'mpd-unsigned.apk',
|
||||
output: 'mpd-unsigned.apk',
|
||||
input: [mpd, classes_dex, resources_apk[0]],
|
||||
command: [
|
||||
join_paths(meson.current_source_dir(), 'make-unsigned-apk.sh'),
|
||||
android_abi,
|
||||
get_option('android_strip'),
|
||||
zip,
|
||||
'@OUTPUT0@',
|
||||
'@INPUT@',
|
||||
],
|
||||
)
|
||||
|
||||
if get_option('android_debug_keystore') != ''
|
||||
debug_apk = custom_target(
|
||||
'mpd-debug.apk',
|
||||
output: 'mpd-debug.apk',
|
||||
input: unsigned_apk,
|
||||
command: [
|
||||
jarsigner,
|
||||
'-keystore', get_option('android_debug_keystore'),
|
||||
'-storepass', 'android',
|
||||
'-signedjar', '@OUTPUT@',
|
||||
'@INPUT@',
|
||||
'androiddebugkey',
|
||||
],
|
||||
build_by_default: true
|
||||
)
|
||||
endif
|
||||
|
||||
if get_option('android_keystore') != '' and get_option('android_keyalias') != '' and get_option('android_keypass') != ''
|
||||
unaligned_apk = custom_target(
|
||||
'mpd-unaligned.apk',
|
||||
output: 'mpd-unaligned.apk',
|
||||
input: unsigned_apk,
|
||||
command: [
|
||||
jarsigner,
|
||||
'-digestalg', 'SHA1', '-sigalg', 'MD5withRSA',
|
||||
'-keystore', get_option('android_keystore'),
|
||||
'-storepass', get_option('android_keypass'),
|
||||
'-signedjar', '@OUTPUT@',
|
||||
'@INPUT@',
|
||||
get_option('android_keyalias'),
|
||||
],
|
||||
)
|
||||
|
||||
apk = custom_target(
|
||||
'mpd.apk',
|
||||
output: 'mpd.apk',
|
||||
input: unaligned_apk,
|
||||
command: [
|
||||
android_zipalign,
|
||||
'-f', '4',
|
||||
'@INPUT@', '@OUTPUT@',
|
||||
],
|
||||
build_by_default: true
|
||||
)
|
||||
endif
|
||||
196
android/build.py
Executable file
196
android/build.py
Executable file
@@ -0,0 +1,196 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os, os.path
|
||||
import sys, subprocess
|
||||
|
||||
if len(sys.argv) < 4:
|
||||
print("Usage: build.py SDK_PATH NDK_PATH ABI [configure_args...]", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
sdk_path = sys.argv[1]
|
||||
ndk_path = sys.argv[2]
|
||||
android_abi = sys.argv[3]
|
||||
configure_args = sys.argv[4:]
|
||||
|
||||
if not os.path.isfile(os.path.join(sdk_path, 'tools', 'android')):
|
||||
print("SDK not found in", ndk_path, file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
if not os.path.isdir(ndk_path):
|
||||
print("NDK not found in", ndk_path, file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
android_abis = {
|
||||
'armeabi-v7a': {
|
||||
'arch': 'arm-linux-androideabi',
|
||||
'ndk_arch': 'arm',
|
||||
'toolchain_arch': 'arm-linux-androideabi',
|
||||
'llvm_triple': 'armv7-none-linux-androideabi',
|
||||
'cflags': '-march=armv7-a -mfpu=vfp -mfloat-abi=softfp',
|
||||
},
|
||||
|
||||
'arm64-v8a': {
|
||||
'android_api_level': '21',
|
||||
'arch': 'aarch64-linux-android',
|
||||
'ndk_arch': 'arm64',
|
||||
'toolchain_arch': 'aarch64-linux-android',
|
||||
'llvm_triple': 'aarch64-none-linux-android',
|
||||
'cflags': '',
|
||||
},
|
||||
|
||||
'x86': {
|
||||
'arch': 'i686-linux-android',
|
||||
'ndk_arch': 'x86',
|
||||
'toolchain_arch': 'x86',
|
||||
'llvm_triple': 'i686-none-linux-android',
|
||||
'cflags': '-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32',
|
||||
},
|
||||
}
|
||||
|
||||
# select the NDK target
|
||||
abi_info = android_abis[android_abi]
|
||||
arch = abi_info['arch']
|
||||
|
||||
# the path to the MPD sources
|
||||
mpd_path = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]) or '.', '..'))
|
||||
sys.path[0] = os.path.join(mpd_path, 'python')
|
||||
|
||||
# output directories
|
||||
from build.dirs import lib_path, tarball_path, src_path
|
||||
from build.meson import configure as run_meson
|
||||
|
||||
arch_path = os.path.join(lib_path, arch)
|
||||
build_path = os.path.join(arch_path, 'build')
|
||||
|
||||
# build host configuration
|
||||
build_arch = 'linux-x86_64'
|
||||
|
||||
# set up the NDK toolchain
|
||||
|
||||
class AndroidNdkToolchain:
|
||||
def __init__(self, tarball_path, src_path, build_path,
|
||||
use_cxx):
|
||||
self.tarball_path = tarball_path
|
||||
self.src_path = src_path
|
||||
self.build_path = build_path
|
||||
|
||||
ndk_arch = abi_info['ndk_arch']
|
||||
android_api_level = '21'
|
||||
ndk_platform = 'android-' + android_api_level
|
||||
|
||||
# select the NDK compiler
|
||||
gcc_version = '4.9'
|
||||
|
||||
ndk_platform_path = os.path.join(ndk_path, 'platforms', ndk_platform)
|
||||
sysroot = os.path.join(ndk_path, 'sysroot')
|
||||
target_root = os.path.join(ndk_platform_path, 'arch-' + ndk_arch)
|
||||
|
||||
install_prefix = os.path.join(arch_path, 'root')
|
||||
|
||||
self.arch = arch
|
||||
self.install_prefix = install_prefix
|
||||
self.sysroot = sysroot
|
||||
|
||||
toolchain_path = os.path.join(ndk_path, 'toolchains', abi_info['toolchain_arch'] + '-' + gcc_version, 'prebuilt', build_arch)
|
||||
llvm_path = os.path.join(ndk_path, 'toolchains', 'llvm', 'prebuilt', build_arch)
|
||||
llvm_triple = abi_info['llvm_triple']
|
||||
|
||||
common_flags = '-Os -g'
|
||||
common_flags += ' -fPIC'
|
||||
common_flags += ' ' + abi_info['cflags']
|
||||
|
||||
toolchain_bin = os.path.join(toolchain_path, 'bin')
|
||||
llvm_bin = os.path.join(llvm_path, 'bin')
|
||||
self.cc = os.path.join(llvm_bin, 'clang')
|
||||
self.cxx = os.path.join(llvm_bin, 'clang++')
|
||||
common_flags += ' -target ' + llvm_triple + ' -integrated-as -gcc-toolchain ' + toolchain_path
|
||||
|
||||
common_flags += ' -fvisibility=hidden -fdata-sections -ffunction-sections'
|
||||
|
||||
self.ar = os.path.join(toolchain_bin, arch + '-ar')
|
||||
self.ranlib = os.path.join(toolchain_bin, arch + '-ranlib')
|
||||
self.nm = os.path.join(toolchain_bin, arch + '-nm')
|
||||
self.strip = os.path.join(toolchain_bin, arch + '-strip')
|
||||
|
||||
self.cflags = common_flags
|
||||
self.cxxflags = common_flags
|
||||
self.cppflags = '--sysroot=' + sysroot + \
|
||||
' -isystem ' + os.path.join(install_prefix, 'include') + \
|
||||
' -isystem ' + os.path.join(sysroot, 'usr', 'include', arch) + \
|
||||
' -D__ANDROID_API__=' + android_api_level
|
||||
self.ldflags = '--sysroot=' + sysroot + \
|
||||
' -L' + os.path.join(install_prefix, 'lib') + \
|
||||
' -L' + os.path.join(target_root, 'usr', 'lib') + \
|
||||
' -B' + os.path.join(target_root, 'usr', 'lib') + \
|
||||
' ' + common_flags
|
||||
self.libs = ''
|
||||
|
||||
self.is_arm = ndk_arch == 'arm'
|
||||
self.is_armv7 = self.is_arm and 'armv7' in self.cflags
|
||||
self.is_aarch64 = ndk_arch == 'arm64'
|
||||
self.is_windows = False
|
||||
|
||||
libcxx_path = os.path.join(ndk_path, 'sources/cxx-stl/llvm-libc++')
|
||||
libcxx_libs_path = os.path.join(libcxx_path, 'libs', android_abi)
|
||||
|
||||
libstdcxx_flags = ''
|
||||
libstdcxx_cxxflags = libstdcxx_flags + ' -isystem ' + os.path.join(libcxx_path, 'include') + ' -isystem ' + os.path.join(ndk_path, 'sources/android/support/include')
|
||||
libstdcxx_ldflags = libstdcxx_flags + ' -L' + libcxx_libs_path
|
||||
libstdcxx_libs = '-lc++_static -lc++abi'
|
||||
|
||||
if use_cxx:
|
||||
self.cxxflags += ' ' + libstdcxx_cxxflags
|
||||
self.ldflags += ' ' + libstdcxx_ldflags
|
||||
self.libs += ' ' + libstdcxx_libs
|
||||
|
||||
self.env = dict(os.environ)
|
||||
|
||||
# redirect pkg-config to use our root directory instead of the
|
||||
# default one on the build host
|
||||
import shutil
|
||||
bin_dir = os.path.join(install_prefix, 'bin')
|
||||
try:
|
||||
os.makedirs(bin_dir)
|
||||
except:
|
||||
pass
|
||||
self.pkg_config = shutil.copy(os.path.join(mpd_path, 'build', 'pkg-config.sh'),
|
||||
os.path.join(bin_dir, 'pkg-config'))
|
||||
self.env['PKG_CONFIG'] = self.pkg_config
|
||||
|
||||
# a list of third-party libraries to be used by MPD on Android
|
||||
from build.libs import *
|
||||
thirdparty_libs = [
|
||||
libmpdclient,
|
||||
libogg,
|
||||
libvorbis,
|
||||
opus,
|
||||
flac,
|
||||
libid3tag,
|
||||
ffmpeg,
|
||||
curl,
|
||||
libexpat,
|
||||
libnfs,
|
||||
boost,
|
||||
]
|
||||
|
||||
# build the third-party libraries
|
||||
for x in thirdparty_libs:
|
||||
toolchain = AndroidNdkToolchain(tarball_path, src_path, build_path,
|
||||
use_cxx=x.use_cxx)
|
||||
if not x.is_installed(toolchain):
|
||||
x.build(toolchain)
|
||||
|
||||
# configure and build MPD
|
||||
toolchain = AndroidNdkToolchain(tarball_path, src_path, build_path,
|
||||
use_cxx=True)
|
||||
|
||||
configure_args += [
|
||||
'-Dandroid_sdk=' + sdk_path,
|
||||
'-Dandroid_ndk=' + ndk_path,
|
||||
'-Dandroid_abi=' + android_abi,
|
||||
'-Dandroid_strip=' + toolchain.strip,
|
||||
]
|
||||
|
||||
from build.meson import configure as run_meson
|
||||
run_meson(toolchain, mpd_path, '.', configure_args)
|
||||
subprocess.check_call(['/usr/bin/ninja'], env=toolchain.env)
|
||||
11
android/custom_rules.xml
Normal file
11
android/custom_rules.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<project name="mpd_rules">
|
||||
<!-- setting these two properties works around a bug in Android
|
||||
SDK's build.xml, which deletes all .class files every time -->
|
||||
<property name="build.last.is.packaging.debug" value="true" />
|
||||
<property name="build.is.packaging.debug" value="true" />
|
||||
|
||||
<target name="compile-jni-classes"
|
||||
depends="-set-debug-mode,-compile"/>
|
||||
</project>
|
||||
24
android/make-resources-apk.sh
Executable file
24
android/make-resources-apk.sh
Executable file
@@ -0,0 +1,24 @@
|
||||
#!/bin/sh -e
|
||||
|
||||
S=`dirname "$0"`
|
||||
AAPT=$1
|
||||
BASE_JAR=$2
|
||||
JAVA_PKG=$3
|
||||
JAVA_PKG_PATH=$4
|
||||
APK_FILE="$5"
|
||||
D=`dirname "$APK_FILE"`
|
||||
|
||||
rm -rf "$D/res"
|
||||
mkdir -p "$D/res/drawable" "$D/src"
|
||||
cp "$D/icon.png" "$D/notification_icon.png" "$D/res/drawable/"
|
||||
|
||||
"$AAPT" package -f -m --auto-add-overlay \
|
||||
--custom-package "$JAVA_PKG" \
|
||||
-M "$S/AndroidManifest.xml" \
|
||||
-S "$D/res" \
|
||||
-S "$S/res" \
|
||||
-J "$D/src" \
|
||||
-I "$BASE_JAR" \
|
||||
-F "$D/resources.apk"
|
||||
|
||||
cp "$D/src/$JAVA_PKG_PATH/R.java" "$D/"
|
||||
140
android/meson.build
Normal file
140
android/meson.build
Normal file
@@ -0,0 +1,140 @@
|
||||
android_package = 'org.musicpd'
|
||||
android_package_path = join_paths(android_package.split('.'))
|
||||
|
||||
android_ndk = get_option('android_ndk')
|
||||
android_sdk = get_option('android_sdk')
|
||||
android_abi = get_option('android_abi')
|
||||
|
||||
android_sdk_build_tools_version = '27.0.0'
|
||||
android_sdk_platform = 'android-21'
|
||||
|
||||
android_build_tools_dir = join_paths(android_sdk, 'build-tools', android_sdk_build_tools_version)
|
||||
android_sdk_platform_dir = join_paths(android_sdk, 'platforms', android_sdk_platform)
|
||||
|
||||
android_aidl = join_paths(android_build_tools_dir, 'aidl')
|
||||
android_aapt = join_paths(android_build_tools_dir, 'aapt')
|
||||
android_dx = join_paths(android_build_tools_dir, 'dx')
|
||||
android_zipalign = join_paths(android_build_tools_dir, 'zipalign')
|
||||
|
||||
javac = find_program('javac')
|
||||
jarsigner = find_program('jarsigner')
|
||||
rsvg_convert = find_program('rsvg-convert')
|
||||
convert = find_program('convert')
|
||||
zip = find_program('zip')
|
||||
|
||||
common_cppflags += '-I' + join_paths(meson.current_build_dir(), 'include')
|
||||
|
||||
#
|
||||
# AIDL
|
||||
#
|
||||
|
||||
IMainCallback_java = custom_target(
|
||||
'IMainCallback.java',
|
||||
output: 'IMainCallback.java',
|
||||
input: join_paths(meson.current_source_dir(), 'src', 'IMainCallback.aidl'),
|
||||
command: [
|
||||
join_paths(meson.current_source_dir(), 'run-aidl.sh'),
|
||||
android_aidl,
|
||||
'@INPUT@',
|
||||
'@OUTPUT@',
|
||||
join_paths(meson.current_build_dir(), 'src'),
|
||||
android_package_path,
|
||||
],
|
||||
)
|
||||
|
||||
IMain_java = custom_target(
|
||||
'IMain.java',
|
||||
output: 'IMain.java',
|
||||
input: join_paths(meson.current_source_dir(), 'src', 'IMain.aidl'),
|
||||
depends: IMainCallback_java,
|
||||
command: [
|
||||
join_paths(meson.current_source_dir(), 'run-aidl.sh'),
|
||||
android_aidl,
|
||||
'@INPUT@',
|
||||
'@OUTPUT@',
|
||||
join_paths(meson.current_build_dir(), 'src'),
|
||||
android_package_path,
|
||||
],
|
||||
)
|
||||
|
||||
#
|
||||
# Resources
|
||||
#
|
||||
|
||||
android_icon = custom_target(
|
||||
'Android icon',
|
||||
output: 'icon.png',
|
||||
input: '../mpd.svg',
|
||||
command: [
|
||||
rsvg_convert, '--width=48', '--height=48', '@INPUT@', '-o', '@OUTPUT@',
|
||||
],
|
||||
)
|
||||
|
||||
android_notification_icon = custom_target(
|
||||
'Android notification icon',
|
||||
output: 'notification_icon.png',
|
||||
input: android_icon,
|
||||
command: [
|
||||
convert, '@INPUT@', '-colorspace', 'Gray', '-gamma', '2.2', '@OUTPUT@',
|
||||
],
|
||||
)
|
||||
|
||||
resources_apk = custom_target(
|
||||
'resources.apk',
|
||||
output: ['resources.apk', 'R.java'],
|
||||
input: [
|
||||
'res/layout/custom_notification_gb.xml',
|
||||
'res/layout/log_item.xml',
|
||||
'res/layout/settings.xml',
|
||||
'res/values/strings.xml',
|
||||
android_icon,
|
||||
android_notification_icon,
|
||||
],
|
||||
command: [
|
||||
join_paths(meson.current_source_dir(), 'make-resources-apk.sh'),
|
||||
android_aapt,
|
||||
join_paths(android_sdk_platform_dir, 'android.jar'),
|
||||
android_package,
|
||||
android_package_path,
|
||||
'@OUTPUT0@',
|
||||
],
|
||||
)
|
||||
|
||||
#
|
||||
# Compile Java
|
||||
#
|
||||
|
||||
classes_jar = custom_target(
|
||||
'classes.jar',
|
||||
output: 'classes.jar',
|
||||
input: [
|
||||
'src/Bridge.java',
|
||||
'src/Loader.java',
|
||||
'src/Main.java',
|
||||
'src/Receiver.java',
|
||||
'src/Settings.java',
|
||||
IMain_java,
|
||||
IMainCallback_java,
|
||||
resources_apk[1],
|
||||
],
|
||||
command: [
|
||||
join_paths(meson.current_source_dir(), 'run-javac.sh'),
|
||||
javac,
|
||||
join_paths(android_sdk_platform_dir, 'android.jar'),
|
||||
android_package_path,
|
||||
zip,
|
||||
'@OUTPUT@',
|
||||
'@INPUT@',
|
||||
],
|
||||
)
|
||||
|
||||
classes_dex = custom_target(
|
||||
'classes.dex',
|
||||
output: 'classes.dex',
|
||||
input: classes_jar,
|
||||
command: [
|
||||
android_dx,
|
||||
'--dex', '--output', '@OUTPUT@',
|
||||
'@INPUT@',
|
||||
],
|
||||
)
|
||||
22
android/res/layout/custom_notification_gb.xml
Normal file
22
android/res/layout/custom_notification_gb.xml
Normal file
@@ -0,0 +1,22 @@
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/layout"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:padding="10dp" >
|
||||
<ImageView android:id="@+id/image"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_marginRight="10dp" />
|
||||
<TextView android:id="@+id/title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toRightOf="@id/image"
|
||||
style="Custom Notification Title" />
|
||||
<TextView android:id="@+id/text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toRightOf="@id/image"
|
||||
android:layout_below="@id/title"
|
||||
style="Custom Notification Text" />
|
||||
</RelativeLayout>
|
||||
5
android/res/layout/log_item.xml
Normal file
5
android/res/layout/log_item.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:typeface="monospace" />
|
||||
37
android/res/layout/settings.xml
Normal file
37
android/res/layout/settings.xml
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<ToggleButton
|
||||
android:id="@+id/run"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textOn="@string/toggle_button_run_on"
|
||||
android:textOff="@string/toggle_button_run_off" />
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/run_on_boot"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/checkbox_run_on_boot" />
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/wakelock"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/checkbox_wakelock" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<ListView
|
||||
android:id="@+id/log_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="10dip" />
|
||||
|
||||
</LinearLayout>
|
||||
11
android/res/values/strings.xml
Normal file
11
android/res/values/strings.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<resources>
|
||||
<string name="app_name">MPD</string>
|
||||
<string name="notification_title_mpd_running">Music Player Daemon is running</string>
|
||||
<string name="notification_text_mpd_running">Touch for MPD options.</string>
|
||||
<string name="toggle_button_run_on">MPD is running</string>
|
||||
<string name="toggle_button_run_off">MPD is not running</string>
|
||||
<string name="checkbox_run_on_boot">Run MPD automatically on boot</string>
|
||||
<string name="checkbox_wakelock">Prevent suspend when MPD is running (Wakelock)</string>
|
||||
</resources>
|
||||
12
android/run-aidl.sh
Executable file
12
android/run-aidl.sh
Executable file
@@ -0,0 +1,12 @@
|
||||
#!/bin/sh -e
|
||||
|
||||
AIDL=$1
|
||||
SRC=$2
|
||||
DST=$3
|
||||
GENSRC=$4
|
||||
JAVA_PKG_PATH=$5
|
||||
|
||||
mkdir -p "$GENSRC/$JAVA_PKG_PATH"
|
||||
cp "$SRC" "$GENSRC/$JAVA_PKG_PATH/"
|
||||
"$AIDL" -I"$GENSRC" -o"$GENSRC" "$GENSRC/$JAVA_PKG_PATH/`basename $SRC`"
|
||||
exec cp "$GENSRC/$JAVA_PKG_PATH/`basename $DST`" "$DST"
|
||||
22
android/run-javac.sh
Executable file
22
android/run-javac.sh
Executable file
@@ -0,0 +1,22 @@
|
||||
#!/bin/sh -e
|
||||
|
||||
JAVAC=$1
|
||||
CLASSPATH=$2
|
||||
JAVA_PKG_PATH=$3
|
||||
ZIP=$4
|
||||
JARFILE=`realpath "$5"`
|
||||
shift 5
|
||||
|
||||
D=`dirname "$JARFILE"`
|
||||
GENSRC="$D/src"
|
||||
GENCLASS="$D/classes"
|
||||
GENINCLUDE="$D/include"
|
||||
|
||||
mkdir -p "$GENSRC/$JAVA_PKG_PATH"
|
||||
"$JAVAC" -source 1.6 -target 1.6 -Xlint:-options \
|
||||
-cp "$CLASSPATH" \
|
||||
-h "$GENINCLUDE" \
|
||||
-d "$GENCLASS" \
|
||||
"$@"
|
||||
cd "$GENCLASS"
|
||||
zip -q -r "$JARFILE" .
|
||||
36
android/src/Bridge.java
Normal file
36
android/src/Bridge.java
Normal file
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
package org.musicpd;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
/**
|
||||
* Bridge to native code.
|
||||
*/
|
||||
public class Bridge {
|
||||
|
||||
/* used by jni */
|
||||
public interface LogListener {
|
||||
public void onLog(int priority, String msg);
|
||||
}
|
||||
|
||||
public static native void run(Context context, LogListener logListener);
|
||||
public static native void shutdown();
|
||||
}
|
||||
12
android/src/IMain.aidl
Normal file
12
android/src/IMain.aidl
Normal file
@@ -0,0 +1,12 @@
|
||||
package org.musicpd;
|
||||
import org.musicpd.IMainCallback;
|
||||
|
||||
interface IMain
|
||||
{
|
||||
void start();
|
||||
void stop();
|
||||
void setWakelockEnabled(boolean enabled);
|
||||
boolean isRunning();
|
||||
void registerCallback(IMainCallback cb);
|
||||
void unregisterCallback(IMainCallback cb);
|
||||
}
|
||||
9
android/src/IMainCallback.aidl
Normal file
9
android/src/IMainCallback.aidl
Normal file
@@ -0,0 +1,9 @@
|
||||
package org.musicpd;
|
||||
|
||||
interface IMainCallback
|
||||
{
|
||||
void onStarted();
|
||||
void onStopped();
|
||||
void onError(String error);
|
||||
void onLog(int priority, String msg);
|
||||
}
|
||||
39
android/src/Loader.java
Normal file
39
android/src/Loader.java
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
package org.musicpd;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
public class Loader {
|
||||
private static final String TAG = "MPD";
|
||||
|
||||
public static boolean loaded = false;
|
||||
public static String error;
|
||||
|
||||
static {
|
||||
try {
|
||||
System.loadLibrary("mpd");
|
||||
loaded = true;
|
||||
} catch (UnsatisfiedLinkError e) {
|
||||
Log.e(TAG, e.getMessage());
|
||||
error = e.getMessage();
|
||||
}
|
||||
}
|
||||
}
|
||||
378
android/src/Main.java
Normal file
378
android/src/Main.java
Normal file
@@ -0,0 +1,378 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
package org.musicpd;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.Notification;
|
||||
import android.app.PendingIntent;
|
||||
import android.app.Service;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.ServiceConnection;
|
||||
import android.os.Build;
|
||||
import android.os.IBinder;
|
||||
import android.os.PowerManager;
|
||||
import android.os.RemoteCallbackList;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Log;
|
||||
import android.widget.RemoteViews;
|
||||
|
||||
public class Main extends Service implements Runnable {
|
||||
private static final String TAG = "Main";
|
||||
private static final String REMOTE_ERROR = "MPD process was killed";
|
||||
private static final int MAIN_STATUS_ERROR = -1;
|
||||
private static final int MAIN_STATUS_STOPPED = 0;
|
||||
private static final int MAIN_STATUS_STARTED = 1;
|
||||
|
||||
private static final int MSG_SEND_STATUS = 0;
|
||||
private static final int MSG_SEND_LOG = 1;
|
||||
|
||||
private Thread mThread = null;
|
||||
private int mStatus = MAIN_STATUS_STOPPED;
|
||||
private boolean mAbort = false;
|
||||
private String mError = null;
|
||||
private final RemoteCallbackList<IMainCallback> mCallbacks = new RemoteCallbackList<IMainCallback>();
|
||||
private final IBinder mBinder = new MainStub(this);
|
||||
private PowerManager.WakeLock mWakelock = null;
|
||||
|
||||
static class MainStub extends IMain.Stub {
|
||||
private Main mService;
|
||||
MainStub(Main service) {
|
||||
mService = service;
|
||||
}
|
||||
public void start() {
|
||||
mService.start();
|
||||
}
|
||||
public void stop() {
|
||||
mService.stop();
|
||||
}
|
||||
public void setWakelockEnabled(boolean enabled) {
|
||||
mService.setWakelockEnabled(enabled);
|
||||
}
|
||||
public boolean isRunning() {
|
||||
return mService.isRunning();
|
||||
}
|
||||
public void registerCallback(IMainCallback cb) {
|
||||
mService.registerCallback(cb);
|
||||
}
|
||||
public void unregisterCallback(IMainCallback cb) {
|
||||
mService.unregisterCallback(cb);
|
||||
}
|
||||
}
|
||||
|
||||
private synchronized void sendMessage(int what, int arg1, int arg2, Object obj) {
|
||||
int i = mCallbacks.beginBroadcast();
|
||||
while (i > 0) {
|
||||
i--;
|
||||
final IMainCallback cb = mCallbacks.getBroadcastItem(i);
|
||||
try {
|
||||
switch (what) {
|
||||
case MSG_SEND_STATUS:
|
||||
switch (arg1) {
|
||||
case MAIN_STATUS_ERROR:
|
||||
cb.onError((String)obj);
|
||||
break;
|
||||
case MAIN_STATUS_STOPPED:
|
||||
cb.onStopped();
|
||||
break;
|
||||
case MAIN_STATUS_STARTED:
|
||||
cb.onStarted();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case MSG_SEND_LOG:
|
||||
cb.onLog(arg1, (String) obj);
|
||||
break;
|
||||
}
|
||||
} catch (RemoteException e) {
|
||||
}
|
||||
}
|
||||
mCallbacks.finishBroadcast();
|
||||
}
|
||||
|
||||
private Bridge.LogListener mLogListener = new Bridge.LogListener() {
|
||||
@Override
|
||||
public void onLog(int priority, String msg) {
|
||||
sendMessage(MSG_SEND_LOG, priority, 0, msg);
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public IBinder onBind(Intent intent) {
|
||||
return mBinder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||
start();
|
||||
if (intent != null && intent.getBooleanExtra("wakelock", false))
|
||||
setWakelockEnabled(true);
|
||||
return START_STICKY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (!Loader.loaded) {
|
||||
final String error = "Failed to load the native MPD libary.\n" +
|
||||
"Report this problem to us, and include the following information:\n" +
|
||||
"SUPPORTED_ABIS=" + String.join(", ", Build.SUPPORTED_ABIS) + "\n" +
|
||||
"PRODUCT=" + Build.PRODUCT + "\n" +
|
||||
"FINGERPRINT=" + Build.FINGERPRINT + "\n" +
|
||||
"error=" + Loader.error;
|
||||
setStatus(MAIN_STATUS_ERROR, error);
|
||||
stopSelf();
|
||||
return;
|
||||
}
|
||||
synchronized (this) {
|
||||
if (mAbort)
|
||||
return;
|
||||
setStatus(MAIN_STATUS_STARTED, null);
|
||||
}
|
||||
Bridge.run(this, mLogListener);
|
||||
setStatus(MAIN_STATUS_STOPPED, null);
|
||||
}
|
||||
|
||||
private synchronized void setStatus(int status, String error) {
|
||||
mStatus = status;
|
||||
mError = error;
|
||||
sendMessage(MSG_SEND_STATUS, mStatus, 0, mError);
|
||||
}
|
||||
|
||||
private void start() {
|
||||
if (mThread != null)
|
||||
return;
|
||||
mThread = new Thread(this);
|
||||
mThread.start();
|
||||
|
||||
final Intent mainIntent = new Intent(this, Settings.class);
|
||||
mainIntent.setAction("android.intent.action.MAIN");
|
||||
mainIntent.addCategory("android.intent.category.LAUNCHER");
|
||||
final PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
|
||||
mainIntent, PendingIntent.FLAG_CANCEL_CURRENT);
|
||||
|
||||
Notification notification = new Notification.Builder(this)
|
||||
.setContentTitle(getText(R.string.notification_title_mpd_running))
|
||||
.setContentText(getText(R.string.notification_text_mpd_running))
|
||||
.setSmallIcon(R.drawable.notification_icon)
|
||||
.setContentIntent(contentIntent)
|
||||
.build();
|
||||
|
||||
startForeground(R.string.notification_title_mpd_running, notification);
|
||||
startService(new Intent(this, Main.class));
|
||||
}
|
||||
|
||||
private void stop() {
|
||||
if (mThread != null) {
|
||||
if (mThread.isAlive()) {
|
||||
synchronized (this) {
|
||||
if (mStatus == MAIN_STATUS_STARTED)
|
||||
Bridge.shutdown();
|
||||
else
|
||||
mAbort = true;
|
||||
}
|
||||
}
|
||||
try {
|
||||
mThread.join();
|
||||
mThread = null;
|
||||
mAbort = false;
|
||||
} catch (InterruptedException ie) {}
|
||||
}
|
||||
setWakelockEnabled(false);
|
||||
stopForeground(true);
|
||||
stopSelf();
|
||||
}
|
||||
|
||||
private void setWakelockEnabled(boolean enabled) {
|
||||
if (enabled && mWakelock == null) {
|
||||
PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
|
||||
mWakelock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
|
||||
mWakelock.acquire();
|
||||
Log.d(TAG, "Wakelock acquired");
|
||||
} else if (!enabled && mWakelock != null) {
|
||||
mWakelock.release();
|
||||
mWakelock = null;
|
||||
Log.d(TAG, "Wakelock released");
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isRunning() {
|
||||
return mThread != null && mThread.isAlive();
|
||||
}
|
||||
|
||||
private void registerCallback(IMainCallback cb) {
|
||||
if (cb != null) {
|
||||
mCallbacks.register(cb);
|
||||
sendMessage(MSG_SEND_STATUS, mStatus, 0, mError);
|
||||
}
|
||||
}
|
||||
|
||||
private void unregisterCallback(IMainCallback cb) {
|
||||
if (cb != null) {
|
||||
mCallbacks.unregister(cb);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Client that bind the Main Service in order to send commands and receive callback
|
||||
*/
|
||||
public static class Client {
|
||||
|
||||
public interface Callback {
|
||||
public void onStarted();
|
||||
public void onStopped();
|
||||
public void onError(String error);
|
||||
public void onLog(int priority, String msg);
|
||||
}
|
||||
|
||||
private boolean mBound = false;
|
||||
private final Context mContext;
|
||||
private Callback mCallback;
|
||||
private IMain mIMain = null;
|
||||
|
||||
private final IMainCallback.Stub mICallback = new IMainCallback.Stub() {
|
||||
|
||||
@Override
|
||||
public void onStopped() throws RemoteException {
|
||||
mCallback.onStopped();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStarted() throws RemoteException {
|
||||
mCallback.onStarted();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(String error) throws RemoteException {
|
||||
mCallback.onError(error);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLog(int priority, String msg) throws RemoteException {
|
||||
mCallback.onLog(priority, msg);
|
||||
}
|
||||
};
|
||||
|
||||
private final ServiceConnection mServiceConnection = new ServiceConnection() {
|
||||
|
||||
@Override
|
||||
public void onServiceConnected(ComponentName name, IBinder service) {
|
||||
synchronized (this) {
|
||||
mIMain = IMain.Stub.asInterface(service);
|
||||
try {
|
||||
if (mCallback != null)
|
||||
mIMain.registerCallback(mICallback);
|
||||
} catch (RemoteException e) {
|
||||
if (mCallback != null)
|
||||
mCallback.onError(REMOTE_ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceDisconnected(ComponentName name) {
|
||||
if (mCallback != null)
|
||||
mCallback.onError(REMOTE_ERROR);
|
||||
}
|
||||
};
|
||||
|
||||
public Client(Context context, Callback cb) throws IllegalArgumentException {
|
||||
if (context == null)
|
||||
throw new IllegalArgumentException("Context can't be null");
|
||||
mContext = context;
|
||||
mCallback = cb;
|
||||
mBound = mContext.bindService(new Intent(mContext, Main.class), mServiceConnection, Context.BIND_AUTO_CREATE);
|
||||
}
|
||||
|
||||
public boolean start() {
|
||||
synchronized (this) {
|
||||
if (mIMain != null) {
|
||||
try {
|
||||
mIMain.start();
|
||||
return true;
|
||||
} catch (RemoteException e) {
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean stop() {
|
||||
synchronized (this) {
|
||||
if (mIMain != null) {
|
||||
try {
|
||||
mIMain.stop();
|
||||
return true;
|
||||
} catch (RemoteException e) {
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean setWakelockEnabled(boolean enabled) {
|
||||
synchronized (this) {
|
||||
if (mIMain != null) {
|
||||
try {
|
||||
mIMain.setWakelockEnabled(enabled);
|
||||
return true;
|
||||
} catch (RemoteException e) {
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isRunning() {
|
||||
synchronized (this) {
|
||||
if (mIMain != null) {
|
||||
try {
|
||||
return mIMain.isRunning();
|
||||
} catch (RemoteException e) {
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public void release() {
|
||||
if (mBound) {
|
||||
synchronized (this) {
|
||||
if (mIMain != null && mICallback != null) {
|
||||
try {
|
||||
if (mCallback != null)
|
||||
mIMain.unregisterCallback(mICallback);
|
||||
} catch (RemoteException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
mBound = false;
|
||||
mContext.unbindService(mServiceConnection);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* start Main service without any callback
|
||||
*/
|
||||
public static void start(Context context, boolean wakelock) {
|
||||
context.startService(new Intent(context, Main.class).putExtra("wakelock", wakelock));
|
||||
}
|
||||
}
|
||||
41
android/src/Receiver.java
Normal file
41
android/src/Receiver.java
Normal file
@@ -0,0 +1,41 @@
|
||||
|
||||
/*
|
||||
* Copyright (C) 2003-2014 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
package org.musicpd;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.util.Log;
|
||||
|
||||
public class Receiver extends BroadcastReceiver {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
Log.d("Receiver", "onReceive: " + intent);
|
||||
if (intent.getAction() == "android.intent.action.BOOT_COMPLETED") {
|
||||
if (Settings.Preferences.getBoolean(context,
|
||||
Settings.Preferences.KEY_RUN_ON_BOOT, false)) {
|
||||
final boolean wakelock = Settings.Preferences.getBoolean(context,
|
||||
Settings.Preferences.KEY_WAKELOCK, false);
|
||||
Main.start(context, wakelock);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
254
android/src/Settings.java
Normal file
254
android/src/Settings.java
Normal file
@@ -0,0 +1,254 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
package org.musicpd;
|
||||
|
||||
import java.util.LinkedList;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.SharedPreferences.Editor;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.util.Log;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.CompoundButton.OnCheckedChangeListener;
|
||||
import android.widget.ListView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.ToggleButton;
|
||||
|
||||
public class Settings extends Activity {
|
||||
private static final String TAG = "Settings";
|
||||
private Main.Client mClient;
|
||||
private TextView mTextStatus;
|
||||
private ToggleButton mRunButton;
|
||||
private boolean mFirstRun;
|
||||
private LinkedList<String> mLogListArray = new LinkedList<String>();
|
||||
private ListView mLogListView;
|
||||
private ArrayAdapter<String> mLogListAdapter;
|
||||
|
||||
private static final int MAX_LOGS = 500;
|
||||
|
||||
private static final int MSG_ERROR = 0;
|
||||
private static final int MSG_STOPPED = 1;
|
||||
private static final int MSG_STARTED = 2;
|
||||
private static final int MSG_LOG = 3;
|
||||
|
||||
public static class Preferences {
|
||||
public static final String KEY_RUN_ON_BOOT ="run_on_boot";
|
||||
public static final String KEY_WAKELOCK ="wakelock";
|
||||
|
||||
public static SharedPreferences get(Context context) {
|
||||
return context.getSharedPreferences(TAG, MODE_PRIVATE);
|
||||
}
|
||||
|
||||
public static void putBoolean(Context context, String key, boolean value) {
|
||||
final SharedPreferences prefs = get(context);
|
||||
|
||||
if (prefs == null)
|
||||
return;
|
||||
final Editor editor = prefs.edit();
|
||||
editor.putBoolean(key, value);
|
||||
editor.apply();
|
||||
}
|
||||
|
||||
public static boolean getBoolean(Context context, String key, boolean defValue) {
|
||||
final SharedPreferences prefs = get(context);
|
||||
|
||||
return prefs != null ? prefs.getBoolean(key, defValue) : defValue;
|
||||
}
|
||||
}
|
||||
|
||||
private Handler mHandler = new Handler(new Handler.Callback() {
|
||||
@Override
|
||||
public boolean handleMessage(Message msg) {
|
||||
switch (msg.what) {
|
||||
case MSG_ERROR:
|
||||
Log.d(TAG, "onError");
|
||||
|
||||
mClient.release();
|
||||
connectClient();
|
||||
|
||||
mRunButton.setEnabled(false);
|
||||
mRunButton.setChecked(false);
|
||||
|
||||
mTextStatus.setText((String)msg.obj);
|
||||
mFirstRun = true;
|
||||
break;
|
||||
case MSG_STOPPED:
|
||||
Log.d(TAG, "onStopped");
|
||||
mRunButton.setEnabled(true);
|
||||
if (!mFirstRun && Preferences.getBoolean(Settings.this, Preferences.KEY_RUN_ON_BOOT, false))
|
||||
mRunButton.setChecked(true);
|
||||
else
|
||||
mRunButton.setChecked(false);
|
||||
mFirstRun = true;
|
||||
break;
|
||||
case MSG_STARTED:
|
||||
Log.d(TAG, "onStarted");
|
||||
mRunButton.setChecked(true);
|
||||
mFirstRun = true;
|
||||
mTextStatus.setText("CAUTION: this version is EXPERIMENTAL!"); // XXX
|
||||
break;
|
||||
case MSG_LOG:
|
||||
if (mLogListArray.size() > MAX_LOGS)
|
||||
mLogListArray.remove(0);
|
||||
String priority;
|
||||
switch (msg.arg1) {
|
||||
case Log.DEBUG:
|
||||
priority = "D";
|
||||
break;
|
||||
case Log.ERROR:
|
||||
priority = "E";
|
||||
break;
|
||||
case Log.INFO:
|
||||
priority = "I";
|
||||
break;
|
||||
case Log.VERBOSE:
|
||||
priority = "V";
|
||||
break;
|
||||
case Log.WARN:
|
||||
priority = "W";
|
||||
break;
|
||||
default:
|
||||
priority = "";
|
||||
}
|
||||
mLogListArray.add(priority + "/ " + (String)msg.obj);
|
||||
mLogListAdapter.notifyDataSetChanged();
|
||||
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
private final OnCheckedChangeListener mOnRunChangeListener = new OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
if (mClient != null) {
|
||||
if (isChecked) {
|
||||
mClient.start();
|
||||
if (Preferences.getBoolean(Settings.this,
|
||||
Preferences.KEY_WAKELOCK, false))
|
||||
mClient.setWakelockEnabled(true);
|
||||
} else {
|
||||
mClient.stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private final OnCheckedChangeListener mOnRunOnBootChangeListener = new OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
Preferences.putBoolean(Settings.this, Preferences.KEY_RUN_ON_BOOT, isChecked);
|
||||
if (isChecked && mClient != null && !mRunButton.isChecked())
|
||||
mRunButton.setChecked(true);
|
||||
}
|
||||
};
|
||||
|
||||
private final OnCheckedChangeListener mOnWakelockChangeListener = new OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
Preferences.putBoolean(Settings.this, Preferences.KEY_WAKELOCK, isChecked);
|
||||
if (mClient != null && mClient.isRunning())
|
||||
mClient.setWakelockEnabled(isChecked);
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
setContentView(R.layout.settings);
|
||||
mRunButton = (ToggleButton) findViewById(R.id.run);
|
||||
mRunButton.setOnCheckedChangeListener(mOnRunChangeListener);
|
||||
|
||||
mTextStatus = (TextView) findViewById(R.id.status);
|
||||
|
||||
mLogListAdapter = new ArrayAdapter<String>(this, R.layout.log_item, mLogListArray);
|
||||
|
||||
mLogListView = (ListView) findViewById(R.id.log_list);
|
||||
mLogListView.setAdapter(mLogListAdapter);
|
||||
mLogListView.setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);
|
||||
|
||||
CheckBox checkbox = (CheckBox) findViewById(R.id.run_on_boot);
|
||||
checkbox.setOnCheckedChangeListener(mOnRunOnBootChangeListener);
|
||||
if (Preferences.getBoolean(this, Preferences.KEY_RUN_ON_BOOT, false))
|
||||
checkbox.setChecked(true);
|
||||
|
||||
checkbox = (CheckBox) findViewById(R.id.wakelock);
|
||||
checkbox.setOnCheckedChangeListener(mOnWakelockChangeListener);
|
||||
if (Preferences.getBoolean(this, Preferences.KEY_WAKELOCK, false))
|
||||
checkbox.setChecked(true);
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
}
|
||||
|
||||
private void connectClient() {
|
||||
mClient = new Main.Client(this, new Main.Client.Callback() {
|
||||
|
||||
private void removeMessages() {
|
||||
/* don't remove log messages */
|
||||
mHandler.removeMessages(MSG_STOPPED);
|
||||
mHandler.removeMessages(MSG_STARTED);
|
||||
mHandler.removeMessages(MSG_ERROR);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStopped() {
|
||||
removeMessages();
|
||||
mHandler.sendEmptyMessage(MSG_STOPPED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStarted() {
|
||||
removeMessages();
|
||||
mHandler.sendEmptyMessage(MSG_STARTED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(String error) {
|
||||
removeMessages();
|
||||
mHandler.sendMessage(Message.obtain(mHandler, MSG_ERROR, error));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLog(int priority, String msg) {
|
||||
mHandler.sendMessage(Message.obtain(mHandler, MSG_LOG, priority, 0, msg));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
mFirstRun = false;
|
||||
connectClient();
|
||||
super.onStart();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
mClient.release();
|
||||
mClient = null;
|
||||
super.onStop();
|
||||
}
|
||||
}
|
||||
137
autogen.sh
137
autogen.sh
@@ -1,137 +0,0 @@
|
||||
#!/bin/sh
|
||||
# Run this to set up the build system: configure, makefiles, etc.
|
||||
# (at one point this was based on the version in enlightenment's cvs)
|
||||
|
||||
package="mpd"
|
||||
|
||||
olddir="`pwd`"
|
||||
srcdir="`dirname $0`"
|
||||
test -z "$srcdir" && srcdir=.
|
||||
cd "$srcdir"
|
||||
DIE=
|
||||
AM_VERSIONGREP="sed -e s/.*[^0-9\.]\([0-9]\.[0-9][0-9]*\).*/\1/"
|
||||
AC_VERSIONGREP="sed -e s/.*[^0-9\.]\([0-9]\.[0-9][0-9]\).*/\1/"
|
||||
VERSIONMKINT="sed -e s/[^0-9]//"
|
||||
if test -n "$AM_FORCE_VERSION"
|
||||
then
|
||||
AM_VERSIONS="$AM_FORCE_VERSION"
|
||||
else
|
||||
AM_VERSIONS='1.11 1.10'
|
||||
fi
|
||||
if test -n "$AC_FORCE_VERSION"
|
||||
then
|
||||
AC_VERSIONS="$AC_FORCE_VERSION"
|
||||
else
|
||||
AC_VERSIONS='2.60 2.61'
|
||||
fi
|
||||
|
||||
versioned_bins ()
|
||||
{
|
||||
bin="$1"
|
||||
needed_int=`echo $VERNEEDED | $VERSIONMKINT`
|
||||
for i in $VERSIONS
|
||||
do
|
||||
i_int=`echo $i | $VERSIONMKINT`
|
||||
if test $i_int -ge $needed_int
|
||||
then
|
||||
echo $bin-$i $bin$i $bin-$i_int $bin$i_int
|
||||
fi
|
||||
done
|
||||
echo $bin
|
||||
}
|
||||
|
||||
for c in autoconf autoheader automake aclocal
|
||||
do
|
||||
uc=`echo $c | tr '[:lower:]' '[:upper:]'`
|
||||
eval "val=`echo '$'$uc`"
|
||||
if test -n "$val"
|
||||
then
|
||||
echo "$uc=$val in environment, will not attempt to auto-detect"
|
||||
continue
|
||||
fi
|
||||
|
||||
case "$c" in
|
||||
autoconf|autoheader)
|
||||
VERNEEDED=`fgrep AC_PREREQ configure.ac | $AC_VERSIONGREP`
|
||||
VERSIONS="$AC_VERSIONS"
|
||||
pkg=autoconf
|
||||
;;
|
||||
automake|aclocal)
|
||||
VERNEEDED=`fgrep AUTOMAKE_OPTIONS Makefile.am | $AM_VERSIONGREP`
|
||||
VERSIONS="$AM_VERSIONS"
|
||||
pkg=automake
|
||||
;;
|
||||
esac
|
||||
printf "checking for $c ... "
|
||||
for x in `versioned_bins $c`; do
|
||||
($x --version < /dev/null > /dev/null 2>&1) > /dev/null 2>&1
|
||||
if test $? -eq 0
|
||||
then
|
||||
echo $x
|
||||
eval $uc=$x
|
||||
break
|
||||
fi
|
||||
done
|
||||
eval "val=`echo '$'$uc`"
|
||||
if test -z "$val"
|
||||
then
|
||||
if test $c = $pkg
|
||||
then
|
||||
DIE="$DIE $c=$VERNEEDED"
|
||||
else
|
||||
DIE="$DIE $c($pkg)=$VERNEEDED"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
if test -n "$DIE"
|
||||
then
|
||||
echo "You must have the following installed to compile $package:"
|
||||
for i in $DIE
|
||||
do
|
||||
printf ' '
|
||||
echo $i | sed -e 's/(/ (from /' -e 's/=\(.*\)/ (>= \1)/'
|
||||
done
|
||||
echo "Download the appropriate package(s) for your system,"
|
||||
echo "or get the source from one of the GNU ftp sites"
|
||||
echo "listed in http://www.gnu.org/order/ftp.html"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Generating configuration files for $package, please wait...."
|
||||
|
||||
ACLOCAL_FLAGS="$ACLOCAL_FLAGS -I m4"
|
||||
|
||||
# /usr/share/aclocal is most likely included by default, already...
|
||||
ac_local_paths='
|
||||
/usr/local/share/aclocal
|
||||
/sw/share/aclocal
|
||||
/usr/pkg/share/aclocal
|
||||
/opt/share/aclocal
|
||||
/usr/gnu/share/aclocal
|
||||
'
|
||||
|
||||
for i in $ac_local_paths; do
|
||||
if test -d "$i"; then
|
||||
ACLOCAL_FLAGS="$ACLOCAL_FLAGS -I $i"
|
||||
# we probably only want one of these...
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
echo " $ACLOCAL $ACLOCAL_FLAGS"
|
||||
$ACLOCAL $ACLOCAL_FLAGS || exit 1
|
||||
|
||||
echo " $AUTOHEADER"
|
||||
$AUTOHEADER || exit 1
|
||||
|
||||
echo " $AUTOMAKE --add-missing $AUTOMAKE_FLAGS"
|
||||
$AUTOMAKE --add-missing $AUTOMAKE_FLAGS || exit 1
|
||||
|
||||
echo " $AUTOCONF"
|
||||
$AUTOCONF || exit 1
|
||||
|
||||
cd "$olddir"
|
||||
if test x$NOCONFIGURE = x; then
|
||||
"$srcdir"/configure "$@" || exit 1
|
||||
fi
|
||||
9
build/pkg-config.sh
Executable file
9
build/pkg-config.sh
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/bin/sh -e
|
||||
|
||||
BIN=`dirname $0`
|
||||
ROOT=`dirname "$BIN"`
|
||||
|
||||
export PKG_CONFIG_DIR=
|
||||
export PKG_CONFIG_LIBDIR="${ROOT}/lib/pkgconfig:${ROOT}/share/pkgconfig"
|
||||
|
||||
exec /usr/bin/pkg-config "$@"
|
||||
1583
configure.ac
1583
configure.ac
File diff suppressed because it is too large
Load Diff
214
doc/conf.py
Normal file
214
doc/conf.py
Normal file
@@ -0,0 +1,214 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# -- General configuration ------------------------------------------------
|
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here.
|
||||
#
|
||||
# needs_sphinx = '1.0'
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = ['sphinx.ext.intersphinx']
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
# The suffix(es) of source filenames.
|
||||
# You can specify multiple suffix as a list of string:
|
||||
#
|
||||
# source_suffix = ['.rst', '.md']
|
||||
source_suffix = '.rst'
|
||||
|
||||
# The encoding of source files.
|
||||
#
|
||||
# source_encoding = 'utf-8-sig'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = 'index'
|
||||
|
||||
# General information about the project.
|
||||
project = 'Music Player Daemon'
|
||||
copyright = '2003-2018 The Music Player Daemon Project'
|
||||
author = 'Max Kellermann'
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = '0.21.3'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = version
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
#
|
||||
# This is also used if you do content translation via gettext catalogs.
|
||||
# Usually you set "language" from the command line for these cases.
|
||||
language = None
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
#
|
||||
# today = ''
|
||||
#
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
#
|
||||
# today_fmt = '%B %d, %Y'
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
# This patterns also effect to html_static_path and html_extra_path
|
||||
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
|
||||
|
||||
# The reST default role (used for this markup: `text`) to use for all
|
||||
# documents.
|
||||
#
|
||||
# default_role = None
|
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||
#
|
||||
# add_function_parentheses = True
|
||||
|
||||
# If true, the current module name will be prepended to all description
|
||||
# unit titles (such as .. function::).
|
||||
#
|
||||
# add_module_names = True
|
||||
|
||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||
# output. They are ignored by default.
|
||||
#
|
||||
# show_authors = False
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = 'sphinx'
|
||||
|
||||
# A list of ignored prefixes for module index sorting.
|
||||
# modindex_common_prefix = []
|
||||
|
||||
# If true, keep warnings as "system message" paragraphs in the built documents.
|
||||
# keep_warnings = False
|
||||
|
||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||
todo_include_todos = False
|
||||
|
||||
|
||||
# -- Options for HTML output ----------------------------------------------
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
#
|
||||
html_theme = 'classic'
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
#
|
||||
# html_theme_options = {}
|
||||
|
||||
# Add any paths that contain custom themes here, relative to this directory.
|
||||
# html_theme_path = []
|
||||
|
||||
# The name for this set of Sphinx documents.
|
||||
# "<project> v<release> documentation" by default.
|
||||
#
|
||||
# html_title = ''
|
||||
|
||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||
#
|
||||
# html_short_title = None
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top
|
||||
# of the sidebar.
|
||||
#
|
||||
# html_logo = None
|
||||
|
||||
# The name of an image file (relative to this directory) to use as a favicon of
|
||||
# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||
# pixels large.
|
||||
#
|
||||
# html_favicon = None
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ['_static']
|
||||
|
||||
# Add any extra paths that contain custom files (such as robots.txt or
|
||||
# .htaccess) here, relative to this directory. These files are copied
|
||||
# directly to the root of the documentation.
|
||||
#
|
||||
# html_extra_path = []
|
||||
|
||||
# If not None, a 'Last updated on:' timestamp is inserted at every page
|
||||
# bottom, using the given strftime format.
|
||||
# The empty string is equivalent to '%b %d, %Y'.
|
||||
#
|
||||
# html_last_updated_fmt = None
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
#
|
||||
# html_use_smartypants = True
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
#
|
||||
# html_sidebars = {}
|
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to
|
||||
# template names.
|
||||
#
|
||||
# html_additional_pages = {}
|
||||
|
||||
# If false, no module index is generated.
|
||||
#
|
||||
# html_domain_indices = True
|
||||
|
||||
# If false, no index is generated.
|
||||
#
|
||||
# html_use_index = True
|
||||
|
||||
# If true, the index is split into individual pages for each letter.
|
||||
#
|
||||
# html_split_index = False
|
||||
|
||||
# If true, links to the reST sources are added to the pages.
|
||||
#
|
||||
# html_show_sourcelink = True
|
||||
|
||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||
#
|
||||
# html_show_sphinx = True
|
||||
|
||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
||||
#
|
||||
# html_show_copyright = True
|
||||
|
||||
# If true, an OpenSearch description file will be output, and all pages will
|
||||
# contain a <link> tag referring to it. The value of this option must be the
|
||||
# base URL from which the finished HTML is served.
|
||||
#
|
||||
# html_use_opensearch = ''
|
||||
|
||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
||||
# html_file_suffix = None
|
||||
|
||||
# Language to be used for generating the HTML full-text search index.
|
||||
# Sphinx supports the following languages:
|
||||
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja'
|
||||
# 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr', 'zh'
|
||||
#
|
||||
# html_search_language = 'en'
|
||||
|
||||
# A dictionary with options for the search language support, empty by default.
|
||||
# 'ja' uses this config value.
|
||||
# 'zh' user can custom change `jieba` dictionary path.
|
||||
#
|
||||
# html_search_options = {'type': 'default'}
|
||||
|
||||
# The name of a javascript file (relative to the configuration directory) that
|
||||
# implements a search results scorer. If empty, the default will be used.
|
||||
#
|
||||
# html_search_scorer = 'scorer.js'
|
||||
128
doc/developer.rst
Normal file
128
doc/developer.rst
Normal file
@@ -0,0 +1,128 @@
|
||||
Developer's Manual
|
||||
##################
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
This is a guide for those who wish to hack on the MPD source code. MPD is an open project, and we are always happy about contributions. So far, more than 150 people have contributed patches. This document is work in progress. Most of it may be incomplete yet. Please help!
|
||||
|
||||
Code Style
|
||||
==========
|
||||
|
||||
* indent with tabs (width 8)
|
||||
* don't write CPP when you can write C++: use inline functions and constexpr instead of macros
|
||||
* comment your code, document your APIs
|
||||
* the code should be C++14 compliant, and must compile with :program:`GCC` 6.0 and :program:`clang` 3.4
|
||||
* report error conditions with C++ exceptions, preferable derived from :envvar:`std::runtime_error`
|
||||
* all code must be exception-safe
|
||||
* classes and functions names use CamelCase; variables are lower-case with words separated by underscore
|
||||
|
||||
Some example code:
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
Foo(const char *abc, int xyz)
|
||||
{
|
||||
if (abc == nullptr) {
|
||||
LogWarning("Foo happened!");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return xyz;
|
||||
}
|
||||
|
||||
Hacking The Source
|
||||
==================
|
||||
|
||||
MPD sources are managed in a git repository on
|
||||
`Github <https://github.com/MusicPlayerDaemon/>`_.
|
||||
|
||||
Always write your code against the latest git:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
git clone git://github.com/MusicPlayerDaemon/MPD
|
||||
|
||||
If you already have a clone, update it:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
git pull --rebase git://github.com/MusicPlayerDaemon/MPD master
|
||||
|
||||
You can do without :code:`--rebase`, but we recommend that you rebase
|
||||
your repository on the "master" repository all the time.
|
||||
|
||||
Configure with the option :code:`--werror`. Enable as many plugins as
|
||||
possible, to be sure that you don't break any disabled code.
|
||||
|
||||
Don't mix several changes in one single patch. Create a separate patch for every change. Tools like :program:`stgit` help you with that. This way, we can review your patches more easily, and we can pick the patches we like most first.
|
||||
|
||||
Basic stgit usage
|
||||
-----------------
|
||||
|
||||
stgit allows you to create a set of patches and refine all of them: you can go back to any patch at any time, and re-edit it (both the code and the commit message). You can reorder patches and insert new patches at any position. It encourages creating separate patches for tiny changes.
|
||||
|
||||
stgit needs to be initialized on a git repository:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
stg init
|
||||
|
||||
Before you edit the code, create a patch:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
stg new my-patch-name
|
||||
|
||||
stgit now asks you for the commit message.
|
||||
|
||||
Now edit the code. Once you're finished, you have to "refresh" the patch, i.e. your edits are incorporated into the patch you have created:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
stg refresh
|
||||
|
||||
You may now continue editing the same patch, and refresh it as often as you like. Create more patches, edit and refresh them.
|
||||
|
||||
To view the list of patches, type stg series. To go back to a specific patch, type stg goto my-patch-name; now you can re-edit it (don't forget stg refresh when you're finished with that patch).
|
||||
|
||||
When the whole patch series is finished, convert stgit patches to git commits:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
stg commit
|
||||
|
||||
Submitting Patches
|
||||
==================
|
||||
|
||||
Send your patches to the mailing list:
|
||||
Email: `mpd-devel <mpd-devel@musicpd.org>`_
|
||||
|
||||
:program:`git pull` requests are preferred.
|
||||
|
||||
Development Tools
|
||||
=================
|
||||
|
||||
Clang Static Analyzer
|
||||
---------------------
|
||||
|
||||
The `static analyzer <http://clang-analyzer.llvm.org/>`_ is a tool that helps find bugs. To run it on the MPD code base, install LLVM and clang. configure MPD to use clang:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
./configure --enable-debug CXX=clang++ CC=clang ...
|
||||
|
||||
It is recommended to use :code:`--enable-debug`, because the analyzer
|
||||
takes advantage of :dfn:`assert()` calls, which are only enabled in
|
||||
the debug build.
|
||||
|
||||
Now run the analyzer:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
scan-build --use-c++=clang++ --use-cc=clang make
|
||||
|
||||
The options :code:`--use-c++` and :code:`--use-cc` are necessary
|
||||
because it invokes :command:`cc` for actually compiling the sources by
|
||||
default. That breaks, because MPD requires a C99 compiler.
|
||||
@@ -1,105 +0,0 @@
|
||||
<?xml version='1.0' encoding="utf-8"?>
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
||||
"docbook/dtd/xml/4.2/docbookx.dtd">
|
||||
<book>
|
||||
<title>The Music Player Daemon - Developer's Manual</title>
|
||||
|
||||
<chapter>
|
||||
<title>Introduction</title>
|
||||
|
||||
<para>
|
||||
This is a guide for those who wish to hack on the MPD source
|
||||
code. MPD is an open project, and we are always happy about
|
||||
contributions. So far, more than 50 people have contributed
|
||||
patches.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
This document is work in progress. Most of it may be incomplete
|
||||
yet. Please help!
|
||||
</para>
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>Code Style</title>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
indent with tabs (width 8)
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
don't write CPP when you can write C: use inline functions
|
||||
and enums instead of macros
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
the code should be C99 compliant, and must compile with
|
||||
<application>GCC</application>;
|
||||
<application>clang</application> support is highly desirable
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
C++ is ok (for integrating C++ only libraries), but it
|
||||
should be avoided
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
Some example code:
|
||||
</para>
|
||||
|
||||
<programlisting lang="C">static inline int
|
||||
foo(const char *abc, int xyz)
|
||||
{
|
||||
if (abc == NULL) {
|
||||
g_warning("Foo happened!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return xyz;
|
||||
}
|
||||
</programlisting>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>Hacking The Source</title>
|
||||
|
||||
<para>
|
||||
Always write your code against the latest git:
|
||||
</para>
|
||||
|
||||
<programlisting>git clone git://git.musicpd.org/master/mpd.git</programlisting>
|
||||
|
||||
<para>
|
||||
Configure with the options <option>--enable-debug
|
||||
--enable-werror</option>. Enable as many plugins as possible,
|
||||
to be sure that you don't break any disabled code.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Don't mix several changes in one single patch. Create a
|
||||
separate patch for every change. Tools like
|
||||
<application>stgit</application> help you with that.
|
||||
</para>
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>Submitting Patches</title>
|
||||
|
||||
<para>
|
||||
Send your patches to the mailing list:
|
||||
musicpd-dev-team@lists.sourceforge.net
|
||||
</para>
|
||||
</chapter>
|
||||
</book>
|
||||
1417
doc/doxygen.conf
1417
doc/doxygen.conf
File diff suppressed because it is too large
Load Diff
2430
doc/doxygen.conf.in
Normal file
2430
doc/doxygen.conf.in
Normal file
File diff suppressed because it is too large
Load Diff
165
doc/include/tags.xml
Normal file
165
doc/include/tags.xml
Normal file
@@ -0,0 +1,165 @@
|
||||
<?xml version='1.0' encoding="utf-8"?>
|
||||
<!DOCTYPE itemizedlist PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>artist</varname>: the artist name. Its meaning is not
|
||||
well-defined; see <varname>composer</varname> and
|
||||
<varname>performer</varname> for more specific tags.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>artistsort</varname>: same as
|
||||
<varname>artist</varname>, but for sorting. This usually omits
|
||||
prefixes such as "The".
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>album</varname>: the album name.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>albumsort</varname>: same as <varname>album</varname>,
|
||||
but for sorting.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>albumartist</varname>: on multi-artist albums, this is
|
||||
the artist name which shall be used for the whole album. The
|
||||
exact meaning of this tag is not well-defined.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>albumartistsort</varname>: same as
|
||||
<varname>albumartist</varname>, but for sorting.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>title</varname>: the song title.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>track</varname>: the decimal track number within the
|
||||
album.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>name</varname>: a name for this song. This is not the
|
||||
song title. The exact meaning of this tag is not well-defined.
|
||||
It is often used by badly configured internet radio stations
|
||||
with broken tags to squeeze both the artist name and the song
|
||||
title in one tag.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>genre</varname>: the music genre.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>date</varname>: the song's release date. This is
|
||||
usually a 4-digit year.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>composer</varname>: the artist who composed the song.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>performer</varname>: the artist who performed the song.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>comment</varname>: a human-readable comment about this
|
||||
song. The exact meaning of this tag is not well-defined.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>disc</varname>: the decimal disc number in a multi-disc
|
||||
album.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>musicbrainz_artistid</varname>: the artist id in the
|
||||
<ulink
|
||||
url="https://picard.musicbrainz.org/docs/mappings/">MusicBrainz</ulink>
|
||||
database.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>musicbrainz_albumid</varname>: the album id in the
|
||||
<ulink
|
||||
url="https://picard.musicbrainz.org/docs/mappings/">MusicBrainz</ulink>
|
||||
database.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>musicbrainz_albumartistid</varname>: the album artist
|
||||
id in the <ulink
|
||||
url="https://picard.musicbrainz.org/docs/mappings/">MusicBrainz</ulink>
|
||||
database.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>musicbrainz_trackid</varname>: the track id in the
|
||||
<ulink
|
||||
url="https://picard.musicbrainz.org/docs/mappings/">MusicBrainz</ulink>
|
||||
database.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>musicbrainz_releasetrackid</varname>: the release track
|
||||
id in the <ulink
|
||||
url="https://picard.musicbrainz.org/docs/mappings/">MusicBrainz</ulink>
|
||||
database.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<varname>musicbrainz_workid</varname>: the work id in the
|
||||
<ulink
|
||||
url="https://picard.musicbrainz.org/docs/mappings/">MusicBrainz</ulink>
|
||||
database.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
18
doc/index.rst
Normal file
18
doc/index.rst
Normal file
@@ -0,0 +1,18 @@
|
||||
Music Player Daemon
|
||||
===================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:caption: Contents:
|
||||
|
||||
user
|
||||
plugins
|
||||
developer
|
||||
protocol
|
||||
|
||||
|
||||
Indices and tables
|
||||
==================
|
||||
|
||||
* :ref:`genindex`
|
||||
* :ref:`search`
|
||||
33
doc/meson.build
Normal file
33
doc/meson.build
Normal file
@@ -0,0 +1,33 @@
|
||||
install_man(['mpd.1', 'mpd.conf.5'])
|
||||
|
||||
sphinx = find_program('sphinx-build')
|
||||
sphinx_output = custom_target(
|
||||
'HTML documentation',
|
||||
output: 'html',
|
||||
input: [
|
||||
'index.rst', 'user.rst', 'developer.rst',
|
||||
'plugins.rst',
|
||||
'protocol.rst',
|
||||
'conf.py',
|
||||
],
|
||||
command: [sphinx, '-q', '-b', 'html', '-d', '@OUTDIR@/doctrees', meson.current_source_dir(), '@OUTPUT@'],
|
||||
build_by_default: true,
|
||||
install: true,
|
||||
install_dir: join_paths(get_option('datadir'), 'doc', meson.project_name()),
|
||||
)
|
||||
|
||||
custom_target(
|
||||
'upload',
|
||||
input: sphinx_output,
|
||||
output: 'upload',
|
||||
build_always_stale: true,
|
||||
command: [
|
||||
'rsync', '-vpruz', '--delete', meson.current_build_dir() + '/',
|
||||
'www.musicpd.org:/var/www/mpd/doc/',
|
||||
'--chmod=Dug+rwx,Do+rx,Fug+rw,Fo+r',
|
||||
'--include=html', '--include=html/**',
|
||||
'--exclude=*',
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
20
doc/mpd.1
20
doc/mpd.1
@@ -12,29 +12,29 @@ stores info about all available music, and this info can be easily searched and
|
||||
retrieved. Player control, info retrieval, and playlist management can all be
|
||||
managed remotely.
|
||||
|
||||
MPD searches for a config file in \fB~/.mpdconf\fP then \fB/etc/mpd.conf\fP or
|
||||
uses CONF_FILE.
|
||||
MPD searches for a config file in \fB$XDG_CONFIG_HOME/mpd/mpd.conf\fP then
|
||||
\fB~/.mpdconf\fP then \fB/etc/mpd.conf\fP or uses CONF_FILE.
|
||||
|
||||
Read more about MPD at <\fBhttp://www.musicpd.org/\fP>.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.BI --help
|
||||
.BI \-\-help
|
||||
Output a brief help message.
|
||||
.TP
|
||||
.BI --kill
|
||||
.BI \-\-kill
|
||||
Kill the currently running mpd session. The pid_file parameter must be
|
||||
specified in the config file for this to work.
|
||||
.TP
|
||||
.BI --no-daemon
|
||||
.BI \-\-no\-daemon
|
||||
Don't detach from console.
|
||||
.TP
|
||||
.BI --stderr
|
||||
.BI \-\-stderr
|
||||
Print messages stderr.
|
||||
.TP
|
||||
.BI --verbose
|
||||
.BI \-\-verbose
|
||||
Verbose logging.
|
||||
.TP
|
||||
.BI --version
|
||||
.BI \-\-version
|
||||
Print version information.
|
||||
.SH FILES
|
||||
.TP
|
||||
@@ -48,8 +48,8 @@ mpd.conf(5), mpc(1)
|
||||
.SH BUGS
|
||||
If you find a bug, please report it at
|
||||
.br
|
||||
<\fBhttp://www.musicpd.org/mantis/bug_report_page.php\fP>.
|
||||
<\fBhttps://github.com/MusicPlayerDaemon/MPD/issues/\fP>.
|
||||
.SH AUTHORS
|
||||
Warren Dukes <warren.dukes@gmail.com>
|
||||
Max Kellermann <max.kellermann@gmail.com>
|
||||
|
||||
Special thanks to all the people that provided feedback and patches.
|
||||
|
||||
315
doc/mpd.conf.5
315
doc/mpd.conf.5
@@ -3,8 +3,9 @@
|
||||
mpd.conf \- Music Player Daemon configuration file
|
||||
.SH DESCRIPTION
|
||||
\fBmpd.conf\fP is the configuration file for mpd(1). If not specified on the
|
||||
command line, MPD first searches for it at \fB~/.mpdconf\fP then at
|
||||
\fB~/.mpd/mpd.conf\fP and then in \fB/etc/mpd.conf\fP.
|
||||
command line, MPD first searches for it at \fB$XDG_CONFIG_HOME/mpd/mpd.conf\fP
|
||||
then at \fB~/.mpdconf\fP then at \fB~/.mpd/mpd.conf\fP and then in
|
||||
\fB/etc/mpd.conf\fP.
|
||||
|
||||
Lines beginning with a "#" character are comments. All other non-empty lines
|
||||
specify parameters and their values. These lines contain the parameter name
|
||||
@@ -27,31 +28,24 @@ paths.
|
||||
|
||||
See \fBdocs/mpdconf.example\fP in the source tarball for an example
|
||||
configuration file.
|
||||
|
||||
This manual is not complete, it lists only the most important options.
|
||||
Please read the MPD user manual for a complete configuration guide:
|
||||
<\fBhttp://www.musicpd.org/doc/user/\fP>
|
||||
.SH REQUIRED PARAMETERS
|
||||
.TP
|
||||
.B follow_outside_symlinks <yes or no>
|
||||
Control if MPD will follow symbolic links pointing outside the music dir.
|
||||
You must recreate the database after changing this option.
|
||||
The default is "yes".
|
||||
.TP
|
||||
.B follow_inside_symlinks <yes or no>
|
||||
Control if MPD will follow symbolic links pointing inside the music dir,
|
||||
potentially adding duplicates to the database.
|
||||
You must recreate the database after changing this option.
|
||||
The default is "yes".
|
||||
.TP
|
||||
.B db_file <file>
|
||||
This specifies where the db file will be stored.
|
||||
.TP
|
||||
.B sticker_file <file>
|
||||
The location of the sticker database. This is a database which
|
||||
manages dynamic information attached to songs.
|
||||
.TP
|
||||
.B log_file <file>
|
||||
This specifies where the log file should be located.
|
||||
The special value "syslog" makes MPD use the local syslog daemon.
|
||||
.SH OPTIONAL PARAMETERS
|
||||
.TP
|
||||
.B sticker_file <file>
|
||||
The location of the sticker database. This is a database which
|
||||
manages dynamic information attached to songs.
|
||||
.TP
|
||||
.B pid_file <file>
|
||||
This specifies the file to save mpd's process ID in.
|
||||
.TP
|
||||
@@ -69,20 +63,15 @@ mpd will be saved to this file when mpd is terminated by a TERM signal or by
|
||||
the "kill" command. When mpd is restarted, it will read the state file and
|
||||
restore the state of mpd (including the playlist).
|
||||
.TP
|
||||
.B restore_paused <yes or no>
|
||||
Put MPD into pause mode instead of starting playback after startup.
|
||||
.TP
|
||||
.B user <username>
|
||||
This specifies the user that MPD will run as, if set. MPD should
|
||||
never run as root, and you may use this option to make MPD change its
|
||||
user id after initialization. Do not use this option if you start MPD
|
||||
as an unprivileged user.
|
||||
.TP
|
||||
.B bind_to_address <ip address or hostname or any>
|
||||
This specifies which address mpd binds to and listens on. Multiple
|
||||
bind_to_address parameters may be specified. The default is "any", which binds
|
||||
to all available addresses.
|
||||
|
||||
To bind to a Unix domain socket, specify an absolute path. For a
|
||||
system-wide MPD, we suggest the path "\fB/var/run/mpd/socket\fP".
|
||||
.TP
|
||||
.B port <port>
|
||||
This specifies the port that mpd listens on. The default is 6600.
|
||||
.TP
|
||||
@@ -92,6 +81,17 @@ reports from what address a connection is opened, and when it is closed, and
|
||||
"verbose" records excessive amounts of information for debugging purposes. The
|
||||
default is "default".
|
||||
.TP
|
||||
.B follow_outside_symlinks <yes or no>
|
||||
Control if MPD will follow symbolic links pointing outside the music dir.
|
||||
You must recreate the database after changing this option.
|
||||
The default is "yes".
|
||||
.TP
|
||||
.B follow_inside_symlinks <yes or no>
|
||||
Control if MPD will follow symbolic links pointing inside the music dir,
|
||||
potentially adding duplicates to the database.
|
||||
You must recreate the database after changing this option.
|
||||
The default is "yes".
|
||||
.TP
|
||||
.B zeroconf_enabled <yes or no>
|
||||
If yes, and MPD has been compiled with support for Avahi or Bonjour, service
|
||||
information will be published with Zeroconf. The default is yes.
|
||||
@@ -99,23 +99,8 @@ information will be published with Zeroconf. The default is yes.
|
||||
.B zeroconf_name <name>
|
||||
If Zeroconf is enabled, this is the service name to publish. This name should
|
||||
be unique to your local network, but name collisions will be properly dealt
|
||||
with. The default is "Music Player".
|
||||
.TP
|
||||
.B password <password@permissions>
|
||||
This specifies a password for access to mpd. The format is
|
||||
"password@permissions" where permissions is a comma delimited list composed
|
||||
of "read", "add", "control", and/or "admin". "read" allows for reading of the
|
||||
database, displaying the current playlist, and current status of mpd. "add"
|
||||
allows for adding songs and loading playlists. "control" allows for all other
|
||||
player and playlist manipulations. "admin" allows the db to be updated and for
|
||||
the client to kill mpd. An example value is "somePassword@read,add". Multiple
|
||||
password parameters may be specified.
|
||||
.TP
|
||||
.B default_permissions <permissions>
|
||||
This specifies the permissions of a client that has not been authenticated
|
||||
using a password. The format of permissions is specified in the description of
|
||||
the "password" config parameter. If no passwords are specified, the default is
|
||||
"read,add,control,admin", otherwise it is "" (no permissions).
|
||||
with. The default is "Music Player @ %h", where %h will be replaced with the
|
||||
hostname of the machine running MPD.
|
||||
.TP
|
||||
.B audio_output
|
||||
See \fBDESCRIPTION\fP and the various \fBAUDIO OUTPUT PARAMETERS\fP sections
|
||||
@@ -123,53 +108,6 @@ for the format of this parameter. Multiple audio_output sections may be
|
||||
specified. If no audio_output section is specified, then MPD will scan for a
|
||||
usable audio output.
|
||||
.TP
|
||||
.B audio_output_format <sample_rate:bits:channels>
|
||||
This specifies the sample rate, bits per sample, and number of channels of
|
||||
audio that is sent to each audio output. Note that audio outputs may specify
|
||||
their own audio format which will be used for actual output to the audio
|
||||
device. An example is "44100:16:2" for 44100Hz, 16 bits, and 2 channels. The
|
||||
default is to use the audio format of the input file.
|
||||
Any of the three attributes may be an asterisk to specify that this
|
||||
attribute should not be enforced
|
||||
.TP
|
||||
.B samplerate_converter <integer or prefix>
|
||||
This specifies the libsamplerate converter to use. The supplied value should
|
||||
either be an integer or a prefix of the name of a converter. The default is
|
||||
"Fastest Sinc Interpolator".
|
||||
|
||||
At the time of this writing, the following converters are available:
|
||||
.RS
|
||||
.TP
|
||||
Best Sinc Interpolator (0)
|
||||
|
||||
Band limited sinc interpolation, best quality, 97dB SNR, 96% BW.
|
||||
.TP
|
||||
Medium Sinc Interpolator (1)
|
||||
|
||||
Band limited sinc interpolation, medium quality, 97dB SNR, 90% BW.
|
||||
.TP
|
||||
Fastest Sinc Interpolator (2)
|
||||
|
||||
Band limited sinc interpolation, fastest, 97dB SNR, 80% BW.
|
||||
.TP
|
||||
ZOH Interpolator (3)
|
||||
|
||||
Zero order hold interpolator, very fast, very poor quality with audible
|
||||
distortions.
|
||||
.TP
|
||||
Linear Interpolator (4)
|
||||
|
||||
Linear interpolator, very fast, poor quality.
|
||||
.TP
|
||||
internal
|
||||
|
||||
Poor quality, no floating point operations. This is the default (and
|
||||
only choice) if MPD was compiled without libsamplerate.
|
||||
.RE
|
||||
.IP
|
||||
For an up-to-date list of available converters, please see the libsamplerate
|
||||
documentation (available online at <\fBhttp://www.mega-nerd.com/SRC/\fP>).
|
||||
.TP
|
||||
.B replaygain <off or album or track or auto>
|
||||
If specified, mpd will adjust the volume of songs played using ReplayGain tags
|
||||
(see <\fBhttp://www.replaygain.org/\fP>). Setting this to "album" will adjust
|
||||
@@ -179,91 +117,35 @@ tags if random play is activated otherwise the album ReplayGain tags. Currently
|
||||
only FLAC, Ogg Vorbis, Musepack, and MP3 (through ID3v2 ReplayGain tags, not
|
||||
APEv2) are supported.
|
||||
.TP
|
||||
.B replaygain_preamp <-15 to 15>
|
||||
.B replaygain_preamp <\-15 to 15>
|
||||
This is the gain (in dB) applied to songs with ReplayGain tags.
|
||||
.TP
|
||||
.B volume_normalization <yes or no>
|
||||
If yes, mpd will normalize the volume of songs as they play. The default is no.
|
||||
.TP
|
||||
.B audio_buffer_size <size in KiB>
|
||||
This specifies the size of the audio buffer in kibibytes. The default is 2048,
|
||||
large enough for nearly 12 seconds of CD-quality audio.
|
||||
.TP
|
||||
.B buffer_before_play <0-100%>
|
||||
This specifies how much of the audio buffer should be filled before playing a
|
||||
song. Try increasing this if you hear skipping when manually changing songs.
|
||||
The default is 10%, a little over 1 second of CD-quality audio with the default
|
||||
buffer size.
|
||||
.TP
|
||||
.B http_proxy_host <hostname>
|
||||
This setting is deprecated. Use the "proxy" setting in the "curl"
|
||||
input block. See MPD user manual for details.
|
||||
.TP
|
||||
.B connection_timeout <seconds>
|
||||
If a client does not send any new data in this time period, the connection is
|
||||
closed. The default is 60.
|
||||
.TP
|
||||
.B max_connections <number>
|
||||
This specifies the maximum number of clients that can be connected to mpd. The
|
||||
default is 5.
|
||||
.TP
|
||||
.B max_playlist_length <number>
|
||||
This specifies the maximum number of songs that can be in the playlist. The
|
||||
default is 4096.
|
||||
.TP
|
||||
.B max_command_list_size <size in KiB>
|
||||
This specifies the maximum size a command list can be. The default is 2048.
|
||||
.TP
|
||||
.B max_output_buffer_size <size in KiB>
|
||||
This specifies the maximum size of the output buffer to a client. The default
|
||||
is 8192.
|
||||
.TP
|
||||
.B filesystem_charset <charset>
|
||||
This specifies the character set used for the filesystem. A list of supported
|
||||
character sets can be obtained by running "iconv -l". The default is
|
||||
character sets can be obtained by running "iconv \-l". The default is
|
||||
determined from the locale when the db was originally created.
|
||||
.TP
|
||||
.B id3v1_encoding <charset>
|
||||
This specifies the character set which ID3v1 tags are encoded in. A list of
|
||||
supported character sets can be obtained by running "iconv -l". The default is
|
||||
to let libid3tag convert them (from ISO-8859-1, as the standard specifies) and
|
||||
do no additional conversion.
|
||||
.TP
|
||||
.B gapless_mp3_playback <yes or no>
|
||||
This specifies whether to support gapless playback of MP3s which have the
|
||||
necessary headers. Useful if your MP3s have headers with incorrect
|
||||
information. If you have such MP3s, it is highly recommended that you fix them
|
||||
using vbrfix (available from <http://www.willwap.co.uk/Programs/vbrfix.php>)
|
||||
instead of disabling gapless MP3 playback. The default is to support gapless
|
||||
MP3 playback.
|
||||
.TP
|
||||
.B save_absolute_paths_in_playlists <yes or no>
|
||||
This specifies whether relative or absolute paths for song filenames are used
|
||||
when saving playlists. The default is "no".
|
||||
.TP
|
||||
.B metadata_to_use <tags>
|
||||
This specifies the tag types that will be scanned for and made available to
|
||||
clients. Note that you must recreate (not update) your database for changes to
|
||||
this parameter to take effect. Possible values are artist, album, title,
|
||||
track, name, genre, date, composer, performer, comment, and disc. Multiple
|
||||
tags may be specified as a comma separated list. An example value is
|
||||
"artist,album,title,track". The special value "none" may be used alone to
|
||||
disable all metadata. The default is to use all known tag types except for
|
||||
comments.
|
||||
.TP
|
||||
.B auto_update <yes or no>
|
||||
This specifies the wheter to support automatic update of music database when
|
||||
This specifies the whether to support automatic update of music database when
|
||||
files are changed in music_directory. The default is to disable autoupdate
|
||||
of database.
|
||||
.TP
|
||||
.B auto_update_depth <N>
|
||||
Limit the depth of the directories being watched, 0 means only watch
|
||||
the music directory itself. There is no limit by default.
|
||||
.TP
|
||||
.SH REQUIRED AUDIO OUTPUT PARAMETERS
|
||||
.TP
|
||||
.B type <type>
|
||||
This specifies the audio output type. See the list of supported outputs in mpd
|
||||
--version for possible values.
|
||||
\-\-version for possible values.
|
||||
.TP
|
||||
.B name <name>
|
||||
This specifies a unique name for the audio output.
|
||||
@@ -308,11 +190,6 @@ probably only useful if your alsa device has more than one
|
||||
identically\-named mixer control. The default is "0". Use "amixer
|
||||
scontrols" to see the list of controls with their indexes.
|
||||
.TP
|
||||
.B use_mmap <yes or no>
|
||||
Setting this allows you to use memory-mapped I/O. Certain hardware setups may
|
||||
benefit from this, but most do not. Most users do not need to set this. The
|
||||
default is to not use memory-mapped I/O.
|
||||
.TP
|
||||
.B auto_resample <yes or no>
|
||||
Setting this to "no" disables ALSA's software resampling, if the
|
||||
hardware does not support a specific sample rate. This lets MPD do
|
||||
@@ -338,134 +215,6 @@ errors on bandwidth-limited devices. Some users have reported good results
|
||||
with this set to 50000, but not all devices support values this high. Most
|
||||
users do not need to change this. The default is 256000000 / sample_rate(kHz),
|
||||
or 5804 microseconds for CD-quality audio.
|
||||
.SH OPTIONAL OSS OUTPUT PARAMETERS
|
||||
.TP
|
||||
.B device <dev>
|
||||
This specifies the device to use for audio output. The default is "/dev/dsp".
|
||||
.TP
|
||||
.B mixer_device <mixer dev>
|
||||
This specifies which mixer to use. The default is "/dev/mixer".
|
||||
.TP
|
||||
.B mixer_control <mixer ctrl>
|
||||
This specifies which mixer control to use (sometimes referred to as the
|
||||
"device"). The default is to use the main PCM mixer. An example is "Pcm".
|
||||
.SH OPTIONAL PULSE OUTPUT PARAMETERS
|
||||
.TP
|
||||
.B server <server list>
|
||||
A space separated list of servers to try to connect to. See
|
||||
<\fBhttp://www.pulseaudio.org/wiki/ServerStrings\fP> for more details. The
|
||||
default is to let PulseAudio choose a server.
|
||||
If you specify more than one server name, MPD tries to connect to one
|
||||
after another until it successfully establishes a connection.
|
||||
.TP
|
||||
.B sink <sink>
|
||||
The sink to output to. The default is to let PulseAudio choose a sink.
|
||||
.SH OPTIONAL JACK OUTPUT PARAMETERS
|
||||
.TP
|
||||
.B client_name <name>
|
||||
The client name to use when connecting to JACK. The output ports <name>:left
|
||||
and <name>:right will also be created for the left and right channels,
|
||||
respectively.
|
||||
.TP
|
||||
.B ports <left_port,right_port>
|
||||
This specifies the left and right ports to connect to for the left and right
|
||||
channels, respectively. The default is to let JACK choose a pair of ports.
|
||||
.TP
|
||||
.B ringbuffer_size <size in bytes>
|
||||
This specifies the size of the ringbuffer in bytes. The default is 32768.
|
||||
.SH OPTIONAL AO OUTPUT PARAMETERS
|
||||
.TP
|
||||
.B driver <driver>
|
||||
This specifies the libao driver to use for audio output. Possible values
|
||||
depend on what libao drivers are available. See
|
||||
<\fBhttp://www.xiph.org/ao/doc/drivers.html\fP> for information on some
|
||||
commonly used drivers. Typical values for Linux include "oss" and "alsa09".
|
||||
The default is "default", which causes libao to select an appropriate plugin.
|
||||
.TP
|
||||
.B options <opts>
|
||||
This specifies the options to use for the selected libao driver. For oss, the
|
||||
only option available is "dsp". For alsa09, the available options are: "dev",
|
||||
"buf_size", and "periods". See <\fBhttp://www.xiph.org/ao/doc/drivers.html\fP>
|
||||
for available options for some commonly used drivers. Options are assigned
|
||||
using "=", and ";" is used to separate options. An example for oss:
|
||||
"dsp=/dev/dsp". An example for alsa09: "dev=hw:0,0;buf_size=4096". The
|
||||
default is "".
|
||||
.TP
|
||||
.B write_size <size in bytes>
|
||||
This specifies how many bytes to write to the audio device at once. This
|
||||
parameter is to work around a bug in older versions of libao on sound cards
|
||||
with very small buffers. The default is 1024.
|
||||
.SH REQUIRED FIFO OUTPUT PARAMETERS
|
||||
.TP
|
||||
.B path <path>
|
||||
This specifies the path of the FIFO to output to. Must be an absolute path.
|
||||
If the path does not exist it will be created when mpd is started, and removed
|
||||
when mpd is stopped. The FIFO will be created with the same user and group as
|
||||
mpd is running as. Default permissions can be modified by using the builtin
|
||||
shell command "umask". If a FIFO already exists at the specified path it will
|
||||
be reused, and will \fBnot\fP be removed when mpd is stopped. You can use the
|
||||
"mkfifo" command to create this, and then you may modify the permissions to
|
||||
your liking.
|
||||
.SH REQUIRED SHOUT OUTPUT PARAMETERS
|
||||
.TP
|
||||
.B name <name>
|
||||
This specifies not only the unique audio output name, but also the stream
|
||||
title.
|
||||
.TP
|
||||
.B host <hostname>
|
||||
This specifies the hostname of the icecast server to connect to.
|
||||
.TP
|
||||
.B port <port>
|
||||
This specifies the port of the icecast server to connect to.
|
||||
.TP
|
||||
.B mount <mountpoint>
|
||||
This specifies the icecast mountpoint to use.
|
||||
.TP
|
||||
.B password <password>
|
||||
This specifies the password to use when logging in to the icecast server.
|
||||
.TP
|
||||
.B quality <quality>
|
||||
This specifies the encoding quality to use. The value must be between 0
|
||||
and 10. Fractional values, such as 2.5, are permitted. Either the quality or
|
||||
the bitrate parameter must be specified, but not both. For Ogg, a
|
||||
higher quality number produces higher quality output. For MP3, it's
|
||||
just the opposite, with lower numbers producing higher quality output.
|
||||
.TP
|
||||
.B bitrate <kbps>
|
||||
This specifies the bitrate to use for encoding. Either the quality or the
|
||||
bitrate parameter must be specified, but not both.
|
||||
.TP
|
||||
.B format <sample_rate:bits:channels>
|
||||
This specifies the sample rate, bits per sample, and number of channels to use
|
||||
for encoding.
|
||||
.SH OPTIONAL SHOUT OUTPUT PARAMETERS
|
||||
.TP
|
||||
.B encoding <encoding>
|
||||
This specifies which output encoding to use. Should be either "ogg"
|
||||
or "mp3", "mp3" is needed for shoutcast streaming. The default is "ogg".
|
||||
.TP
|
||||
.B protocol <protocol>
|
||||
This specifies the protocol that wil be used to connect to the
|
||||
icecast/shoutcast server. The options are "shoutcast", "icecast1" and
|
||||
"icecast2". The default is "icecast2".
|
||||
.TP
|
||||
.B user <username>
|
||||
This specifies the username to use when logging in to the icecast server. The
|
||||
default is "source".
|
||||
.TP
|
||||
.B public <yes or no>
|
||||
This specifies whether to request that the stream be listed in all public
|
||||
stream directories that the icecast server knows about. The default is no.
|
||||
.TP
|
||||
.B timeout <seconds>
|
||||
This specifies the number of seconds to wait before giving up on trying to
|
||||
connect to the icecast server. The default is 2 seconds.
|
||||
.TP
|
||||
.B description <description>
|
||||
This specifies a description of the stream.
|
||||
.TP
|
||||
.B genre <genre>
|
||||
This specifies the genre(s) of the stream.
|
||||
.SH FILES
|
||||
.TP
|
||||
.BI ~/.mpdconf
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# An example configuration file for MPD
|
||||
# See the mpd.conf man page for a more detailed description of each parameter.
|
||||
# An example configuration file for MPD.
|
||||
# Read the user manual for documentation: http://www.musicpd.org/doc/user/
|
||||
|
||||
|
||||
# Files and directories #######################################################
|
||||
@@ -32,7 +32,7 @@
|
||||
# settings.
|
||||
#
|
||||
# The special value "syslog" makes MPD use the local syslog daemon. This
|
||||
# setting defaults to logging to syslog, otherwise logging is disabled.
|
||||
# setting defaults to logging to syslog.
|
||||
#
|
||||
#log_file "~/.mpd/log"
|
||||
#
|
||||
@@ -75,7 +75,8 @@
|
||||
#
|
||||
# This setting sets the address for the daemon to listen on. Careful attention
|
||||
# should be paid if this is assigned to anything other then the default, any.
|
||||
# This setting can deny access to control of the daemon.
|
||||
# This setting can deny access to control of the daemon. Not effective if
|
||||
# systemd socket activiation is in use.
|
||||
#
|
||||
# For network
|
||||
#bind_to_address "any"
|
||||
@@ -95,25 +96,25 @@
|
||||
#
|
||||
#log_level "default"
|
||||
#
|
||||
# If you have a problem with your MP3s ending abruptly it is recommended that
|
||||
# you set this argument to "no" to attempt to fix the problem. If this solves
|
||||
# the problem, it is highly recommended to fix the MP3 files with vbrfix
|
||||
# (available from <http://www.willwap.co.uk/Programs/vbrfix.php>), at which
|
||||
# point gapless MP3 playback can be enabled.
|
||||
# Setting "restore_paused" to "yes" puts MPD into pause mode instead
|
||||
# of starting playback after startup.
|
||||
#
|
||||
#gapless_mp3_playback "yes"
|
||||
#restore_paused "no"
|
||||
#
|
||||
# This setting enables MPD to create playlists in a format usable by other
|
||||
# music players.
|
||||
#
|
||||
#save_absolute_paths_in_playlists "no"
|
||||
#
|
||||
# This setting defines a list of tag types that will be extracted during the
|
||||
# audio file discovery process. Optionally, 'comment' can be added to this
|
||||
# list.
|
||||
#
|
||||
# This setting defines a list of tag types that will be extracted during the
|
||||
# audio file discovery process. The complete list of possible values can be
|
||||
# found in the user manual.
|
||||
#metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc"
|
||||
#
|
||||
# This example just enables the "comment" tag without disabling all
|
||||
# the other supported tags:
|
||||
#metadata_to_use "+comment"
|
||||
#
|
||||
# This setting enables automatic update of MPD's database when files in
|
||||
# music_directory are changed.
|
||||
#
|
||||
@@ -150,9 +151,9 @@
|
||||
#zeroconf_enabled "yes"
|
||||
#
|
||||
# The argument to this setting will be the Zeroconf / Avahi unique name for
|
||||
# this MPD server on the network.
|
||||
# this MPD server on the network. %h will be replaced with the hostname.
|
||||
#
|
||||
#zeroconf_name "Music Player"
|
||||
#zeroconf_name "Music Player @ %h"
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
@@ -160,7 +161,7 @@
|
||||
# Permissions #################################################################
|
||||
#
|
||||
# If this setting is set, MPD will require password authorization. The password
|
||||
# can setting can be specified multiple times for different password profiles.
|
||||
# setting can be specified multiple times for different password profiles.
|
||||
#
|
||||
#password "password@read,add,control,admin"
|
||||
#
|
||||
@@ -171,6 +172,15 @@
|
||||
###############################################################################
|
||||
|
||||
|
||||
# Database #######################################################################
|
||||
#
|
||||
|
||||
#database {
|
||||
# plugin "proxy"
|
||||
# host "other.mpd.host"
|
||||
# port "6600"
|
||||
#}
|
||||
|
||||
# Input #######################################################################
|
||||
#
|
||||
|
||||
@@ -191,16 +201,12 @@ input {
|
||||
# blocks. Setting this block is optional, though the server will only attempt
|
||||
# autodetection for one sound card.
|
||||
#
|
||||
# See <http://mpd.wikia.com/wiki/Configuration#Audio_Outputs> for examples of
|
||||
# other audio outputs.
|
||||
#
|
||||
# An example of an ALSA output:
|
||||
#
|
||||
#audio_output {
|
||||
# type "alsa"
|
||||
# name "My ALSA Device"
|
||||
## device "hw:0,0" # optional
|
||||
## format "44100:16:2" # optional
|
||||
## mixer_type "hardware" # optional
|
||||
## mixer_device "default" # optional
|
||||
## mixer_control "PCM" # optional
|
||||
@@ -213,7 +219,6 @@ input {
|
||||
# type "oss"
|
||||
# name "My OSS Device"
|
||||
## device "/dev/dsp" # optional
|
||||
## format "44100:16:2" # optional
|
||||
## mixer_type "hardware" # optional
|
||||
## mixer_device "/dev/mixer" # optional
|
||||
## mixer_control "PCM" # optional
|
||||
@@ -223,7 +228,7 @@ input {
|
||||
#
|
||||
#audio_output {
|
||||
# type "shout"
|
||||
# encoding "ogg" # optional
|
||||
# encoder "vorbis" # optional
|
||||
# name "My Shout Stream"
|
||||
# host "localhost"
|
||||
# port "8000"
|
||||
@@ -235,6 +240,7 @@ input {
|
||||
## protocol "icecast2" # optional
|
||||
## user "source" # optional
|
||||
## description "My Stream Description" # optional
|
||||
## url "http://example.com" # optional
|
||||
## genre "jazz" # optional
|
||||
## public "no" # optional
|
||||
## timeout "2" # optional
|
||||
@@ -276,6 +282,42 @@ input {
|
||||
## sink "remote_server_sink" # optional
|
||||
#}
|
||||
#
|
||||
# An example of a winmm output (Windows multimedia API).
|
||||
#
|
||||
#audio_output {
|
||||
# type "winmm"
|
||||
# name "My WinMM output"
|
||||
## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
|
||||
# or
|
||||
## device "0" # optional
|
||||
## mixer_type "hardware" # optional
|
||||
#}
|
||||
#
|
||||
# An example of an openal output.
|
||||
#
|
||||
#audio_output {
|
||||
# type "openal"
|
||||
# name "My OpenAL output"
|
||||
## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
|
||||
#}
|
||||
#
|
||||
# An example of an sndio output.
|
||||
#
|
||||
#audio_output {
|
||||
# type "sndio"
|
||||
# name "sndio output"
|
||||
# mixer_type "hardware"
|
||||
#}
|
||||
#
|
||||
# An example of an OS X output:
|
||||
#
|
||||
#audio_output {
|
||||
# type "osx"
|
||||
# name "My OS X Device"
|
||||
## device "Built-in Output" # optional
|
||||
## channel_map "-1,-1,0,1" # optional
|
||||
#}
|
||||
#
|
||||
## Example "pipe" output:
|
||||
#
|
||||
#audio_output {
|
||||
@@ -297,27 +339,17 @@ input {
|
||||
# mixer_type "none" # optional
|
||||
#}
|
||||
#
|
||||
# This setting will change all decoded audio to be converted to the specified
|
||||
# format before being passed to the audio outputs. By default, this setting is
|
||||
# disabled.
|
||||
#
|
||||
#audio_output_format "44100:16:2"
|
||||
#
|
||||
# If MPD has been compiled with libsamplerate support, this setting specifies
|
||||
# the sample rate converter to use. Possible values can be found in the
|
||||
# mpd.conf man page or the libsamplerate documentation. By default, this is
|
||||
# setting is disabled.
|
||||
#
|
||||
#samplerate_converter "Fastest Sinc Interpolator"
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
|
||||
# Normalization automatic volume adjustments ##################################
|
||||
#
|
||||
# This setting specifies the type of ReplayGain to use. This setting can have
|
||||
# the argument "off", "album" or "track". See <http://www.replaygain.org>
|
||||
# for more details. This setting is off by default.
|
||||
# the argument "off", "album", "track" or "auto". "auto" is a special mode that
|
||||
# chooses between "track" and "album" depending on the current state of
|
||||
# random playback. If random playback is enabled then "track" mode is used.
|
||||
# See <http://www.replaygain.org> for more details about ReplayGain.
|
||||
# This setting is off by default.
|
||||
#
|
||||
#replaygain "album"
|
||||
#
|
||||
@@ -326,6 +358,20 @@ input {
|
||||
#
|
||||
#replaygain_preamp "0"
|
||||
#
|
||||
# This setting sets the pre-amp used for files that do NOT have ReplayGain tags.
|
||||
# By default this setting is disabled.
|
||||
#
|
||||
#replaygain_missing_preamp "0"
|
||||
#
|
||||
# This setting enables or disables ReplayGain limiting.
|
||||
# MPD calculates actual amplification based on the ReplayGain tags
|
||||
# and replaygain_preamp / replaygain_missing_preamp setting.
|
||||
# If replaygain_limit is enabled MPD will never amplify audio signal
|
||||
# above its original level. If replaygain_limit is disabled such amplification
|
||||
# might occur. By default this setting is enabled.
|
||||
#
|
||||
#replaygain_limit "yes"
|
||||
#
|
||||
# This setting enables on-the-fly normalization volume adjustment. This will
|
||||
# result in the volume of all playing audio to be adjusted so the output has
|
||||
# equal "loudness". This setting is disabled by default.
|
||||
@@ -334,39 +380,6 @@ input {
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
|
||||
# MPD Internal Buffering ######################################################
|
||||
#
|
||||
# This setting adjusts the size of internal decoded audio buffering. Changing
|
||||
# this may have undesired effects. Don't change this if you don't know what you
|
||||
# are doing.
|
||||
#
|
||||
#audio_buffer_size "2048"
|
||||
#
|
||||
# This setting controls the percentage of the buffer which is filled before
|
||||
# beginning to play. Increasing this reduces the chance of audio file skipping,
|
||||
# at the cost of increased time prior to audio playback.
|
||||
#
|
||||
#buffer_before_play "10%"
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
|
||||
# Resource Limitations ########################################################
|
||||
#
|
||||
# These settings are various limitations to prevent MPD from using too many
|
||||
# resources. Generally, these settings should be minimized to prevent security
|
||||
# risks, depending on the operating resources.
|
||||
#
|
||||
#connection_timeout "60"
|
||||
#max_connections "10"
|
||||
#max_playlist_length "16384"
|
||||
#max_command_list_size "2048"
|
||||
#max_output_buffer_size "8192"
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
|
||||
# Character Encoding ##########################################################
|
||||
#
|
||||
# If file or directory names do not display correctly for your locale then you
|
||||
@@ -374,34 +387,4 @@ input {
|
||||
#
|
||||
#filesystem_charset "UTF-8"
|
||||
#
|
||||
# This setting controls the encoding that ID3v1 tags should be converted from.
|
||||
#
|
||||
#id3v1_encoding "ISO-8859-1"
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
|
||||
# SIDPlay decoder #############################################################
|
||||
#
|
||||
# songlength_database:
|
||||
# Location of your songlengths file, as distributed with the HVSC.
|
||||
# The sidplay plugin checks this for matching MD5 fingerprints.
|
||||
# See http://www.c64.org/HVSC/DOCUMENTS/Songlengths.faq
|
||||
#
|
||||
# default_songlength:
|
||||
# This is the default playing time in seconds for songs not in the
|
||||
# songlength database, or in case you're not using a database.
|
||||
# A value of 0 means play indefinitely.
|
||||
#
|
||||
# filter:
|
||||
# Turns the SID filter emulation on or off.
|
||||
#
|
||||
#decoder {
|
||||
# plugin "sidplay"
|
||||
# songlength_database "/media/C64Music/DOCUMENTS/Songlengths.txt"
|
||||
# default_songlength "120"
|
||||
# filter "true"
|
||||
#}
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
|
||||
1073
doc/plugins.rst
Normal file
1073
doc/plugins.rst
Normal file
File diff suppressed because it is too large
Load Diff
1291
doc/protocol.rst
Normal file
1291
doc/protocol.rst
Normal file
File diff suppressed because it is too large
Load Diff
1794
doc/protocol.xml
1794
doc/protocol.xml
File diff suppressed because it is too large
Load Diff
990
doc/user.rst
Normal file
990
doc/user.rst
Normal file
@@ -0,0 +1,990 @@
|
||||
User's Manual
|
||||
#############
|
||||
|
||||
Introduction
|
||||
************
|
||||
|
||||
Music Player Daemon (:program:`MPD`) is a flexible, powerful, server-side application for playing music. Through plugins and libraries it can play a variety of sound files while being controlled by its network protocol.
|
||||
|
||||
This document is work in progress. Most of it may be incomplete yet. Please help!
|
||||
|
||||
Installation
|
||||
************
|
||||
|
||||
Installing on Debian/Ubuntu
|
||||
---------------------------
|
||||
|
||||
Install the package :file:`mpd` via :program:`apt`:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
apt install mpd
|
||||
|
||||
When installed this way, :program:`MPD` by default looks for music in :file:`/var/lib/mpd/music/`; this may not be correct. Look at your :file:`/etc/mpd.conf` file...
|
||||
|
||||
.. note::
|
||||
|
||||
Debian and Ubuntu are infamous for shipping heavily outdated
|
||||
software. The :program:`MPD` version in their respective stable
|
||||
releases are usually too old to be supported by this project.
|
||||
Ironically, the :program:`MPD` version in Debian "*unstable*" is
|
||||
more stable than the version in Debian "*stable*".
|
||||
|
||||
|
||||
Installing on Android
|
||||
---------------------
|
||||
|
||||
An experimental Android build is available on Google Play. After installing and launching it, :program:`MPD` will scan the music in your Music directory and you can control it as usual with a :program:`MPD` client.
|
||||
|
||||
If you need to tweak the configuration, you can create a file called :file:`mpd.conf` on the data partition (the directory which is returned by Android's :dfn:`getExternalStorageDirectory()` API function).
|
||||
|
||||
ALSA is not available on Android; only the :ref:`OpenSL ES
|
||||
<sles_output>` output plugin can be used for local playback.
|
||||
|
||||
Compiling from source
|
||||
---------------------
|
||||
|
||||
Download the source tarball from the `MPD home page <https://musicpd.org>`_ and unpack it:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
tar xf mpd-version.tar.xz
|
||||
cd mpd-version
|
||||
|
||||
In any case, you need:
|
||||
|
||||
* a C++14 compiler (e.g. gcc 6.0 or clang 3.9)
|
||||
* `Meson 0.47.2 <http://mesonbuild.com/>`__ and `Ninja
|
||||
<https://ninja-build.org/>`__
|
||||
* Boost 1.58
|
||||
* pkg-config
|
||||
|
||||
Each plugin usually needs a codec library, which you also need to
|
||||
install. Check the :doc:`plugins` for details about required libraries
|
||||
|
||||
For example, the following installs a fairly complete list of build dependencies on Debian Jessie:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
apt install g++ \
|
||||
libpcre3-dev \
|
||||
libmad0-dev libmpg123-dev libid3tag0-dev \
|
||||
libflac-dev libvorbis-dev libopus-dev \
|
||||
libadplug-dev libaudiofile-dev libsndfile1-dev libfaad-dev \
|
||||
libfluidsynth-dev libgme-dev libmikmod2-dev libmodplug-dev \
|
||||
libmpcdec-dev libwavpack-dev libwildmidi-dev \
|
||||
libsidplay2-dev libsidutils-dev libresid-builder-dev \
|
||||
libavcodec-dev libavformat-dev \
|
||||
libmp3lame-dev libtwolame-dev libshine-dev \
|
||||
libsamplerate0-dev libsoxr-dev \
|
||||
libbz2-dev libcdio-paranoia-dev libiso9660-dev libmms-dev \
|
||||
libzzip-dev \
|
||||
libcurl4-gnutls-dev libyajl-dev libexpat-dev \
|
||||
libasound2-dev libao-dev libjack-jackd2-dev libopenal-dev \
|
||||
libpulse-dev libshout3-dev \
|
||||
libsndio-dev \
|
||||
libmpdclient-dev \
|
||||
libnfs-dev libsmbclient-dev \
|
||||
libupnp-dev \
|
||||
libavahi-client-dev \
|
||||
libsqlite3-dev \
|
||||
libsystemd-dev libwrap0-dev \
|
||||
libgtest-dev \
|
||||
libboost-dev \
|
||||
libicu-dev
|
||||
|
||||
|
||||
Now configure the source tree:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
meson . output/release --buildtype=debugoptimized -Db_ndebug=true
|
||||
|
||||
The following command shows a list of compile-time options:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
meson configure output/release
|
||||
|
||||
When everything is ready and configured, compile:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
ninja -C output/release
|
||||
|
||||
And install:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
ninja -C output/release install
|
||||
|
||||
Compiling for Windows
|
||||
---------------------
|
||||
|
||||
Even though it does not "feel" like a Windows application, :program:`MPD` works well under Windows. Its build process follows the "Linux style" and may seem awkward for Windows people (who are not used to compiling their software, anyway).
|
||||
|
||||
Basically, there are two ways to compile :program:`MPD` for Windows:
|
||||
|
||||
* Build as described above: with :program:`meson` and
|
||||
:program:`ninja`. To cross-compile from Linux, you need `a Meson
|
||||
cross file <https://mesonbuild.com/Cross-compilation.html>`__.
|
||||
|
||||
The remaining difficulty is installing all the external libraries.
|
||||
And :program:`MPD` usually needs many, making this method cumbersome
|
||||
for the casual user.
|
||||
|
||||
* Build on Linux for Windows using :program:`MPD`'s library build script.
|
||||
|
||||
This section is about the latter.
|
||||
|
||||
Just like with the native build, unpack the :program:`MPD` source
|
||||
tarball and change into the directory. Then, instead of
|
||||
:program:`meson`, type:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
mkdir -p output/win64
|
||||
cd output/win64
|
||||
../../win32/build.py --64
|
||||
|
||||
This downloads various library sources, and then configures and builds
|
||||
:program:`MPD` (for x64; to build a 32 bit binary, pass
|
||||
:code:`--32`). The resulting EXE files is linked statically, i.e. it
|
||||
contains all the libraries already and you do not need carry DLLs
|
||||
around. It is large, but easy to use. If you wish to have a small
|
||||
mpd.exe with DLLs, you need to compile manually, without the
|
||||
:file:`build.py` script.
|
||||
|
||||
Compiling for Android
|
||||
---------------------
|
||||
|
||||
:program:`MPD` can be compiled as an Android app. It can be installed easily with Google Play, but if you want to build it from source, follow this section.
|
||||
|
||||
You need:
|
||||
|
||||
* Android SDK
|
||||
* Android NDK
|
||||
|
||||
Just like with the native build, unpack the :program:`MPD` source
|
||||
tarball and change into the directory. Then, instead of
|
||||
:program:`meson`, type:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
mkdir -p output/android
|
||||
cd output/android
|
||||
../../android/build.py SDK_PATH NDK_PATH ABI
|
||||
meson configure -Dandroid_debug_keystore=$HOME/.android/debug.keystore
|
||||
ninja android/apk/mpd-debug.apk
|
||||
|
||||
:envvar:`SDK_PATH` is the absolute path where you installed the
|
||||
Android SDK; :envvar:`NDK_PATH` is the Android NDK installation path;
|
||||
ABI is the Android ABI to be built, e.g. ":code:`arm64-v8a`".
|
||||
|
||||
This downloads various library sources, and then configures and builds :program:`MPD`.
|
||||
|
||||
systemd socket activation
|
||||
-------------------------
|
||||
|
||||
Using systemd, you can launch :program:`MPD` on demand when the first client attempts to connect.
|
||||
|
||||
:program:`MPD` comes with two systemd unit files: a "service" unit and
|
||||
a "socket" unit. These will be installed to the directory specified
|
||||
with :code:`-Dsystemd_system_unit_dir=...`,
|
||||
e.g. :file:`/lib/systemd/system`.
|
||||
|
||||
To enable socket activation, type:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
systemctl enable mpd.socket
|
||||
systemctl start mpd.socket
|
||||
|
||||
In this configuration, :program:`MPD` will ignore the :ref:`listener
|
||||
settings <listeners>` (``bind_to_address`` and ``port``).
|
||||
|
||||
systemd user unit
|
||||
-----------------
|
||||
|
||||
You can launch :program:`MPD` as a systemd user unit. These will be
|
||||
installed to the directory specified with
|
||||
:code:`-Dsystemd_user_unit_dir=...`,
|
||||
e.g. :file:`/usr/lib/systemd/user` or
|
||||
:file:`$HOME/.local/share/systemd/user`.
|
||||
|
||||
Once the user unit is installed, you can start and stop :program:`MPD` like any other service:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
systemctl --user start mpd
|
||||
|
||||
To auto-start :program:`MPD` upon login, type:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
systemctl --user enable mpd
|
||||
|
||||
Configuration
|
||||
*************
|
||||
|
||||
The Configuration File
|
||||
----------------------
|
||||
|
||||
:program:`MPD` reads its configuration from a text file. Usually, that is :file:`/etc/mpd.conf`, unless a different path is specified on the command line. If you run :program:`MPD` as a user daemon (and not as a system daemon), the configuration is read from :file:`$XDG_CONFIG_HOME/mpd/mpd.conf` (usually :file:`~/.config/mpd/mpd.conf`). On Android, :file:`mpd.conf` will be loaded from the top-level directory of the data partition.
|
||||
|
||||
Each line in the configuration file contains a setting name and its value, e.g.:
|
||||
|
||||
:code:`connection_timeout "5"`
|
||||
|
||||
For settings which specify a filesystem path, the tilde is expanded:
|
||||
|
||||
:code:`music_directory "~/Music"`
|
||||
|
||||
Some of the settings are grouped in blocks with curly braces, e.g. per-plugin settings:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
audio_output {
|
||||
type "alsa"
|
||||
name "My ALSA output"
|
||||
device "iec958:CARD=Intel,DEV=0"
|
||||
mixer_control "PCM"
|
||||
}
|
||||
|
||||
The :code:`include` directive can be used to include settings from
|
||||
another file; the given file name is relative to the current file:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
include "other.conf"
|
||||
|
||||
Configuring the music directory
|
||||
-------------------------------
|
||||
|
||||
When you play local files, you should organize them within a directory called the "music directory". This is configured in :program:`MPD` with the music_directory setting.
|
||||
|
||||
By default, :program:`MPD` follows symbolic links in the music directory. This behavior can be switched off: :code:`follow_outside_symlinks` controls whether :program:`MPD` follows links pointing to files outside of the music directory, and :code:`follow_inside_symlinks` lets you disable symlinks to files inside the music directory.
|
||||
|
||||
Instead of using local files, you can use storage plugins to access
|
||||
files on a remote file server. For example, to use music from the
|
||||
SMB/CIFS server ":file:`myfileserver`" on the share called "Music",
|
||||
configure the music directory ":file:`smb://myfileserver/Music`". For
|
||||
a recipe, read the Satellite :program:`MPD` section :ref:`satellite`.
|
||||
|
||||
You can also use multiple storage plugins to assemble a virtual music directory consisting of multiple storages.
|
||||
|
||||
Configuring database plugins
|
||||
----------------------------
|
||||
|
||||
If a music directory is configured, one database plugin is used. To configure this plugin, add a database block to :file:`mpd.conf`:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
database {
|
||||
plugin "simple"
|
||||
path "/var/lib/mpd/db"
|
||||
}
|
||||
|
||||
More information can be found in the :ref:`database_plugins`
|
||||
reference.
|
||||
|
||||
Configuring neighbor plugins
|
||||
----------------------------
|
||||
|
||||
All neighbor plugins are disabled by default to avoid unwanted overhead. To enable (and configure) a plugin, add a neighbor block to :file:`mpd.conf`:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
neighbors {
|
||||
plugin "smbclient"
|
||||
}
|
||||
|
||||
More information can be found in the :ref:`neighbor_plugin` reference.
|
||||
|
||||
Configuring input plugins
|
||||
-------------------------
|
||||
|
||||
To configure an input plugin, add a input block to :file:`mpd.conf`:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
input {
|
||||
plugin "curl"
|
||||
proxy "proxy.local"
|
||||
}
|
||||
|
||||
|
||||
The following table lists the input options valid for all plugins:
|
||||
|
||||
.. list-table::
|
||||
:widths: 20 80
|
||||
:header-rows: 1
|
||||
|
||||
* - Name
|
||||
- Description
|
||||
* - **plugin**
|
||||
- The name of the plugin
|
||||
* - **enabled yes|no**
|
||||
- Allows you to disable a input plugin without recompiling. By default, all plugins are enabled.
|
||||
|
||||
More information can be found in the :ref:`input_plugins` reference.
|
||||
|
||||
Configuring decoder plugins
|
||||
---------------------------
|
||||
|
||||
Most decoder plugins do not need any special configuration. To configure a decoder, add a decoder block to :file:`mpd.conf`:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
decoder {
|
||||
plugin "wildmidi"
|
||||
config_file "/etc/timidity/timidity.cfg"
|
||||
}
|
||||
|
||||
The following table lists the decoder options valid for all plugins:
|
||||
|
||||
.. list-table::
|
||||
:widths: 20 80
|
||||
:header-rows: 1
|
||||
|
||||
* - Name
|
||||
- Description
|
||||
* - **plugin**
|
||||
- The name of the plugin
|
||||
* - **enabled yes|no**
|
||||
- Allows you to disable a decoder plugin without recompiling. By default, all plugins are enabled.
|
||||
|
||||
More information can be found in the :ref:`decoder_plugins` reference.
|
||||
|
||||
Configuring encoder plugins
|
||||
---------------------------
|
||||
|
||||
Encoders are used by some of the output plugins (such as shout). The encoder settings are included in the audio_output section.
|
||||
|
||||
More information can be found in the :ref:`encoder_plugins` reference.
|
||||
|
||||
Configuring audio outputs
|
||||
-------------------------
|
||||
|
||||
Audio outputs are devices which actually play the audio chunks produced by :program:`MPD`. You can configure any number of audio output devices, but there must be at least one. If none is configured, :program:`MPD` attempts to auto-detect. Usually, this works quite well with ALSA, OSS and on Mac OS X.
|
||||
|
||||
To configure an audio output manually, add one or more audio_output blocks to :file:`mpd.conf`:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
audio_output {
|
||||
type "alsa"
|
||||
name "my ALSA device"
|
||||
device "hw:0"
|
||||
}
|
||||
|
||||
The following table lists the audio_output options valid for all plugins:
|
||||
|
||||
|
||||
.. list-table::
|
||||
:widths: 20 80
|
||||
:header-rows: 1
|
||||
|
||||
* - Name
|
||||
- Description
|
||||
* - **type**
|
||||
- The name of the plugin
|
||||
* - **name**
|
||||
- The name of the audio output. It is visible to the client. Some plugins also use it internally, e.g. as a name registered in the PULSE server.
|
||||
* - **format**
|
||||
- Always open the audio output with the specified audio format samplerate:bits:channels), regardless of the format of the input file. This is optional for most plugins.
|
||||
|
||||
Any of the three attributes may be an asterisk to specify that this attribute should not be enforced, example: 48000:16:*. *:*:* is equal to not having a format specification.
|
||||
|
||||
The following values are valid for bits: 8 (signed 8 bit integer samples), 16, 24 (signed 24 bit integer samples padded to 32 bit), 32 (signed 32 bit integer samples), f (32 bit floating point, -1.0 to 1.0), "dsd" means DSD (Direct Stream Digital). For DSD, there are special cases such as "dsd64", which allows you to omit the sample rate (e.g. dsd512:2 for stereo DSD512, i.e. 22.5792 MHz).
|
||||
|
||||
The sample rate is special for DSD: :program:`MPD` counts the number of bytes, not bits. Thus, a DSD "bit" rate of 22.5792 MHz (DSD512) is 2822400 from :program:`MPD`'s point of view (44100*512/8).
|
||||
* - **enabed yes|no**
|
||||
- Specifies whether this audio output is enabled when :program:`MPD` is started. By default, all audio outputs are enabled. This is just the default setting when there is no state file; with a state file, the previous state is restored.
|
||||
* - **tags yes|no**
|
||||
- If set to no, then :program:`MPD` will not send tags to this output. This is only useful for output plugins that can receive tags, for example the httpd output plugin.
|
||||
* - **always_on yes|no**
|
||||
- If set to yes, then :program:`MPD` attempts to keep this audio output always open. This may be useful for streaming servers, when you don't want to disconnect all listeners even when playback is accidentally stopped.
|
||||
* - **mixer_type hardware|software|null|none**
|
||||
- Specifies which mixer should be used for this audio output: the hardware mixer (available for ALSA :ref:`alsa_plugin`, OSS :ref:`oss_plugin` and PulseAudio :ref:`pulse_plugin`), the software mixer, the "null" mixer (null; allows setting the volume, but with no effect; this can be used as a trick to implement an external mixer :ref:`external_mixer`) or no mixer (none). By default, the hardware mixer is used for devices which support it, and none for the others.
|
||||
|
||||
Configuring filters
|
||||
-------------------
|
||||
|
||||
Filters are plugins which modify an audio stream.
|
||||
|
||||
To configure a filter, add a filter block to :file:`mpd.conf`:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
filter {
|
||||
plugin "volume"
|
||||
name "software volume"
|
||||
}
|
||||
|
||||
The following table lists the filter options valid for all plugins:
|
||||
|
||||
.. list-table::
|
||||
:widths: 20 80
|
||||
:header-rows: 1
|
||||
|
||||
* - Name
|
||||
- Description
|
||||
* - **plugin**
|
||||
- The name of the plugin
|
||||
* - **name**
|
||||
- The name of the filter
|
||||
|
||||
Configuring playlist plugins
|
||||
----------------------------
|
||||
|
||||
Playlist plugins are used to load remote playlists (protocol commands load, listplaylist and listplaylistinfo). This is not related to :program:`MPD`'s playlist directory.
|
||||
|
||||
To configure a playlist plugin, add a playlist_plugin block to :file:`mpd.conf`:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
playlist_plugin {
|
||||
name "m3u"
|
||||
enabled "true"
|
||||
}
|
||||
|
||||
The following table lists the playlist_plugin options valid for all plugins:
|
||||
|
||||
.. list-table::
|
||||
:widths: 20 80
|
||||
:header-rows: 1
|
||||
|
||||
* - Name
|
||||
- Description
|
||||
* - **plugin**
|
||||
- The name of the plugin
|
||||
* - **enabled yes|no**
|
||||
- Allows you to disable a playlist plugin without recompiling. By default, all plugins are enabled.
|
||||
|
||||
More information can be found in the :ref:`playlist_plugins`
|
||||
reference.
|
||||
|
||||
Audio Format Settings
|
||||
---------------------
|
||||
|
||||
Global Audio Format
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The setting audio_output_format forces :program:`MPD` to use one audio format for all outputs. Doing that is usually not a good idea. The values are the same as in format in the audio_output section.
|
||||
|
||||
Resampler
|
||||
~~~~~~~~~
|
||||
|
||||
Sometimes, music needs to be resampled before it can be played; for example, CDs use a sample rate of 44,100 Hz while many cheap audio chips can only handle 48,000 Hz. Resampling reduces the quality and consumes a lot of CPU. There are different options, some of them optimized for high quality and others for low CPU usage, but you can't have both at the same time. Often, the resampler is the component that is responsible for most of :program:`MPD`'s CPU usage. Since :program:`MPD` comes with high quality defaults, it may appear that :program:`MPD` consumes more CPU than other software.
|
||||
|
||||
Check the :ref:`resampler_plugins` reference for a list of resamplers
|
||||
and how to configure them.
|
||||
|
||||
Client Connections
|
||||
------------------
|
||||
|
||||
.. _listeners:
|
||||
|
||||
Listeners
|
||||
~~~~~~~~~
|
||||
|
||||
The setting :code:`bind_to_address` specifies which addresses
|
||||
:program:`MPD` listens on for connections from clients. It can be
|
||||
used multiple times to bind to more than one address. Example::
|
||||
|
||||
bind_to_address "192.168.1.42"
|
||||
bind_to_address "127.0.0.1"
|
||||
|
||||
The default is "any", which binds to all available addresses.
|
||||
Additionally, MPD binds to :code:`$XDG_RUNTIME_DIR/mpd/socket` (if it
|
||||
was launched as a per-user daemon and no :code:`bind_to_address`
|
||||
setting exists).
|
||||
|
||||
You can set a port that is different from the global port setting,
|
||||
e.g. "localhost:6602". IPv6 addresses must be enclosed in square
|
||||
brackets if you want to configure a port::
|
||||
|
||||
bind_to_address "[::1]:6602"
|
||||
|
||||
To bind to a local socket (UNIX domain socket), specify an absolute
|
||||
path or a path starting with a tilde (~). Some clients default to
|
||||
connecting to :file:`/var/run/mpd/socket` so this may be a good
|
||||
choice::
|
||||
|
||||
bind_to_address "/var/run/mpd/socket"
|
||||
|
||||
If no port is specified, the default port is 6600. This default can
|
||||
be changed with the port setting::
|
||||
|
||||
port "6601"
|
||||
|
||||
These settings will be ignored if `systemd socket activation`_ is
|
||||
used.
|
||||
|
||||
|
||||
Permissions and Passwords
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
By default, all clients are unauthenticated and have a full set of permissions. This can be restricted with the settings :code:`default_permissions` and :code:`password`.
|
||||
|
||||
:code:`default_permissions` controls the permissions of a new client. Its value is a comma-separated list of permissions:
|
||||
|
||||
.. list-table::
|
||||
:widths: 20 80
|
||||
:header-rows: 1
|
||||
|
||||
* - Name
|
||||
- Description
|
||||
* - **read**
|
||||
- Allows reading of the database, displaying the current playlist, and current status of :program:`MPD`.
|
||||
* - **add**
|
||||
- Allows adding songs and loading playlists.
|
||||
* - **control**
|
||||
- Allows all other player and playlist manipulations.
|
||||
* - **admin**
|
||||
- Allows database updates and allows shutting down :program:`MPD`.
|
||||
|
||||
:code:`local_permissions` may be used to assign other permissions to clients connecting on a local socket.
|
||||
|
||||
:code:`password` allows the client to send a password to gain other permissions. This option may be specified multiple times with different passwords.
|
||||
|
||||
Note that the :code:`password` option is not secure: passwords are sent in clear-text over the connection, and the client cannot verify the server's identity.
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
default_permissions "read"
|
||||
password "the_password@read,add,control"
|
||||
password "the_admin_password@read,add,control,admin"
|
||||
|
||||
Other Settings
|
||||
--------------
|
||||
|
||||
.. _metadata_to_use:
|
||||
|
||||
.. list-table::
|
||||
:widths: 20 80
|
||||
:header-rows: 1
|
||||
|
||||
* - Setting
|
||||
- Description
|
||||
* - **metadata_to_use TAG1,TAG2,...**
|
||||
- Use only the specified tags, and ignore the others. This
|
||||
setting can reduce the database size and :program:`MPD`'s
|
||||
memory usage by omitting unused tags. By default, all tags but
|
||||
comment are enabled. The special value "none" disables all
|
||||
tags.
|
||||
|
||||
If the setting starts with ``+`` or ``-``, then the following
|
||||
tags will be added or remoted to/from the current set of tags.
|
||||
This example just enables the "comment" tag without disabling all
|
||||
the other supported tags
|
||||
|
||||
metadata_to_use "+comment"
|
||||
|
||||
Section :ref:`tags` contains a list of supported tags.
|
||||
|
||||
The State File
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
The state file is a file where :program:`MPD` saves and restores its state (play queue, playback position etc.) to keep it persistent across restarts and reboots. It is an optional setting.
|
||||
|
||||
:program:`MPD` will attempt to load the state file during startup, and will save it when shutting down the daemon. Additionally, the state file is refreshed every two minutes (after each state change).
|
||||
|
||||
.. list-table::
|
||||
:widths: 20 80
|
||||
:header-rows: 1
|
||||
|
||||
* - Setting
|
||||
- Description
|
||||
* - **state_file PATH**
|
||||
- Specify the state file location. The parent directory must be writable by the :program:`MPD` user (+wx).
|
||||
* - **state_file_interval SECONDS**
|
||||
- Auto-save the state file this number of seconds after each state change. Defaults to 120 (2 minutes).
|
||||
|
||||
The Sticker Database
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
"Stickers" are pieces of information attached to songs. Some clients
|
||||
use them to store ratings and other volatile data. This feature
|
||||
requires :program:`SQLite`, compile-time configure option
|
||||
:code:`-Dsqlite=...`.
|
||||
|
||||
.. list-table::
|
||||
:widths: 20 80
|
||||
:header-rows: 1
|
||||
|
||||
* - Setting
|
||||
- Description
|
||||
* - **sticker_file PATH**
|
||||
- The location of the sticker database.
|
||||
|
||||
Resource Limitations
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
These settings are various limitations to prevent :program:`MPD` from using too many resources (denial of service).
|
||||
|
||||
.. list-table::
|
||||
:widths: 20 80
|
||||
:header-rows: 1
|
||||
|
||||
* - Setting
|
||||
- Description
|
||||
* - **connection_timeout SECONDS**
|
||||
- If a client does not send any new data in this time period, the connection is closed. Clients waiting in "idle" mode are excluded from this. Default is 60.
|
||||
* - **max_connections NUMBER**
|
||||
- This specifies the maximum number of clients that can be connected to :program:`MPD` at the same time. Default is 5.
|
||||
* - **max_playlist_length NUMBER**
|
||||
- The maximum number of songs that can be in the playlist. Default is 16384.
|
||||
* - **max_command_list_size KBYTES**
|
||||
- The maximum size a command list. Default is 2048 (2 MiB).
|
||||
* - **max_output_buffer_size KBYTES**
|
||||
- The maximum size of the output buffer to a client (maximum response size). Default is 8192 (8 MiB).
|
||||
|
||||
Buffer Settings
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Do not change these unless you know what you are doing.
|
||||
|
||||
.. list-table::
|
||||
:widths: 20 80
|
||||
:header-rows: 1
|
||||
|
||||
* - Setting
|
||||
- Description
|
||||
* - **audio_buffer_size KBYTES**
|
||||
- Adjust the size of the internal audio buffer. Default is 4096 (4 MiB).
|
||||
|
||||
Zeroconf
|
||||
~~~~~~~~
|
||||
|
||||
If Zeroconf support (`Avahi <http://avahi.org/>`_ or Apple's Bonjour)
|
||||
was enabled at compile time with :code:`-Dzeroconf=...`,
|
||||
:program:`MPD` can announce its presence on the network. The following
|
||||
settings control this feature:
|
||||
|
||||
.. list-table::
|
||||
:widths: 20 80
|
||||
:header-rows: 1
|
||||
|
||||
* - Setting
|
||||
- Description
|
||||
* - **zeroconf_enabled yes|no**
|
||||
- Enables or disables this feature. Default is yes.
|
||||
* - **zeroconf_name NAME**
|
||||
- The service name to publish via Zeroconf. The default is "Music Player @ %h".
|
||||
%h will be replaced with the hostname of the machine running :program:`MPD`.
|
||||
|
||||
Advanced configuration
|
||||
**********************
|
||||
|
||||
.. _satellite:
|
||||
|
||||
Satellite setup
|
||||
---------------
|
||||
|
||||
:program:`MPD` runs well on weak machines such as the Raspberry Pi. However, such hardware tends to not have storage big enough to hold a music collection. Mounting music from a file server can be very slow, especially when updating the database.
|
||||
|
||||
One approach for optimization is running :program:`MPD` on the file server, which not only exports raw files, but also provides access to a readily scanned database. Example configuration:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
music_directory "nfs://fileserver.local/srv/mp3"
|
||||
#music_directory "smb://fileserver.local/mp3"
|
||||
|
||||
database {
|
||||
plugin "proxy"
|
||||
host "fileserver.local"
|
||||
}
|
||||
|
||||
The :code:`music_directory` setting tells :program:`MPD` to read files from the given NFS server. It does this by connecting to the server from userspace. This does not actually mount the file server into the kernel's virtual file system, and thus requires no kernel cooperation and no special privileges. It does not even require a kernel with NFS support, only the nfs storage plugin (using the libnfs userspace library). The same can be done with SMB/CIFS using the smbclient storage plugin (using libsmbclient).
|
||||
|
||||
The database setting tells :program:`MPD` to pass all database queries on to the :program:`MPD` instance running on the file server (using the proxy plugin).
|
||||
|
||||
Real-Time Scheduling
|
||||
--------------------
|
||||
|
||||
On Linux, :program:`MPD` attempts to configure real-time scheduling for some threads that benefit from it.
|
||||
|
||||
This is only possible you allow :program:`MPD` to do it. This privilege is controlled by :envvar:`RLIMIT_RTPRIO` :envvar:`RLIMIT_RTTIME`. You can configure this privilege with :command:`ulimit` before launching :program:`MPD`:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
ulimit -HS -r 50; mpd
|
||||
|
||||
Or you can use the :command:`prlimit` program from the util-linux package:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
prlimit --rtprio=50 --rttime=unlimited mpd
|
||||
|
||||
The systemd service file shipped with :program:`MPD` comes with this setting.
|
||||
|
||||
This works only if the Linux kernel was compiled with :makevar:`CONFIG_RT_GROUP_SCHED` disabled. Use the following command to check this option for your current kernel:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
zgrep ^CONFIG_RT_GROUP_SCHED /proc/config.gz
|
||||
|
||||
You can verify whether the real-time scheduler is active with the ps command:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
# ps H -q `pidof -s mpd` -o 'pid,tid,cls,rtprio,comm'
|
||||
PID TID CLS RTPRIO COMMAND
|
||||
16257 16257 TS - mpd
|
||||
16257 16258 TS - io
|
||||
16257 16259 FF 50 rtio
|
||||
16257 16260 TS - player
|
||||
16257 16261 TS - decoder
|
||||
16257 16262 FF 50 output:ALSA
|
||||
16257 16263 IDL 0 update
|
||||
|
||||
The CLS column shows the CPU scheduler; TS is the normal scheduler; FF and RR are real-time schedulers. In this example, two threads use the real-time scheduler: the output thread and the rtio (real-time I/O) thread; these two are the important ones. The database update thread uses the idle scheduler ("IDL in ps), which only gets CPU when no other process needs it.
|
||||
|
||||
Note
|
||||
~~~~
|
||||
|
||||
There is a rumor that real-time scheduling improves audio quality. That is not true. All it does is reduce the probability of skipping (audio buffer xruns) when the computer is under heavy load.
|
||||
|
||||
Using MPD
|
||||
*********
|
||||
|
||||
The client
|
||||
----------
|
||||
|
||||
After you have installed, configured and started :program:`MPD`, you choose a client to control the playback.
|
||||
|
||||
The most basic client is :program:`mpc`, which provides a command line interface. It is useful in shell scripts. Many people bind specific :program:`mpc` commands to hotkeys.
|
||||
|
||||
The `MPD Wiki <http://www.musicpd.org/clients/>`_ contains an extensive list of clients to choose from.
|
||||
|
||||
The music directory and the database
|
||||
------------------------------------
|
||||
|
||||
The "music directory" is where you store your music files. :program:`MPD` stores all relevant meta information about all songs in its "database". Whenever you add, modify or remove songs in the music directory, you have to update the database, for example with mpc:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
mpc update
|
||||
|
||||
Depending on the size of your music collection and the speed of the storage, this can take a while.
|
||||
|
||||
To exclude a file from the update, create a file called :file:`.mpdignore` in its parent directory. Each line of that file may contain a list of shell wildcards. Matching files in the current directory and all subdirectories are excluded.
|
||||
|
||||
Mounting other storages into the music directory
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
:program:`MPD` has various storage plugins of which multiple instances can be "mounted" into the music directory. This way, you can use local music, file servers and USB sticks at the same time. Example:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
mpc mount foo nfs://192.168.1.4/export/mp3
|
||||
mpc mount usbstick udisks://by-uuid-2F2B-D136
|
||||
mpc unmount usbstick
|
||||
|
||||
:program:`MPD`'s neighbor plugins can be helpful with finding mountable storages:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
mpc listneighbors
|
||||
|
||||
Mounting is only possible with the simple database plugin and a :code:`cache_directory`, e.g.:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
database {
|
||||
plugin "simple"
|
||||
path "~/.mpd/db"
|
||||
cache_directory "~/.mpd/cache"
|
||||
}
|
||||
|
||||
This requires migrating from the old :code:`db_file` setting to a database section. The cache directory must exist, and :program:`MPD` will put one file per mount there, which will be reused when the same storage is used again later.
|
||||
|
||||
Metadata
|
||||
--------
|
||||
|
||||
When scanning or playing a song, :program:`MPD` parses its metadata.
|
||||
See :ref:`tags` for a list of supported tags.
|
||||
|
||||
The :ref:`metadata_to_use <metadata_to_use>` setting can be used to
|
||||
enable or disable certain tags.
|
||||
|
||||
The queue
|
||||
---------
|
||||
|
||||
The queue (sometimes called "current playlist") is a list of songs to be played by :program:`MPD`. To play a song, add it to the queue and start playback. Most clients offer an interface to edit the queue.
|
||||
|
||||
Stored Playlists
|
||||
----------------
|
||||
|
||||
Stored playlists are some kind of secondary playlists which can be created, saved, edited and deleted by the client. They are addressed by their names. Its contents can be loaded into the queue, to be played back. The playlist_directory setting specifies where those playlists are stored.
|
||||
|
||||
Advanced usage
|
||||
**************
|
||||
|
||||
Bit-perfect playback
|
||||
--------------------
|
||||
|
||||
"Bit-perfect playback" is a phrase used by audiophiles to describe a setup that plays back digital music as-is, without applying any modifications such as resampling, format conversion or software volume. Naturally, this implies a lossless codec.
|
||||
|
||||
By default, :program:`MPD` attempts to do bit-perfect playback, unless you tell it not to. Precondition is a sound chip that supports the audio format of your music files. If the audio format is not supported, :program:`MPD` attempts to fall back to the nearest supported audio format, trying to lose as little quality as possible.
|
||||
|
||||
To verify if :program:`MPD` converts the audio format, enable verbose logging, and watch for these lines:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
decoder: audio_format=44100:24:2, seekable=true
|
||||
output: opened plugin=alsa name="An ALSA output"audio_format=44100:16:2
|
||||
output: converting from 44100:24:2
|
||||
|
||||
This example shows that a 24 bit file is being played, but the sound chip cannot play 24 bit. It falls back to 16 bit, discarding 8 bit.
|
||||
|
||||
However, this does not yet prove bit-perfect playback; ALSA may be fooling :program:`MPD` that the audio format is supported. To verify the format really being sent to the physical sound chip, try:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
cat /proc/asound/card*/pcm*p/sub*/hw_params
|
||||
access: RW_INTERLEAVED
|
||||
format: S16_LE
|
||||
subformat: STD
|
||||
channels: 2
|
||||
rate: 44100 (44100/1)
|
||||
period_size: 4096
|
||||
buffer_size: 16384
|
||||
|
||||
Obey the "format" row, which indicates that the current playback format is 16 bit (signed 16 bit integer, little endian).
|
||||
|
||||
Check list for bit-perfect playback:
|
||||
|
||||
* Use the ALSA output plugin.
|
||||
* Disable sound processing inside ALSA by configuring a "hardware" device (hw:0,0 or similar).
|
||||
* Don't use software volume (setting mixer_type).
|
||||
* Don't force :program:`MPD` to use a specific audio format (settings format, audio_output_format).
|
||||
* Verify that you are really doing bit-perfect playback using :program:`MPD`'s verbose log and :file:`/proc/asound/card*/pcm*p/sub*/hw_params`. Some DACs can also indicate the audio format.
|
||||
|
||||
Direct Stream Digital (DSD)
|
||||
---------------------------
|
||||
|
||||
DSD (`Direct Stream Digital <https://en.wikipedia.org/wiki/Direct_Stream_Digital>`_) is a digital format that stores audio as a sequence of single-bit values at a very high sampling rate.
|
||||
|
||||
:program:`MPD` understands the file formats dff and dsf. There are three ways to play back DSD:
|
||||
|
||||
* Native DSD playback. Requires ALSA 1.0.27.1 or later, a sound driver/chip that supports DSD and of course a DAC that supports DSD.
|
||||
|
||||
* DoP (DSD over PCM) playback. This wraps DSD inside fake 24 bit PCM according to the DoP standard. Requires a DAC that supports DSD. No support from ALSA and the sound chip required (except for bit-perfect 24 bit PCM support).
|
||||
* Convert DSD to PCM on-the-fly.
|
||||
|
||||
Native DSD playback is used automatically if available. DoP is only used if enabled explicitly using the dop option, because there is no way for :program:`MPD` to find out whether the DAC supports it. DSD to PCM conversion is the fallback if DSD cannot be used directly.
|
||||
|
||||
Client Hacks
|
||||
************
|
||||
|
||||
.. _external_mixer:
|
||||
|
||||
External Mixer
|
||||
--------------
|
||||
|
||||
The setting :code:`mixer_type "null"` asks MPD to pretend that there is a mixer, but not actually do something. This allows you to implement a :program:`MPD` client which listens for mixer events, queries the current (fake) volume, and uses it to program an external mixer. For example, your client can forward this setting to your amplifier.
|
||||
|
||||
Troubleshooting
|
||||
***************
|
||||
|
||||
Where to start
|
||||
--------------
|
||||
|
||||
Make sure you have the latest :program:`MPD` version (via :code:`mpd --version`, not mpc version). All the time, bugs are found and fixed, and your problem might be a bug that is fixed already. Do not ask for help unless you have the latest :program:`MPD` version. The most common excuse is when your distribution ships an old :program:`MPD` version - in that case, please ask your distribution for help, and not the :program:`MPD` project.
|
||||
|
||||
Check the log file. Configure :code:`log_level "verbose"` or pass :option:`--verbose` to mpd.
|
||||
|
||||
Sometimes, it is helpful to run :program:`MPD` in a terminal and follow what happens. This is how to do it:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
mpd --stdout --no-daemon --verbose
|
||||
|
||||
Support
|
||||
-------
|
||||
|
||||
Getting Help
|
||||
~~~~~~~~~~~~
|
||||
|
||||
The :program:`MPD` project runs a `forum <https://forum.musicpd.org/>`_ and an IRC channel (#mpd on Freenode) for requesting help. Visit the MPD help page for details on how to get help.
|
||||
|
||||
Common Problems
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
1. Database
|
||||
^^^^^^^^^^^
|
||||
|
||||
Question: I can't see my music in the MPD database!
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
* Check your :code:`music_directory` setting.
|
||||
* Does the MPD user have read permission on all music files, and read+execute permission on all music directories (and all of their parent directories)?
|
||||
* Did you update the database? (mpc update)
|
||||
* Did you enable all relevant decoder plugins at compile time? :command:`mpd --version` will tell you.
|
||||
|
||||
Question: MPD doesn't read ID3 tags!
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
* You probably compiled :program:`MPD` without libid3tag. :command:`mpd --version` will tell you.
|
||||
|
||||
2. Playback
|
||||
^^^^^^^^^^^
|
||||
|
||||
Question: I can't hear music on my client!
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
* That problem usually follows a misunderstanding of the nature of :program:`MPD`. :program:`MPD` is a remote-controlled music player, not a music distribution system. Usually, the speakers are connected to the box where :program:`MPD` runs, and the :program:`MPD` client only sends control commands, but the client does not actually play your music.
|
||||
|
||||
:program:`MPD` has output plugins which allow hearing music on a remote host (such as httpd), but that is not :program:`MPD`'s primary design goal.
|
||||
|
||||
Question: "Device or resource busy"
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
* This ALSA error means that another program uses your sound hardware exclusively. You can stop that program to allow :program:`MPD` to use it.
|
||||
|
||||
Sometimes, this other program is PulseAudio, which can multiplex sound from several applications, to allow them to share your sound chip. In this case, it might be a good idea for :program:`MPD` to use PulseAudio as well, instead of using ALSA directly.
|
||||
|
||||
Reporting Bugs
|
||||
--------------
|
||||
|
||||
If you believe you found a bug in :program:`MPD`, report it on the `bug tracker <https://github.com/MusicPlayerDaemon/MPD/issues>`_.
|
||||
|
||||
Your bug report should contain:
|
||||
|
||||
* the output of :command:`mpd --version`
|
||||
* your configuration file (:file:`mpd.conf`)
|
||||
* relevant portions of the log file (:option:`--verbose`)
|
||||
* be clear about what you expect MPD to do, and what is actually happening
|
||||
|
||||
MPD crashes
|
||||
~~~~~~~~~~~
|
||||
|
||||
All :program:`MPD` crashes are bugs which must be fixed by a developer, and you should write a bug report. (Many crash bugs are caused by codec libraries used by :program:`MPD`, and then that library must be fixed; but in any case, the :program:`MPD` `bug tracker <https://github.com/MusicPlayerDaemon/MPD/issues>`_ is a good place to report it first if you don't know.)
|
||||
|
||||
A crash bug report needs to contain a "backtrace".
|
||||
|
||||
First of all, your :program:`MPD` executable must not be "stripped"
|
||||
(i.e. debug information deleted). The executables shipped with Linux
|
||||
distributions are usually stripped, but some have so-called "debug"
|
||||
packages (package :file:`mpd-dbgsym` or :file:`mpd-dbg` on Debian,
|
||||
:file:`mpd-debug` on other distributions). Make sure this package is
|
||||
installed.
|
||||
|
||||
If you built :program:`MPD` from sources, please recompile with Meson
|
||||
option ":code:`--buildtype=debug -Db_ndebug=false`", because this will
|
||||
add more helpful information to the backtrace.
|
||||
|
||||
You can extract the backtrace from a core dump, or by running :program:`MPD` in a debugger, e.g.:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
gdb --args mpd --stdout --no-daemon --verbose
|
||||
run
|
||||
|
||||
As soon as you have reproduced the crash, type ":command:`bt`" on the
|
||||
gdb command prompt. Copy the output to your bug report.
|
||||
1503
doc/user.xml
1503
doc/user.xml
File diff suppressed because it is too large
Load Diff
192
m4/faad.m4
192
m4/faad.m4
@@ -1,192 +0,0 @@
|
||||
AC_DEFUN([AM_PATH_FAAD],
|
||||
[dnl ##
|
||||
dnl faad
|
||||
dnl ##
|
||||
|
||||
AC_ARG_ENABLE(aac,
|
||||
AS_HELP_STRING([--disable-aac],
|
||||
[disable AAC support (default: enable)]),,
|
||||
enable_aac=yes)
|
||||
|
||||
AC_ARG_WITH(faad,
|
||||
AS_HELP_STRING([--with-faad=PFX],
|
||||
[prefix where faad2 is installed (optional)]),,
|
||||
faad_prefix="")
|
||||
AC_ARG_WITH(faad-libraries,
|
||||
AS_HELP_STRING([--with-faad-libraries=DIR],
|
||||
[directory where faad2 library is installed (optional)]),,
|
||||
faad_libraries="")
|
||||
AC_ARG_WITH(faad-includes,
|
||||
AS_HELP_STRING([--with-faad-includes=DIR],
|
||||
[directory where faad2 header files are installed (optional)]),,
|
||||
faad_includes="")
|
||||
|
||||
if test x$enable_aac = xyes; then
|
||||
if test "x$faad_libraries" != "x" ; then
|
||||
FAAD_LIBS="-L$faad_libraries"
|
||||
elif test "x$faad_prefix" != "x" ; then
|
||||
FAAD_LIBS="-L$faad_prefix/lib"
|
||||
fi
|
||||
|
||||
FAAD_LIBS="$FAAD_LIBS -lfaad"
|
||||
|
||||
if test "x$faad_includes" != "x" ; then
|
||||
FAAD_CFLAGS="-I$faad_includes"
|
||||
elif test "x$faad_prefix" != "x" ; then
|
||||
FAAD_CFLAGS="-I$faad_prefix/include"
|
||||
fi
|
||||
|
||||
oldcflags=$CFLAGS
|
||||
oldlibs=$LIBS
|
||||
oldcppflags=$CPPFLAGS
|
||||
CFLAGS="$CFLAGS $MPD_CFLAGS $FAAD_CFLAGS -I."
|
||||
LIBS="$LIBS $MPD_LIBS $FAAD_LIBS"
|
||||
CPPFLAGS=$CFLAGS
|
||||
AC_CHECK_HEADER(faad.h,,enable_aac=no)
|
||||
if test x$enable_aac = xyes; then
|
||||
AC_CHECK_DECL(FAAD2_VERSION,,enable_aac=no,[#include <faad.h>])
|
||||
fi
|
||||
if test x$enable_aac = xyes; then
|
||||
AC_CHECK_DECL(faacDecInit2,,enable_aac=no,[#include <faad.h>])
|
||||
fi
|
||||
if test x$enable_aac = xyes; then
|
||||
AC_CHECK_LIB(faad,faacDecInit2,[MPD_LIBS="$MPD_LIBS $FAAD_LIBS";MPD_CFLAGS="$MPD_CFLAGS $FAAD_CFLAGS"],enable_aac=no)
|
||||
if test x$enable_aac = xno; then
|
||||
enable_aac=yes
|
||||
AC_CHECK_LIB(faad,NeAACDecInit2,[MPD_LIBS="$MPD_LIBS $FAAD_LIBS";MPD_CFLAGS="$MPD_CFLAGS $FAAD_CFLAGS"],enable_aac=no)
|
||||
fi
|
||||
fi
|
||||
if test x$enable_aac = xyes; then
|
||||
AC_MSG_CHECKING(that FAAD2 uses buffer and bufferlen)
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
|
||||
#include <faad.h>
|
||||
|
||||
int main() {
|
||||
char buffer;
|
||||
long bufferlen = 0;
|
||||
faacDecHandle decoder;
|
||||
faacDecFrameInfo frameInfo;
|
||||
faacDecConfigurationPtr config;
|
||||
unsigned char channels;
|
||||
long sampleRate;
|
||||
mp4AudioSpecificConfig mp4ASC;
|
||||
|
||||
decoder = faacDecOpen();
|
||||
config = faacDecGetCurrentConfiguration(decoder);
|
||||
config->outputFormat = FAAD_FMT_16BIT;
|
||||
faacDecSetConfiguration(decoder,config);
|
||||
AudioSpecificConfig(&buffer, bufferlen, &mp4ASC);
|
||||
faacDecInit(decoder,&buffer,bufferlen,&sampleRate,&channels);
|
||||
faacDecInit2(decoder,&buffer,bufferlen,&sampleRate,&channels);
|
||||
faacDecDecode(decoder,&frameInfo,&buffer,bufferlen);
|
||||
|
||||
return 0;
|
||||
}
|
||||
])],[AC_MSG_RESULT(yes);AC_DEFINE(HAVE_FAAD_BUFLEN_FUNCS,1,[Define if FAAD2 uses buflen in function calls])],[AC_MSG_RESULT(no);
|
||||
AC_MSG_CHECKING(that FAAD2 can even be used)
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
|
||||
#include <faad.h>
|
||||
|
||||
int main() {
|
||||
char buffer;
|
||||
faacDecHandle decoder;
|
||||
faacDecFrameInfo frameInfo;
|
||||
faacDecConfigurationPtr config;
|
||||
unsigned char channels;
|
||||
long sampleRate;
|
||||
long bufferlen = 0;
|
||||
unsigned long dummy1_32;
|
||||
unsigned char dummy2_8, dummy3_8, dummy4_8, dummy5_8, dummy6_8,
|
||||
dummy7_8, dummy8_8;
|
||||
|
||||
decoder = faacDecOpen();
|
||||
config = faacDecGetCurrentConfiguration(decoder);
|
||||
config->outputFormat = FAAD_FMT_16BIT;
|
||||
faacDecSetConfiguration(decoder,config);
|
||||
AudioSpecificConfig(&buffer,&dummy1_32,&dummy2_8,
|
||||
&dummy3_8,&dummy4_8,&dummy5_8,
|
||||
&dummy6_8,&dummy7_8,&dummy8_8);
|
||||
faacDecInit(decoder,&buffer,&sampleRate,&channels);
|
||||
faacDecInit2(decoder,&buffer,bufferlen,&sampleRate,&channels);
|
||||
faacDecDecode(decoder,&frameInfo,&buffer);
|
||||
faacDecClose(decoder);
|
||||
|
||||
return 0;
|
||||
}
|
||||
])],AC_MSG_RESULT(yes),[AC_MSG_RESULT(no);enable_aac=no])
|
||||
])
|
||||
fi
|
||||
if test x$enable_aac = xyes; then
|
||||
AC_CHECK_MEMBERS([faacDecConfiguration.downMatrix,faacDecConfiguration.dontUpSampleImplicitSBR,faacDecFrameInfo.samplerate],,,[#include <faad.h>])
|
||||
AC_DEFINE(HAVE_FAAD,1,[Define to use FAAD2 for AAC decoding])
|
||||
else
|
||||
AC_MSG_WARN([faad2 lib needed for MP4/AAC support -- disabling MP4/AAC support])
|
||||
fi
|
||||
CFLAGS=$oldcflags
|
||||
LIBS=$oldlibs
|
||||
CPPFLAGS=$oldcppflags
|
||||
fi
|
||||
|
||||
if test x$enable_aac = xyes; then
|
||||
oldcflags=$CFLAGS
|
||||
oldlibs=$LIBS
|
||||
oldcppflags=$CPPFLAGS
|
||||
CFLAGS="$CFLAGS $MPD_CFLAGS $FAAD_CFLAGS -Werror"
|
||||
LIBS="$LIBS $MPD_LIBS $FAAD_LIBS"
|
||||
CPPFLAGS=$CFLAGS
|
||||
|
||||
AC_MSG_CHECKING(for broken libfaad headers)
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
|
||||
#include <faad.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
int main() {
|
||||
unsigned char channels;
|
||||
uint32_t sample_rate;
|
||||
|
||||
faacDecInit2(NULL, NULL, 0, &sample_rate, &channels);
|
||||
return 0;
|
||||
}
|
||||
])],
|
||||
[AC_MSG_RESULT(correct)],
|
||||
[AC_MSG_RESULT(broken);
|
||||
AC_DEFINE(HAVE_FAAD_LONG, 1, [Define if faad.h uses the broken "unsigned long" pointers])])
|
||||
|
||||
CFLAGS=$oldcflags
|
||||
LIBS=$oldlibs
|
||||
CPPFLAGS=$oldcppflags
|
||||
fi
|
||||
|
||||
if test x$enable_aac = xyes; then
|
||||
enable_mp4=yes
|
||||
MP4FF_LIBS="-lmp4ff"
|
||||
|
||||
oldcflags=$CFLAGS
|
||||
oldlibs=$LIBS
|
||||
oldcppflags=$CPPFLAGS
|
||||
CFLAGS="$CFLAGS $FAAD_CFLAGS"
|
||||
LIBS="$LIBS $FAAD_LIBS $MP4FF_LIBS"
|
||||
CPPFLAGS=$CFLAGS
|
||||
|
||||
AC_CHECK_HEADER(mp4ff.h,,enable_mp4=no)
|
||||
|
||||
if test x$enable_mp4 = xyes; then
|
||||
AC_CHECK_LIB(mp4ff,mp4ff_open_read,,enable_mp4=no)
|
||||
fi
|
||||
|
||||
if test x$enable_mp4 = xyes; then
|
||||
AC_SUBST(MP4FF_LIBS)
|
||||
AC_DEFINE(HAVE_MP4, 1, [Define to use FAAD2+mp4ff for MP4 decoding])
|
||||
else
|
||||
AC_MSG_WARN([libmp4ff needed for MP4 support -- disabling MP4 support])
|
||||
unset MP4FF_LIBS
|
||||
fi
|
||||
|
||||
CFLAGS=$oldcflags
|
||||
LIBS=$oldlibs
|
||||
CPPFLAGS=$oldcppflags
|
||||
else
|
||||
enable_mp4=no
|
||||
fi
|
||||
])
|
||||
@@ -1,14 +0,0 @@
|
||||
dnl
|
||||
dnl Usage:
|
||||
dnl AC_CHECK_LIBWRAP([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||
dnl
|
||||
|
||||
AC_DEFUN([AC_CHECK_LIBWRAP],[
|
||||
AC_CHECK_HEADERS([tcpd.h],
|
||||
AC_CHECK_LIB([wrap], [request_init],
|
||||
[LIBWRAP_CFLAGS=""
|
||||
LIBWRAP_LDFLAGS="-lwrap"
|
||||
$1],
|
||||
$2),
|
||||
$2)
|
||||
])
|
||||
@@ -1,80 +0,0 @@
|
||||
AC_DEFUN([MPD_AUTO_ENABLED], [
|
||||
var="enable_$1"
|
||||
feature="$2"
|
||||
|
||||
if eval "test x`echo '$'$var` = xauto"; then
|
||||
AC_MSG_NOTICE([auto-detected $feature])
|
||||
eval "$var=yes"
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN([MPD_AUTO_DISABLED], [
|
||||
var="enable_$1"
|
||||
feature="$2"
|
||||
msg="$3"
|
||||
|
||||
if eval "test x`echo '$'$var` = xauto"; then
|
||||
AC_MSG_WARN([$msg -- disabling $feature])
|
||||
eval "$var=no"
|
||||
elif eval "test x`echo '$'$var` = xyes"; then
|
||||
AC_MSG_ERROR([$feature: $msg])
|
||||
fi
|
||||
])
|
||||
|
||||
dnl Check whether a prerequisite for a feature was found. This is
|
||||
dnl very similar to MPD_AUTO_RESULT, but does not finalize the
|
||||
dnl detection; it assumes that more checks will follow.
|
||||
AC_DEFUN([MPD_AUTO_PRE], [
|
||||
name="$1"
|
||||
var="enable_$1"
|
||||
found="found_$name"
|
||||
feature="$2"
|
||||
msg="$3"
|
||||
|
||||
if eval "test x`echo '$'$var` != xno" && eval "test x`echo '$'$found` = xno"; then
|
||||
MPD_AUTO_DISABLED([$name], [$feature], [$msg])
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN([MPD_AUTO_RESULT], [
|
||||
name="$1"
|
||||
var="enable_$1"
|
||||
found="found_$name"
|
||||
feature="$2"
|
||||
msg="$3"
|
||||
|
||||
if eval "test x`echo '$'$var` = xno"; then
|
||||
eval "$found=no"
|
||||
fi
|
||||
|
||||
if eval "test x`echo '$'$found` = xyes"; then
|
||||
MPD_AUTO_ENABLED([$name], [$feature])
|
||||
else
|
||||
MPD_AUTO_DISABLED([$name], [$feature], [$msg])
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN([MPD_AUTO_PKG], [
|
||||
if eval "test x`echo '$'enable_$1` != xno"; then
|
||||
PKG_CHECK_MODULES([$2], [$3],
|
||||
[eval "found_$1=yes"],
|
||||
[eval "found_$1=no"])
|
||||
fi
|
||||
|
||||
MPD_AUTO_RESULT([$1], [$4], [$5])
|
||||
])
|
||||
|
||||
dnl Check with pkg-config first, fall back to AC_CHECK_LIB.
|
||||
dnl
|
||||
dnl Parameters: varname1, varname2, pkgname, libname, symname, libs, cflags, description, errmsg
|
||||
AC_DEFUN([MPD_AUTO_PKG_LIB], [
|
||||
if eval "test x`echo '$'enable_$1` != xno"; then
|
||||
PKG_CHECK_MODULES([$2], [$3],
|
||||
[eval "found_$1=yes"],
|
||||
AC_CHECK_LIB($4, $5,
|
||||
[eval "found_$1=yes $2_LIBS='$6' $2_CFLAGS='$7'"],
|
||||
[eval "found_$1=no"]))
|
||||
fi
|
||||
|
||||
MPD_AUTO_RESULT([$1], [$8], [$9])
|
||||
])
|
||||
@@ -1,18 +0,0 @@
|
||||
AC_DEFUN([MPD_CHECK_FLAG],[
|
||||
var=`echo "$1" | tr "=-" "__"`
|
||||
AC_CACHE_CHECK([whether the C compiler accepts $1],
|
||||
[mpd_check_cflag_$var],[
|
||||
save_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS $1"
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
|
||||
int main(void) { return 0; }
|
||||
])], [ eval "mpd_check_cflag_$var=yes"
|
||||
], [ eval "mpd_check_cflag_$var=no" ])
|
||||
CFLAGS="$save_CFLAGS"
|
||||
])
|
||||
if eval "test x`echo '$mpd_check_cflag_'$var` = xyes"
|
||||
then
|
||||
AM_CFLAGS="$AM_CFLAGS $1"
|
||||
fi
|
||||
])
|
||||
])
|
||||
157
m4/pkg.m4
157
m4/pkg.m4
@@ -1,157 +0,0 @@
|
||||
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
|
||||
#
|
||||
# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# PKG_PROG_PKG_CONFIG([MIN-VERSION])
|
||||
# ----------------------------------
|
||||
AC_DEFUN([PKG_PROG_PKG_CONFIG],
|
||||
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
|
||||
m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
|
||||
AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
|
||||
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
|
||||
AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
|
||||
fi
|
||||
if test -n "$PKG_CONFIG"; then
|
||||
_pkg_min_version=m4_default([$1], [0.9.0])
|
||||
AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
PKG_CONFIG=""
|
||||
fi
|
||||
|
||||
fi[]dnl
|
||||
])# PKG_PROG_PKG_CONFIG
|
||||
|
||||
# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||
#
|
||||
# Check to see whether a particular set of modules exists. Similar
|
||||
# to PKG_CHECK_MODULES(), but does not set variables or print errors.
|
||||
#
|
||||
#
|
||||
# Similar to PKG_CHECK_MODULES, make sure that the first instance of
|
||||
# this or PKG_CHECK_MODULES is called, or make sure to call
|
||||
# PKG_CHECK_EXISTS manually
|
||||
# --------------------------------------------------------------
|
||||
AC_DEFUN([PKG_CHECK_EXISTS],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||
if test -n "$PKG_CONFIG" && \
|
||||
AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
|
||||
m4_ifval([$2], [$2], [:])
|
||||
m4_ifvaln([$3], [else
|
||||
$3])dnl
|
||||
fi])
|
||||
|
||||
|
||||
# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
|
||||
# ---------------------------------------------
|
||||
m4_define([_PKG_CONFIG],
|
||||
[if test -n "$PKG_CONFIG"; then
|
||||
if test -n "$$1"; then
|
||||
pkg_cv_[]$1="$$1"
|
||||
else
|
||||
PKG_CHECK_EXISTS([$3],
|
||||
[pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
|
||||
[pkg_failed=yes])
|
||||
fi
|
||||
else
|
||||
pkg_failed=untried
|
||||
fi[]dnl
|
||||
])# _PKG_CONFIG
|
||||
|
||||
# _PKG_SHORT_ERRORS_SUPPORTED
|
||||
# -----------------------------
|
||||
AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
_pkg_short_errors_supported=yes
|
||||
else
|
||||
_pkg_short_errors_supported=no
|
||||
fi[]dnl
|
||||
])# _PKG_SHORT_ERRORS_SUPPORTED
|
||||
|
||||
|
||||
# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
|
||||
# [ACTION-IF-NOT-FOUND])
|
||||
#
|
||||
#
|
||||
# Note that if there is a possibility the first call to
|
||||
# PKG_CHECK_MODULES might not happen, you should be sure to include an
|
||||
# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
|
||||
#
|
||||
#
|
||||
# --------------------------------------------------------------
|
||||
AC_DEFUN([PKG_CHECK_MODULES],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||
AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
|
||||
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
|
||||
|
||||
pkg_failed=no
|
||||
AC_MSG_CHECKING([for $1])
|
||||
|
||||
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
|
||||
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
|
||||
|
||||
m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
|
||||
and $1[]_LIBS to avoid the need to call pkg-config.
|
||||
See the pkg-config man page for more details.])
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
_PKG_SHORT_ERRORS_SUPPORTED
|
||||
if test $_pkg_short_errors_supported = yes; then
|
||||
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
|
||||
else
|
||||
$1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
|
||||
fi
|
||||
# Put the nasty error message in config.log where it belongs
|
||||
echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
|
||||
|
||||
ifelse([$4], , [AC_MSG_ERROR(dnl
|
||||
[Package requirements ($2) were not met:
|
||||
|
||||
$$1_PKG_ERRORS
|
||||
|
||||
Consider adjusting the PKG_CONFIG_PATH environment variable if you
|
||||
installed software in a non-standard prefix.
|
||||
|
||||
_PKG_TEXT
|
||||
])],
|
||||
[AC_MSG_RESULT([no])
|
||||
$4])
|
||||
elif test $pkg_failed = untried; then
|
||||
ifelse([$4], , [AC_MSG_FAILURE(dnl
|
||||
[The pkg-config script could not be found or is too old. Make sure it
|
||||
is in your PATH or set the PKG_CONFIG environment variable to the full
|
||||
path to pkg-config.
|
||||
|
||||
_PKG_TEXT
|
||||
|
||||
To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.])],
|
||||
[$4])
|
||||
else
|
||||
$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
|
||||
$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
|
||||
AC_MSG_RESULT([yes])
|
||||
ifelse([$3], , :, [$3])
|
||||
fi[]dnl
|
||||
])# PKG_CHECK_MODULES
|
||||
@@ -1,19 +0,0 @@
|
||||
AC_DEFUN([results], [
|
||||
dnl This is a hack to allow "with" names, otherwise "enable".
|
||||
num=`expr $1 : 'with'`
|
||||
if test "$num" != "0"; then
|
||||
var="`echo '$'$1`"
|
||||
else
|
||||
var="`echo '$'enable_$1`"
|
||||
fi
|
||||
|
||||
printf '('
|
||||
if eval "test x$var = xyes"; then
|
||||
printf '+'
|
||||
elif test -n "$3" && eval "test x$var = x$3"; then
|
||||
printf '+'
|
||||
else
|
||||
printf '-'
|
||||
fi
|
||||
printf '%s) ' "$2"
|
||||
])
|
||||
32
m4/ucred.m4
32
m4/ucred.m4
@@ -1,32 +0,0 @@
|
||||
# Check if "struct ucred" is available. If not, try harder with
|
||||
# _GNU_SOURCE.
|
||||
#
|
||||
# Author: Max Kellermann <max@duempel.org>
|
||||
|
||||
AC_DEFUN([STRUCT_UCRED],[
|
||||
AC_MSG_CHECKING([for struct ucred])
|
||||
AC_CACHE_VAL(mpd_cv_have_struct_ucred, [
|
||||
AC_TRY_COMPILE([#include <sys/socket.h>],
|
||||
[struct ucred cred;],
|
||||
mpd_cv_have_struct_ucred=yes,
|
||||
mpd_cv_have_struct_ucred=no)
|
||||
if test x$mpd_cv_have_struct_ucred = xno; then
|
||||
# glibc 2.8 forces _GNU_SOURCE on us
|
||||
AC_TRY_COMPILE(
|
||||
[#define _GNU_SOURCE
|
||||
#include <sys/socket.h>],
|
||||
[struct ucred cred;],
|
||||
mpd_cv_have_struct_ucred=yes,
|
||||
mpd_cv_have_struct_ucred=no)
|
||||
if test x$mpd_cv_have_struct_ucred = xyes; then
|
||||
# :(
|
||||
MPD_CFLAGS="$MPD_CFLAGS -D_GNU_SOURCE"
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
AC_MSG_RESULT($mpd_cv_have_struct_ucred)
|
||||
if test x$mpd_cv_have_struct_ucred = xyes; then
|
||||
AC_DEFINE(HAVE_STRUCT_UCRED, 1, [Define if struct ucred is present from sys/socket.h])
|
||||
fi
|
||||
])
|
||||
472
meson.build
Normal file
472
meson.build
Normal file
@@ -0,0 +1,472 @@
|
||||
project(
|
||||
'mpd',
|
||||
['c', 'cpp'],
|
||||
version: '0.21.3',
|
||||
meson_version: '>= 0.47.2',
|
||||
default_options: [
|
||||
'c_std=c99',
|
||||
'cpp_std=c++14'
|
||||
],
|
||||
license: 'GPLv2+',
|
||||
)
|
||||
|
||||
version_cxx = vcs_tag(input: 'src/GitVersion.cxx', output: 'GitVersion.cxx')
|
||||
|
||||
compiler = meson.get_compiler('cpp')
|
||||
c_compiler = meson.get_compiler('c')
|
||||
|
||||
conf = configuration_data()
|
||||
conf.set_quoted('PACKAGE', meson.project_name())
|
||||
conf.set_quoted('PACKAGE_NAME', meson.project_name())
|
||||
conf.set_quoted('PACKAGE_VERSION', meson.project_version())
|
||||
conf.set_quoted('VERSION', meson.project_version())
|
||||
conf.set_quoted('PROTOCOL_VERSION', '0.21.0')
|
||||
conf.set_quoted('SYSTEM_CONFIG_FILE_LOCATION', join_paths(get_option('prefix'), get_option('sysconfdir'), 'mpd.conf'))
|
||||
|
||||
common_cppflags = [
|
||||
'-D_GNU_SOURCE',
|
||||
]
|
||||
|
||||
common_cflags = [
|
||||
]
|
||||
|
||||
common_cxxflags = [
|
||||
]
|
||||
|
||||
test_common_flags = [
|
||||
'-Wall',
|
||||
'-Wextra',
|
||||
|
||||
'-fvisibility=hidden',
|
||||
|
||||
'-ffast-math',
|
||||
'-ftree-vectorize',
|
||||
]
|
||||
|
||||
test_cxxflags = test_common_flags + [
|
||||
'-fno-threadsafe-statics',
|
||||
'-fmerge-all-constants',
|
||||
|
||||
'-Wmissing-declarations',
|
||||
'-Wshadow',
|
||||
'-Wpointer-arith',
|
||||
'-Wcast-qual',
|
||||
'-Wwrite-strings',
|
||||
'-Wsign-compare',
|
||||
|
||||
'-Wno-non-virtual-dtor',
|
||||
|
||||
# work around bogus GCC7 warning "mangled name for ... will change
|
||||
# in C++17 because the exception specification is part of a function
|
||||
# type"
|
||||
'-Wno-noexcept-type',
|
||||
]
|
||||
|
||||
if compiler.get_id() == 'clang'
|
||||
# Workaround for clang bug
|
||||
# https://bugs.llvm.org/show_bug.cgi?id=32611
|
||||
test_cxxflags += '-funwind-tables'
|
||||
endif
|
||||
|
||||
test_cflags = test_common_flags + [
|
||||
'-Wmissing-prototypes',
|
||||
'-Wshadow',
|
||||
'-Wpointer-arith',
|
||||
'-Wstrict-prototypes',
|
||||
'-Wcast-qual',
|
||||
'-Wwrite-strings',
|
||||
'-pedantic',
|
||||
]
|
||||
|
||||
test_ldflags = [
|
||||
]
|
||||
|
||||
if get_option('buildtype') != 'debug'
|
||||
test_cflags += [
|
||||
'-ffunction-sections',
|
||||
'-fdata-sections',
|
||||
]
|
||||
test_ldflags += [
|
||||
'-Wl,--gc-sections',
|
||||
]
|
||||
endif
|
||||
|
||||
add_global_arguments(common_cxxflags + compiler.get_supported_arguments(test_cxxflags), language: 'cpp')
|
||||
add_global_arguments(common_cflags + c_compiler.get_supported_arguments(test_cflags), language: 'c')
|
||||
add_global_link_arguments(compiler.get_supported_link_arguments(test_ldflags), language: 'cpp')
|
||||
|
||||
is_linux = host_machine.system() == 'linux'
|
||||
is_android = get_option('android_ndk') != ''
|
||||
is_darwin = host_machine.system() == 'darwin'
|
||||
is_windows = host_machine.system() == 'windows'
|
||||
is_haiku = host_machine.system() == 'haiku' # TODO is this correct?
|
||||
|
||||
if is_android
|
||||
common_cppflags += '-DANDROID'
|
||||
endif
|
||||
|
||||
if is_windows
|
||||
common_cppflags += [
|
||||
'-DWIN32_LEAN_AND_MEAN',
|
||||
'-DWINVER=0x0600', '-D_WIN32_WINNT=0x0600',
|
||||
'-DSTRICT',
|
||||
'-DUNICODE', '-D_UNICODE',
|
||||
]
|
||||
|
||||
subdir('win32')
|
||||
endif
|
||||
|
||||
if is_android
|
||||
subdir('android')
|
||||
endif
|
||||
|
||||
add_global_arguments(common_cppflags, language: 'c')
|
||||
add_global_arguments(common_cppflags, language: 'cpp')
|
||||
|
||||
enable_daemon = not is_windows and not is_android and get_option('daemon')
|
||||
conf.set('ENABLE_DAEMON', enable_daemon)
|
||||
|
||||
conf.set('HAVE_LOCALE_H', compiler.has_header('locale.h'))
|
||||
|
||||
conf.set('HAVE_GETPWNAM_R', compiler.has_function('getpwnam_r'))
|
||||
conf.set('HAVE_GETPWUID_R', compiler.has_function('getpwuid_r'))
|
||||
conf.set('HAVE_INITGROUPS', compiler.has_function('initgroups'))
|
||||
conf.set('HAVE_FNMATCH', compiler.has_function('fnmatch'))
|
||||
conf.set('HAVE_STRNDUP', compiler.has_function('strndup', prefix: '#define _GNU_SOURCE\n#include <string.h>'))
|
||||
conf.set('HAVE_STRCASESTR', compiler.has_function('strcasestr'))
|
||||
|
||||
conf.set('HAVE_PRCTL', is_linux)
|
||||
|
||||
conf.set('USE_EVENTFD', is_linux and get_option('eventfd'))
|
||||
conf.set('USE_SIGNALFD', is_linux and get_option('signalfd'))
|
||||
|
||||
if is_windows
|
||||
conf.set('USE_WINSELECT', true)
|
||||
elif is_linux and get_option('epoll')
|
||||
conf.set('USE_EPOLL', true)
|
||||
else
|
||||
conf.set('USE_POLL', true)
|
||||
endif
|
||||
|
||||
if not get_option('syslog').disabled()
|
||||
if compiler.has_function('syslog')
|
||||
conf.set('HAVE_SYSLOG', true)
|
||||
elif get_option('syslog').enabled()
|
||||
error('syslog() not found')
|
||||
endif
|
||||
endif
|
||||
|
||||
enable_database = get_option('database')
|
||||
conf.set('ENABLE_DATABASE', enable_database)
|
||||
|
||||
enable_inotify = get_option('inotify') and is_linux and enable_database
|
||||
conf.set('ENABLE_INOTIFY', enable_inotify)
|
||||
|
||||
conf.set('ENABLE_DSD', get_option('dsd'))
|
||||
|
||||
inc = include_directories(
|
||||
'src',
|
||||
|
||||
# for the generated config.h
|
||||
'.',
|
||||
)
|
||||
|
||||
boost_dep = dependency('boost', version: '>= 1.58')
|
||||
if boost_dep.version() == '1.67'
|
||||
# https://github.com/MusicPlayerDaemon/MPD/pull/384
|
||||
# https://github.com/boostorg/lockfree/commit/12726cda009a855073b9bedbdce57b6ce7763da2
|
||||
warning('Your Boost version 1.67 is known to be buggy, and the MPD build will fail. Please upgrade to Boost 1.68 or later.')
|
||||
endif
|
||||
|
||||
sources = [
|
||||
version_cxx,
|
||||
'src/Main.cxx',
|
||||
'src/protocol/Ack.cxx',
|
||||
'src/protocol/ArgParser.cxx',
|
||||
'src/protocol/Result.cxx',
|
||||
'src/command/CommandError.cxx',
|
||||
'src/command/AllCommands.cxx',
|
||||
'src/command/QueueCommands.cxx',
|
||||
'src/command/TagCommands.cxx',
|
||||
'src/command/PlayerCommands.cxx',
|
||||
'src/command/PlaylistCommands.cxx',
|
||||
'src/command/FileCommands.cxx',
|
||||
'src/command/OutputCommands.cxx',
|
||||
'src/command/MessageCommands.cxx',
|
||||
'src/command/ClientCommands.cxx',
|
||||
'src/command/PartitionCommands.cxx',
|
||||
'src/command/OtherCommands.cxx',
|
||||
'src/command/CommandListBuilder.cxx',
|
||||
'src/Idle.cxx',
|
||||
'src/IdleFlags.cxx',
|
||||
'src/decoder/Domain.cxx',
|
||||
'src/decoder/Thread.cxx',
|
||||
'src/decoder/Control.cxx',
|
||||
'src/decoder/Bridge.cxx',
|
||||
'src/decoder/DecoderPrint.cxx',
|
||||
'src/client/Listener.cxx',
|
||||
'src/client/Client.cxx',
|
||||
'src/client/ClientEvent.cxx',
|
||||
'src/client/ClientExpire.cxx',
|
||||
'src/client/ClientGlobal.cxx',
|
||||
'src/client/ClientIdle.cxx',
|
||||
'src/client/ClientList.cxx',
|
||||
'src/client/ClientNew.cxx',
|
||||
'src/client/ClientProcess.cxx',
|
||||
'src/client/ClientRead.cxx',
|
||||
'src/client/ClientWrite.cxx',
|
||||
'src/client/ClientMessage.cxx',
|
||||
'src/client/ClientSubscribe.cxx',
|
||||
'src/client/ClientFile.cxx',
|
||||
'src/client/Response.cxx',
|
||||
'src/Listen.cxx',
|
||||
'src/LogInit.cxx',
|
||||
'src/LogBackend.cxx',
|
||||
'src/Log.cxx',
|
||||
'src/ls.cxx',
|
||||
'src/Instance.cxx',
|
||||
'src/win32/Win32Main.cxx',
|
||||
'src/MusicBuffer.cxx',
|
||||
'src/MusicPipe.cxx',
|
||||
'src/MusicChunk.cxx',
|
||||
'src/MusicChunkPtr.cxx',
|
||||
'src/Mapper.cxx',
|
||||
'src/Partition.cxx',
|
||||
'src/Permission.cxx',
|
||||
'src/player/CrossFade.cxx',
|
||||
'src/player/Thread.cxx',
|
||||
'src/player/Control.cxx',
|
||||
'src/PlaylistError.cxx',
|
||||
'src/PlaylistPrint.cxx',
|
||||
'src/PlaylistSave.cxx',
|
||||
'src/playlist/PlaylistStream.cxx',
|
||||
'src/playlist/PlaylistMapper.cxx',
|
||||
'src/playlist/PlaylistAny.cxx',
|
||||
'src/playlist/PlaylistSong.cxx',
|
||||
'src/playlist/PlaylistQueue.cxx',
|
||||
'src/playlist/Print.cxx',
|
||||
'src/db/PlaylistVector.cxx',
|
||||
'src/queue/Queue.cxx',
|
||||
'src/queue/QueuePrint.cxx',
|
||||
'src/queue/QueueSave.cxx',
|
||||
'src/queue/Playlist.cxx',
|
||||
'src/queue/PlaylistControl.cxx',
|
||||
'src/queue/PlaylistEdit.cxx',
|
||||
'src/queue/PlaylistTag.cxx',
|
||||
'src/queue/PlaylistState.cxx',
|
||||
'src/ReplayGainGlobal.cxx',
|
||||
'src/LocateUri.cxx',
|
||||
'src/SongUpdate.cxx',
|
||||
'src/SongLoader.cxx',
|
||||
'src/SongPrint.cxx',
|
||||
'src/SongSave.cxx',
|
||||
'src/StateFile.cxx',
|
||||
'src/StateFileConfig.cxx',
|
||||
'src/Stats.cxx',
|
||||
'src/TagPrint.cxx',
|
||||
'src/TagSave.cxx',
|
||||
'src/TagFile.cxx',
|
||||
'src/TagStream.cxx',
|
||||
'src/TimePrint.cxx',
|
||||
'src/mixer/Volume.cxx',
|
||||
'src/PlaylistFile.cxx',
|
||||
]
|
||||
|
||||
if not is_android
|
||||
sources += [
|
||||
'src/CommandLine.cxx',
|
||||
'src/unix/SignalHandlers.cxx',
|
||||
]
|
||||
else
|
||||
sources += [
|
||||
'src/android/Context.cxx',
|
||||
'src/android/Environment.cxx',
|
||||
'src/android/LogListener.cxx',
|
||||
]
|
||||
endif
|
||||
|
||||
if enable_daemon
|
||||
sources += 'src/unix/Daemon.cxx'
|
||||
endif
|
||||
|
||||
if enable_database
|
||||
sources += [
|
||||
'src/queue/PlaylistUpdate.cxx',
|
||||
'src/command/StorageCommands.cxx',
|
||||
'src/command/DatabaseCommands.cxx',
|
||||
]
|
||||
endif
|
||||
|
||||
subdir('src/util')
|
||||
subdir('src/system')
|
||||
subdir('src/thread')
|
||||
subdir('src/event')
|
||||
|
||||
subdir('src/lib/dbus')
|
||||
subdir('src/lib/icu')
|
||||
subdir('src/lib/smbclient')
|
||||
subdir('src/lib/zlib')
|
||||
|
||||
subdir('src/lib/alsa')
|
||||
subdir('src/lib/curl')
|
||||
subdir('src/lib/expat')
|
||||
subdir('src/lib/ffmpeg')
|
||||
subdir('src/lib/gcrypt')
|
||||
subdir('src/lib/wrap')
|
||||
subdir('src/lib/nfs')
|
||||
subdir('src/lib/oss')
|
||||
subdir('src/lib/pcre')
|
||||
subdir('src/lib/pulse')
|
||||
subdir('src/lib/sndio')
|
||||
subdir('src/lib/sqlite')
|
||||
subdir('src/lib/systemd')
|
||||
subdir('src/lib/upnp')
|
||||
subdir('src/lib/yajl')
|
||||
|
||||
subdir('src/fs')
|
||||
subdir('src/config')
|
||||
subdir('src/net')
|
||||
subdir('src/tag')
|
||||
subdir('src/pcm')
|
||||
subdir('src/neighbor')
|
||||
subdir('src/input')
|
||||
subdir('src/archive')
|
||||
subdir('src/filter')
|
||||
subdir('src/mixer')
|
||||
subdir('src/output')
|
||||
subdir('src/lib/xiph')
|
||||
subdir('src/decoder')
|
||||
subdir('src/encoder')
|
||||
subdir('src/song')
|
||||
subdir('src/playlist')
|
||||
subdir('src/zeroconf')
|
||||
|
||||
if curl_dep.found()
|
||||
sources += 'src/RemoteTagCache.cxx'
|
||||
endif
|
||||
|
||||
if sqlite_dep.found()
|
||||
sources += [
|
||||
'src/command/StickerCommands.cxx',
|
||||
'src/sticker/StickerDatabase.cxx',
|
||||
'src/sticker/StickerPrint.cxx',
|
||||
'src/sticker/SongSticker.cxx',
|
||||
]
|
||||
endif
|
||||
|
||||
basic = static_library(
|
||||
'basic',
|
||||
'src/ReplayGainInfo.cxx',
|
||||
'src/ReplayGainMode.cxx',
|
||||
'src/SingleMode.cxx',
|
||||
include_directories: inc,
|
||||
)
|
||||
|
||||
basic_dep = declare_dependency(
|
||||
link_with: basic,
|
||||
)
|
||||
|
||||
if enable_database
|
||||
subdir('src/storage')
|
||||
subdir('src/db')
|
||||
endif
|
||||
|
||||
if neighbor_glue_dep.found()
|
||||
sources += 'src/command/NeighborCommands.cxx'
|
||||
endif
|
||||
|
||||
if archive_glue_dep.found()
|
||||
sources += [
|
||||
'src/TagArchive.cxx',
|
||||
'src/db/update/Archive.cxx',
|
||||
]
|
||||
endif
|
||||
|
||||
if is_windows
|
||||
sources += windows_resources
|
||||
endif
|
||||
|
||||
link_args = []
|
||||
more_deps = []
|
||||
if is_android
|
||||
subdir('src/java')
|
||||
target_type = 'shared_library'
|
||||
link_args += [
|
||||
'-Wl,--no-undefined,-shared,-Bsymbolic',
|
||||
'-llog',
|
||||
'-lz',
|
||||
]
|
||||
more_deps += [
|
||||
declare_dependency(sources: [classes_jar]),
|
||||
java_dep,
|
||||
]
|
||||
else
|
||||
target_type = 'executable'
|
||||
endif
|
||||
|
||||
mpd = build_target(
|
||||
'mpd',
|
||||
sources,
|
||||
target_type: target_type,
|
||||
include_directories: inc,
|
||||
dependencies: [
|
||||
basic_dep,
|
||||
config_dep,
|
||||
dbus_dep,
|
||||
fs_dep,
|
||||
net_dep,
|
||||
util_dep,
|
||||
event_dep,
|
||||
thread_dep,
|
||||
neighbor_glue_dep,
|
||||
input_glue_dep,
|
||||
archive_glue_dep,
|
||||
output_glue_dep,
|
||||
mixer_glue_dep,
|
||||
decoder_glue_dep,
|
||||
encoder_glue_dep,
|
||||
playlist_glue_dep,
|
||||
db_glue_dep,
|
||||
storage_glue_dep,
|
||||
song_dep,
|
||||
systemd_dep,
|
||||
sqlite_dep,
|
||||
zeroconf_dep,
|
||||
libwrap_dep,
|
||||
more_deps,
|
||||
],
|
||||
link_args: link_args,
|
||||
install: not is_android and not is_haiku,
|
||||
)
|
||||
|
||||
if is_android
|
||||
subdir('android/apk')
|
||||
endif
|
||||
|
||||
if is_haiku
|
||||
subdir('src/haiku')
|
||||
endif
|
||||
|
||||
configure_file(output: 'config.h', configuration: conf)
|
||||
|
||||
if systemd_dep.found()
|
||||
subdir('systemd')
|
||||
endif
|
||||
|
||||
install_data(
|
||||
'mpd.svg',
|
||||
install_dir: join_paths(get_option('datadir'), 'icons', 'hicolor', 'scalable', 'apps'),
|
||||
)
|
||||
|
||||
install_data(
|
||||
'AUTHORS', 'COPYING', 'NEWS', 'README.md',
|
||||
install_dir: join_paths(get_option('datadir'), 'doc', meson.project_name()),
|
||||
)
|
||||
|
||||
if get_option('documentation')
|
||||
subdir('doc')
|
||||
endif
|
||||
|
||||
if get_option('test')
|
||||
subdir('test')
|
||||
endif
|
||||
187
meson_options.txt
Normal file
187
meson_options.txt
Normal file
@@ -0,0 +1,187 @@
|
||||
option('documentation', type: 'boolean', value: false, description: 'Build documentation')
|
||||
|
||||
option('test', type: 'boolean', value: false, description: 'Build the unit tests and debug programs')
|
||||
|
||||
option('syslog', type: 'feature', description: 'syslog support')
|
||||
option('inotify', type: 'boolean', value: true, description: 'inotify support (for automatic database update)')
|
||||
|
||||
option('daemon', type: 'boolean', value: true, description: 'enable daemonization')
|
||||
option('systemd', type: 'feature', description: 'systemd support')
|
||||
|
||||
option('systemd_system_unit_dir', type: 'string', description: 'systemd system service directory')
|
||||
option('systemd_user_unit_dir', type: 'string', description: 'systemd user service directory')
|
||||
|
||||
#
|
||||
# Android
|
||||
#
|
||||
|
||||
option('android_sdk', type: 'string', description: 'The path where Android SDK is installed')
|
||||
option('android_ndk', type: 'string', description: 'The path where Android NDK is installed')
|
||||
option('android_abi', type: 'string', value: 'armeabi-v7a', description: 'The Android ABI to be built')
|
||||
|
||||
option('android_strip', type: 'string', value: 'strip', description: 'The "strip" tool from the NDK')
|
||||
|
||||
option('android_debug_keystore', type: 'string', description: 'The keystore file used to sign debug APK files')
|
||||
|
||||
option('android_keystore', type: 'string', description: 'The keystore file used to sign APK files')
|
||||
option('android_keyalias', type: 'string', description: 'The key alias used to sign APK files')
|
||||
option('android_keypass', type: 'string', description: 'The password of the keystore used to sign APK files')
|
||||
|
||||
#
|
||||
# System call support
|
||||
#
|
||||
|
||||
option('epoll', type: 'boolean', value: true, description: 'Use epoll on Linux')
|
||||
option('eventfd', type: 'boolean', value: true, description: 'Use eventfd() on Linux')
|
||||
option('signalfd', type: 'boolean', value: true, description: 'Use signalfd() on Linux')
|
||||
|
||||
#
|
||||
# Network support
|
||||
#
|
||||
|
||||
option('tcp', type: 'boolean', value: true, description: 'Support for clients connecting via TCP')
|
||||
option('ipv6', type: 'feature', description: 'Support for IPv6')
|
||||
option('local_socket', type: 'boolean', value: true, description: 'Support for clients connecting via local sockets')
|
||||
|
||||
#
|
||||
# Audio formats
|
||||
#
|
||||
|
||||
option('dsd', type: 'boolean', value: true, description: 'Support the DSD audio format')
|
||||
|
||||
#
|
||||
# Database plugins
|
||||
#
|
||||
|
||||
option('database', type: 'boolean', value: true, description: 'enable support for the music database')
|
||||
option('upnp', type: 'feature', description: 'UPnP client support')
|
||||
option('libmpdclient', type: 'feature', description: 'libmpdclient support (for the proxy database plugin)')
|
||||
|
||||
#
|
||||
# Neighbor plugins
|
||||
#
|
||||
|
||||
option('neighbor', type: 'boolean', value: true, description: 'enable support for neighbor discovery')
|
||||
|
||||
#
|
||||
# Storage plugins
|
||||
#
|
||||
|
||||
option('udisks', type: 'feature', description: 'Support for removable media using udisks2')
|
||||
option('webdav', type: 'feature', description: 'WebDAV support using CURL and Expat')
|
||||
|
||||
#
|
||||
# Playlist plugins
|
||||
#
|
||||
|
||||
option('cue', type: 'boolean', value: true, description: 'CUE sheet support')
|
||||
|
||||
#
|
||||
# Input plugins
|
||||
#
|
||||
|
||||
option('cdio_paranoia', type: 'feature', description: 'libcdio_paranoia input plugin')
|
||||
option('curl', type: 'feature', description: 'HTTP client using CURL')
|
||||
option('mms', type: 'feature', description: 'MMS protocol support using libmms')
|
||||
option('nfs', type: 'feature', description: 'NFS protocol support using libnfs')
|
||||
option('smbclient', type: 'feature', description: 'SMB support using libsmbclient')
|
||||
|
||||
#
|
||||
# Commercial services
|
||||
#
|
||||
|
||||
option('qobuz', type: 'feature', description: 'Qobuz client')
|
||||
option('soundcloud', type: 'feature', description: 'SoundCloud client')
|
||||
option('tidal', type: 'feature', description: 'Tidal client')
|
||||
|
||||
#
|
||||
# Archive plugins
|
||||
#
|
||||
|
||||
option('bzip2', type: 'feature', description: 'bzip2 support using libbz2')
|
||||
option('iso9660', type: 'feature', description: 'ISO9660 support using libiso9660')
|
||||
option('zzip', type: 'feature', description: 'ZIP support using zziplib')
|
||||
|
||||
#
|
||||
# Tag plugins
|
||||
#
|
||||
|
||||
option('id3tag', type: 'feature', description: 'ID3 support using libid3tag')
|
||||
option('chromaprint', type: 'feature', description: 'ChromaPrint / AcoustID support')
|
||||
|
||||
#
|
||||
# Decoder plugins
|
||||
#
|
||||
|
||||
option('adplug', type: 'feature', description: 'AdPlug decoder plugin')
|
||||
option('audiofile', type: 'feature', description: 'libaudiofile decoder plugin')
|
||||
option('faad', type: 'feature', description: 'AAC decoder using libfaad')
|
||||
option('ffmpeg', type: 'feature', description: 'FFmpeg codec support')
|
||||
option('flac', type: 'feature', description: 'FLAC decoder plugin')
|
||||
option('fluidsynth', type: 'feature', description: 'fluidsynth MIDI decoder plugin')
|
||||
option('gme', type: 'feature', description: 'Game Music Emulator decoder plugin')
|
||||
option('mad', type: 'feature', description: 'MP3 decoder using libmad')
|
||||
option('mikmod', type: 'feature', description: 'MikMod decoder plugin')
|
||||
option('modplug', type: 'feature', description: 'Modplug decoder plugin')
|
||||
option('mpcdec', type: 'feature', description: 'Musepack decoder plugin')
|
||||
option('mpg123', type: 'feature', description: 'MP3 decoder using libmpg123')
|
||||
option('opus', type: 'feature', description: 'Opus decoder plugin')
|
||||
option('sidplay', type: 'feature', description: 'C64 SID support via libsidplayfp or libsidplay2')
|
||||
option('sndfile', type: 'feature', description: 'libsndfile decoder plugin')
|
||||
option('vorbis', type: 'feature', description: 'Vorbis decoder plugin')
|
||||
option('wavpack', type: 'feature', description: 'WavPack decoder plugin')
|
||||
option('wildmidi', type: 'feature', description: 'WildMidi decoder plugin')
|
||||
|
||||
#
|
||||
# Encoder plugins
|
||||
#
|
||||
|
||||
option('vorbisenc', type: 'feature', description: 'Vorbis encoder plugin')
|
||||
option('lame', type: 'feature', description: 'LAME MP3 encoder plugin')
|
||||
option('twolame', type: 'feature', description: 'TwoLAME MP2 encoder plugin')
|
||||
option('shine', type: 'feature', description: 'shine MP3 encoder plugin')
|
||||
option('wave_encoder', type: 'boolean', value: true, description: 'PCM wave encoder encoder plugin')
|
||||
|
||||
#
|
||||
# Filter plugins
|
||||
#
|
||||
|
||||
option('libsamplerate', type: 'feature', description: 'libsamplerate resampler')
|
||||
option('soxr', type: 'feature', description: 'libsoxr resampler')
|
||||
|
||||
#
|
||||
# Output plugins
|
||||
#
|
||||
|
||||
option('alsa', type: 'feature', description: 'ALSA support')
|
||||
option('ao', type: 'feature', description: 'libao output plugin')
|
||||
option('fifo', type: 'boolean', value: true, description: 'FIFO output plugin')
|
||||
option('httpd', type: 'boolean', value: true, description: 'HTTP streaming output plugin')
|
||||
option('jack', type: 'feature', description: 'JACK output plugin')
|
||||
option('openal', type: 'feature', description: 'OpenAL output plugin')
|
||||
option('oss', type: 'feature', description: 'Open Sound System support')
|
||||
option('pipe', type: 'boolean', value: true, description: 'Pipe output plugin')
|
||||
option('pulse', type: 'feature', description: 'PulseAudio support')
|
||||
option('recorder', type: 'boolean', value: true, description: 'Recorder output plugin')
|
||||
option('shout', type: 'feature', description: 'Shoutcast streaming support using libshout')
|
||||
option('sndio', type: 'feature', description: 'sndio output plugin')
|
||||
option('solaris_output', type: 'feature', description: 'Solaris /dev/audio support')
|
||||
|
||||
#
|
||||
# Misc libraries
|
||||
#
|
||||
|
||||
option('dbus', type: 'feature', description: 'D-Bus support')
|
||||
option('expat', type: 'feature', description: 'Expat XML support')
|
||||
option('icu', type: 'feature', description: 'Use libicu for Unicode')
|
||||
option('iconv', type: 'feature', description: 'Use iconv() for character set conversion')
|
||||
option('libwrap', type: 'feature', description: 'libwrap support')
|
||||
option('pcre', type: 'feature', description: 'Enable regular expression support (using libpcre)')
|
||||
option('sqlite', type: 'feature', description: 'SQLite database support (for stickers)')
|
||||
option('yajl', type: 'feature', description: 'libyajl for YAML support')
|
||||
option('zlib', type: 'feature', description: 'zlib support (for database compression)')
|
||||
|
||||
option('zeroconf', type: 'combo',
|
||||
choices: ['auto', 'avahi', 'bonjour', 'disabled'],
|
||||
value: 'auto',
|
||||
description: 'Zeroconf support')
|
||||
857
mpd.svg
Normal file
857
mpd.svg
Normal file
@@ -0,0 +1,857 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.0"
|
||||
x="0"
|
||||
y="0"
|
||||
width="128"
|
||||
height="128"
|
||||
id="svg1"
|
||||
sodipodi:version="0.32"
|
||||
sodipodi:docname="mpd.svg"
|
||||
inkscape:version="0.47pre4 r22446"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-test5.png"
|
||||
inkscape:export-xdpi="76.799988"
|
||||
inkscape:export-ydpi="76.799988">
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
inkscape:zoom="2.6884788"
|
||||
inkscape:cx="71.610485"
|
||||
inkscape:cy="61.484977"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="994"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
showgrid="false"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg1" />
|
||||
<defs
|
||||
id="defs3">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 80 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="160 : 80 : 1"
|
||||
inkscape:persp3d-origin="80 : 53.333333 : 1"
|
||||
id="perspective118" />
|
||||
<linearGradient
|
||||
id="linearGradient919">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0.86092716;"
|
||||
offset="0.0000000"
|
||||
id="stop920" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop921" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient1068">
|
||||
<stop
|
||||
offset="0.0000000"
|
||||
style="stop-color:#d2d2d2;stop-opacity:1.0000000;"
|
||||
id="stop1070" />
|
||||
<stop
|
||||
offset="1.0000000"
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;"
|
||||
id="stop1069" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient1065">
|
||||
<stop
|
||||
offset="0.0000000"
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;"
|
||||
id="stop1067" />
|
||||
<stop
|
||||
offset="1.0000000"
|
||||
style="stop-color:#c2bfbf;stop-opacity:0.99607843;"
|
||||
id="stop1066" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient1060">
|
||||
<stop
|
||||
offset="0.0000000"
|
||||
style="stop-color:#878787;stop-opacity:1.0000000;"
|
||||
id="stop1063" />
|
||||
<stop
|
||||
offset="1.0000000"
|
||||
style="stop-color:#000000;stop-opacity:0.99607843;"
|
||||
id="stop1061" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient645">
|
||||
<stop
|
||||
style="stop-color:#aca597;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop646" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop647" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient593">
|
||||
<stop
|
||||
style="stop-color:#478acf;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop594" />
|
||||
<stop
|
||||
style="stop-color:#65c6f7;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop595" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient574">
|
||||
<stop
|
||||
style="stop-color:#85ad92;stop-opacity:1.0000;"
|
||||
offset="0"
|
||||
id="stop575" />
|
||||
<stop
|
||||
style="stop-color:#559db2;stop-opacity:0.7725;"
|
||||
offset="1"
|
||||
id="stop576" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient570">
|
||||
<stop
|
||||
style="stop-color:#999999;stop-opacity:0.7176;"
|
||||
offset="0"
|
||||
id="stop571" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.3725;"
|
||||
offset="1"
|
||||
id="stop572" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient573"
|
||||
xlink:href="#linearGradient1068"
|
||||
x1="40.458553"
|
||||
y1="389.65582"
|
||||
x2="36.063946"
|
||||
y2="357.28375"
|
||||
gradientTransform="matrix(2.3025192,0,0,0.29683004,-0.91913426,-1.5117091)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
id="linearGradient1213"
|
||||
xlink:href="#linearGradient1068"
|
||||
x1="123.71407"
|
||||
y1="141.41566"
|
||||
x2="98.353867"
|
||||
y2="113.41083"
|
||||
gradientTransform="matrix(0.91680324,0,0,0.74547827,-0.91913426,-1.5117091)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
id="radialGradient581"
|
||||
xlink:href="#linearGradient919"
|
||||
cx="0.095785439"
|
||||
cy="0.16814159"
|
||||
r="1.5409589"
|
||||
fx="0.095785439"
|
||||
fy="0.16814159" />
|
||||
<linearGradient
|
||||
id="linearGradient580"
|
||||
xlink:href="#linearGradient1068"
|
||||
x1="132.0352"
|
||||
y1="135.68469"
|
||||
x2="119.62381"
|
||||
y2="111.07157"
|
||||
gradientTransform="matrix(0.90170536,0,0,0.75796032,-0.91913426,-1.5117091)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient1060"
|
||||
id="linearGradient901"
|
||||
x1="0.93491787"
|
||||
y1="0.92044502"
|
||||
x2="-0.052546836"
|
||||
y2="0.20347559" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient593"
|
||||
id="linearGradient902" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient1068"
|
||||
id="linearGradient916"
|
||||
x1="0.14831461"
|
||||
y1="-1.6875"
|
||||
x2="0.43370786"
|
||||
y2="1.8125" />
|
||||
<defs
|
||||
id="defs890">
|
||||
<linearGradient
|
||||
id="linearGradient922"
|
||||
x1="0"
|
||||
y1="0.5"
|
||||
x2="1"
|
||||
y2="0.5"
|
||||
gradientUnits="objectBoundingBox"
|
||||
spreadMethod="pad"
|
||||
xlink:href="#linearGradient1065" />
|
||||
<linearGradient
|
||||
id="linearGradient908"
|
||||
x1="0"
|
||||
y1="0.5"
|
||||
x2="1"
|
||||
y2="0.5"
|
||||
gradientUnits="objectBoundingBox"
|
||||
spreadMethod="pad"
|
||||
xlink:href="#linearGradient1060" />
|
||||
<linearGradient
|
||||
id="linearGradient894"
|
||||
x1="0"
|
||||
y1="0.5"
|
||||
x2="1"
|
||||
y2="0.5"
|
||||
gradientUnits="objectBoundingBox"
|
||||
spreadMethod="pad"
|
||||
xlink:href="#linearGradient1068" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient894"
|
||||
id="linearGradient897"
|
||||
x1="0.5955056"
|
||||
y1="-0.33587787"
|
||||
x2="0.61348313"
|
||||
y2="1.1908396" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient894"
|
||||
id="linearGradient898"
|
||||
x1="0.96449792"
|
||||
y1="1.0278323"
|
||||
x2="0.46738392"
|
||||
y2="0.21800731" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient908"
|
||||
id="linearGradient907"
|
||||
x1="0.57078654"
|
||||
y1="2.3770492"
|
||||
x2="0.33258426"
|
||||
y2="0.49180329" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient922"
|
||||
id="linearGradient921"
|
||||
x1="0.47058824"
|
||||
y1="0.15384616"
|
||||
x2="0.46547315"
|
||||
y2="0.98380566" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient922"
|
||||
id="linearGradient948" />
|
||||
<defs
|
||||
id="defs987">
|
||||
<linearGradient
|
||||
id="linearGradient855"
|
||||
x1="0"
|
||||
y1="0.5"
|
||||
x2="1"
|
||||
y2="0.5"
|
||||
gradientUnits="objectBoundingBox"
|
||||
spreadMethod="pad"
|
||||
xlink:href="#linearGradient908" />
|
||||
<linearGradient
|
||||
id="linearGradient1188"
|
||||
x1="0"
|
||||
y1="0.5"
|
||||
x2="1"
|
||||
y2="0.5"
|
||||
gradientUnits="objectBoundingBox"
|
||||
spreadMethod="pad"
|
||||
xlink:href="#linearGradient922" />
|
||||
<linearGradient
|
||||
id="linearGradient831">
|
||||
<stop
|
||||
style="stop-color:#94897f;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop832" />
|
||||
<stop
|
||||
style="stop-color:#fff5fe;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop833" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient1188"
|
||||
id="linearGradient834"
|
||||
x1="0.87550199"
|
||||
y1="0.34817815"
|
||||
x2="-0.29317269"
|
||||
y2="0.93522269"
|
||||
gradientUnits="objectBoundingBox"
|
||||
spreadMethod="pad" />
|
||||
<radialGradient
|
||||
xlink:href="#linearGradient1188"
|
||||
id="radialGradient835"
|
||||
r="0.55628061"
|
||||
fy="0.28125"
|
||||
fx="0.59090906"
|
||||
cy="0.28125"
|
||||
cx="0.59090906"
|
||||
spreadMethod="pad" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient1188"
|
||||
id="linearGradient893"
|
||||
x1="0.12793733"
|
||||
y1="0.76923078"
|
||||
x2="0.49608356"
|
||||
y2="0.70850199" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient855"
|
||||
id="linearGradient625"
|
||||
x1="0.035955057"
|
||||
y1="1.0276498"
|
||||
x2="0.053932585"
|
||||
y2="-0.359447" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient1188"
|
||||
id="linearGradient627"
|
||||
x1="1.2826855"
|
||||
y1="0.12550607"
|
||||
x2="-0.15547703"
|
||||
y2="0.96356273" />
|
||||
<radialGradient
|
||||
xlink:href="#linearGradient1188"
|
||||
id="radialGradient628"
|
||||
r="1.5982224"
|
||||
fy="0.4866707"
|
||||
fx="0.36789617"
|
||||
cy="0.4866707"
|
||||
cx="0.36789617"
|
||||
gradientTransform="scale(0.877379,1.139758)" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient1188"
|
||||
id="linearGradient628"
|
||||
x1="0.76923078"
|
||||
y1="0.14979757"
|
||||
x2="0.41909814"
|
||||
y2="0.73279351" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="namedview898"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.4732669"
|
||||
inkscape:cx="50.051177"
|
||||
inkscape:cy="18.096983"
|
||||
inkscape:window-width="1022"
|
||||
inkscape:window-height="670"
|
||||
showguides="false"
|
||||
snaptoguides="false"
|
||||
showgrid="false"
|
||||
snaptogrid="false"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25">
|
||||
<sodipodi:guide
|
||||
orientation="vertical"
|
||||
position="28.705556"
|
||||
id="guide879" />
|
||||
<sodipodi:guide
|
||||
orientation="horizontal"
|
||||
position="30.130655"
|
||||
id="guide880" />
|
||||
</sodipodi:namedview>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="namedview1003"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.3368738"
|
||||
inkscape:cx="24.541029"
|
||||
inkscape:cy="14.368596"
|
||||
inkscape:window-width="640"
|
||||
inkscape:window-height="499"
|
||||
showguides="true"
|
||||
snaptoguides="true"
|
||||
inkscape:window-x="138"
|
||||
inkscape:window-y="169" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient1060"
|
||||
id="linearGradient1304"
|
||||
x1="-0.20218579"
|
||||
y1="0.21681416"
|
||||
x2="0.67759562"
|
||||
y2="0.57522124" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient1065"
|
||||
id="linearGradient1322"
|
||||
x1="0.32404181"
|
||||
y1="0.77876109"
|
||||
x2="0.24041812"
|
||||
y2="0.26548672" />
|
||||
<defs
|
||||
id="defs989">
|
||||
<linearGradient
|
||||
id="linearGradient850">
|
||||
<stop
|
||||
style="stop-color:#eed680;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop852" />
|
||||
<stop
|
||||
style="stop-color:#dfb546;stop-opacity:1.0000000;"
|
||||
offset="0.68035328"
|
||||
id="stop858" />
|
||||
<stop
|
||||
style="stop-color:#d8a429;stop-opacity:1.0000000;"
|
||||
offset="0.77277374"
|
||||
id="stop859" />
|
||||
<stop
|
||||
style="stop-color:#d1940c;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop857" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient850"
|
||||
id="linearGradient569"
|
||||
x1="0.11875"
|
||||
y1="0.12612613"
|
||||
x2="0.59375"
|
||||
y2="0.66066068"
|
||||
spreadMethod="pad" />
|
||||
<linearGradient
|
||||
id="linearGradient839">
|
||||
<stop
|
||||
style="stop-color:#46a046;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop840" />
|
||||
<stop
|
||||
style="stop-color:#df421e;stop-opacity:1.0000000;"
|
||||
offset="0.39364964"
|
||||
id="stop841" />
|
||||
<stop
|
||||
style="stop-color:#ada7c8;stop-opacity:1.0000000;"
|
||||
offset="0.72036445"
|
||||
id="stop842" />
|
||||
<stop
|
||||
style="stop-color:#eed680;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop843" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient839"
|
||||
id="linearGradient836"
|
||||
x1="1.3267924e-17"
|
||||
y1="0.5"
|
||||
x2="1"
|
||||
y2="0.5" />
|
||||
<defs
|
||||
id="defs604">
|
||||
<linearGradient
|
||||
id="linearGradient622">
|
||||
<stop
|
||||
style="stop-color:#f8e29d;stop-opacity:0.4471;"
|
||||
offset="0"
|
||||
id="stop623" />
|
||||
<stop
|
||||
style="stop-color:#272d2d;stop-opacity:0.4784;"
|
||||
offset="1"
|
||||
id="stop624" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient617">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop618" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop619" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient613">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.6235;"
|
||||
offset="0"
|
||||
id="stop614" />
|
||||
<stop
|
||||
style="stop-color:#5d6567;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop615" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient607">
|
||||
<stop
|
||||
style="stop-color:#d7d5d5;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop608" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0.4039;"
|
||||
offset="1"
|
||||
id="stop609" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
xlink:href="#linearGradient607"
|
||||
id="radialGradient610"
|
||||
cx="1.4287461"
|
||||
cy="0.75323397"
|
||||
r="0.85534656"
|
||||
fx="1.4287461"
|
||||
fy="0.75323397"
|
||||
gradientTransform="matrix(1,2.268336e-6,-1.975559e-5,1,5.713033e-8,3.856326e-8)" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient617"
|
||||
id="linearGradient612"
|
||||
x1="7.7024956"
|
||||
y1="-2.0263922"
|
||||
x2="62.759903"
|
||||
y2="56.137772"
|
||||
gradientTransform="scale(0.9953779,1.0046436)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
xlink:href="#linearGradient613"
|
||||
id="radialGradient616"
|
||||
cx="58.70882"
|
||||
cy="53.831562"
|
||||
r="43.551846"
|
||||
fx="58.70882"
|
||||
fy="53.831562"
|
||||
gradientTransform="scale(0.99517298,1.0048504)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient617"
|
||||
id="linearGradient621" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient617"
|
||||
id="linearGradient626"
|
||||
x1="72.060211"
|
||||
y1="55.161442"
|
||||
x2="32.409"
|
||||
y2="12.126946"
|
||||
gradientTransform="matrix(0.995134,-1.068631e-5,-1.31398e-7,1.00489,0,0)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient607"
|
||||
id="linearGradient687"
|
||||
x1="67.707405"
|
||||
y1="49.314793"
|
||||
x2="-10.031048"
|
||||
y2="4.6068792"
|
||||
gradientTransform="scale(0.99522839,1.0047945)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#linearGradient617"
|
||||
id="linearGradient742"
|
||||
x1="-7.4378386"
|
||||
y1="25.923714"
|
||||
x2="18.009745"
|
||||
y2="10.089797"
|
||||
gradientTransform="scale(0.889853,1.123781)" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="namedview889"
|
||||
showguides="true"
|
||||
snaptoguides="true"
|
||||
inkscape:zoom="7.5625000"
|
||||
inkscape:cx="24.000000"
|
||||
inkscape:cy="24.000000"
|
||||
inkscape:window-width="640"
|
||||
inkscape:window-height="496"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="26" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="namedview1023"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.5521067"
|
||||
inkscape:cx="66.459318"
|
||||
inkscape:cy="62.629296"
|
||||
inkscape:window-width="1150"
|
||||
inkscape:window-height="752"
|
||||
showgrid="true"
|
||||
snaptogrid="true"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29">
|
||||
<inkscape:grid
|
||||
id="GridFromPre046Settings"
|
||||
type="xygrid"
|
||||
originx="0px"
|
||||
originy="0px"
|
||||
spacingx="1.0000000mm"
|
||||
spacingy="1.0000000mm"
|
||||
color="#0000ff"
|
||||
empcolor="#0000ff"
|
||||
opacity="0.2"
|
||||
empopacity="0.4"
|
||||
empspacing="5" />
|
||||
</sodipodi:namedview>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1068"
|
||||
id="linearGradient2924"
|
||||
x1="41.673889"
|
||||
y1="320.40921"
|
||||
x2="36.082947"
|
||||
y2="279.22458"
|
||||
gradientTransform="matrix(2.3376099,0,0,0.29237422,-0.91913426,-1.5117091)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1068"
|
||||
id="linearGradient2926"
|
||||
x1="134.95444"
|
||||
y1="108.16693"
|
||||
x2="102.05431"
|
||||
y2="71.835884"
|
||||
gradientTransform="matrix(0.91680324,0,0,0.74547824,-0.91913426,-1.5117091)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1068"
|
||||
id="linearGradient2928"
|
||||
x1="145.32188"
|
||||
y1="101.97199"
|
||||
x2="129.22044"
|
||||
y2="70.041069"
|
||||
gradientTransform="matrix(0.90170536,0,0,0.75796032,-0.91913426,-1.5117091)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
</defs>
|
||||
<rect
|
||||
style="fill-opacity:0.47154475;fill-rule:evenodd;stroke-width:3pt"
|
||||
id="rect918"
|
||||
width="48.72493"
|
||||
height="42.16835"
|
||||
ry="0.74231374"
|
||||
x="67.536102"
|
||||
y="66.474693"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="0.7811048" />
|
||||
<rect
|
||||
style="fill-opacity:0.47154475;fill-rule:evenodd;stroke-width:3pt"
|
||||
id="rect1006"
|
||||
width="63.211483"
|
||||
height="54.705563"
|
||||
ry="0.74231374"
|
||||
x="64.47226"
|
||||
y="30.558294"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="0.7811048" />
|
||||
<rect
|
||||
style="fill:#000000;fill-opacity:0.47058824;fill-rule:evenodd"
|
||||
id="rect1005"
|
||||
width="57.843418"
|
||||
height="9.0050545"
|
||||
ry="0.62889248"
|
||||
x="65.398254"
|
||||
y="82.153206"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="0.66175652" />
|
||||
<rect
|
||||
style="fill:url(#linearGradient2924);fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.82671446"
|
||||
id="rect1007"
|
||||
width="54.910637"
|
||||
height="6.1445785"
|
||||
ry="0.42912331"
|
||||
x="64.622299"
|
||||
y="82.282539"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="0.44939452" />
|
||||
<rect
|
||||
width="57.905403"
|
||||
height="47.084496"
|
||||
ry="1.7822117"
|
||||
x="63.784973"
|
||||
y="32.456562"
|
||||
style="font-size:12px;fill:url(#linearGradient2926);fill-rule:evenodd;stroke:#000000;stroke-width:0"
|
||||
id="rect1009"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="1.6336281" />
|
||||
<rect
|
||||
style="fill:#000000;fill-opacity:0.47058824;fill-rule:evenodd"
|
||||
id="rect971"
|
||||
width="44.58709"
|
||||
height="6.9413123"
|
||||
ry="0.62889248"
|
||||
x="68.249886"
|
||||
y="106.24529"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="0.66175652" />
|
||||
<rect
|
||||
width="64.637024"
|
||||
height="54.068516"
|
||||
ry="1.4120796"
|
||||
x="59.853096"
|
||||
y="28.740753"
|
||||
style="font-size:12px;fill:url(#linearGradient2928);fill-rule:evenodd;stroke:#000000;stroke-width:1.65869105"
|
||||
id="rect1008"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="1.3970968" />
|
||||
<rect
|
||||
width="51.129478"
|
||||
height="39.964478"
|
||||
ry="0.5422883"
|
||||
x="66.358932"
|
||||
y="34.89621"
|
||||
style="font-size:12px;fill:#00b4ed;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.79054338;stroke-linejoin:round"
|
||||
id="rect976"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="0.5422883" />
|
||||
<metadata
|
||||
id="metadata982">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<rect
|
||||
width="44.634872"
|
||||
height="36.293858"
|
||||
ry="1.7822117"
|
||||
x="67.006332"
|
||||
y="67.937927"
|
||||
style="font-size:12px;fill:url(#linearGradient1213);fill-rule:evenodd;stroke:#000000;stroke-width:0"
|
||||
id="rect575"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="1.633628" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="font-size:12px;fill:#444040;fill-opacity:0.47058824;fill-rule:evenodd"
|
||||
id="path672"
|
||||
d="m 68.473,57.85183 a 23.629898,3.2222576 0 1 1 -47.259797,0 23.629898,3.2222576 0 1 1 47.259797,0 z"
|
||||
sodipodi:cx="44.843102"
|
||||
sodipodi:cy="57.85183"
|
||||
sodipodi:rx="23.629898"
|
||||
sodipodi:ry="3.2222576"
|
||||
transform="matrix(1.4221482,0,-0.30247168,1.9834766,9.6201687,-10.428817)"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="font-size:12px;fill:#4e4d4b;fill-rule:evenodd;stroke:#000000;stroke-width:2.30019999;stroke-opacity:0.9565"
|
||||
id="path625"
|
||||
d="m 58.291138,27.531645 a 19.367088,19.556963 0 1 1 -38.734177,0 19.367088,19.556963 0 1 1 38.734177,0 z"
|
||||
sodipodi:cx="38.924049"
|
||||
sodipodi:cy="27.531645"
|
||||
sodipodi:rx="19.367088"
|
||||
sodipodi:ry="19.556963"
|
||||
transform="matrix(-1.0172416,-0.47376693,-0.5523759,1.3286212,116.84611,57.272851)"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="font-size:12px;fill:url(#linearGradient612);fill-rule:evenodd;stroke:#000000;stroke-width:2.06100011;stroke-opacity:0.9565"
|
||||
id="path605"
|
||||
d="m 58.291138,27.531645 a 19.367088,19.556963 0 1 1 -38.734177,0 19.367088,19.556963 0 1 1 38.734177,0 z"
|
||||
sodipodi:cx="38.924049"
|
||||
sodipodi:cy="27.531645"
|
||||
sodipodi:rx="19.367088"
|
||||
sodipodi:ry="19.556963"
|
||||
transform="matrix(-1.4321234,-0.79696518,-1.1299666,2.2349846,128.07685,29.383033)"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="font-size:12px;fill:url(#radialGradient616);fill-rule:evenodd;stroke:#000000;stroke-width:0.317;stroke-opacity:0.97829997"
|
||||
id="path606"
|
||||
d="m 58.291138,27.531645 a 19.367088,19.556963 0 1 1 -38.734177,0 19.367088,19.556963 0 1 1 38.734177,0 z"
|
||||
sodipodi:cx="38.924049"
|
||||
sodipodi:cy="27.531645"
|
||||
sodipodi:rx="19.367088"
|
||||
sodipodi:ry="19.556963"
|
||||
transform="matrix(-1.1546358,-0.69851175,-0.95634664,1.9588777,108.06887,31.115628)"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="font-size:12px;fill-rule:evenodd;stroke-width:1.63499999"
|
||||
id="path686"
|
||||
d="m 58.291138,27.531645 a 19.367088,19.556963 0 1 1 -38.734177,0 19.367088,19.556963 0 1 1 38.734177,0 z"
|
||||
sodipodi:cx="38.924049"
|
||||
sodipodi:cy="27.531645"
|
||||
sodipodi:rx="19.367088"
|
||||
sodipodi:ry="19.556963"
|
||||
transform="matrix(-0.39495459,-0.4546194,-0.52881207,0.94219495,73.198184,52.427791)"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="font-size:12px;fill:url(#linearGradient687);fill-rule:evenodd;stroke:#3f3b3b;stroke-width:0.77380002"
|
||||
id="path611"
|
||||
d="m 58.291138,27.531645 a 19.367088,19.556963 0 1 1 -38.734177,0 19.367088,19.556963 0 1 1 38.734177,0 z"
|
||||
sodipodi:cx="38.924049"
|
||||
sodipodi:cy="27.531645"
|
||||
sodipodi:rx="19.367088"
|
||||
sodipodi:ry="19.556963"
|
||||
transform="matrix(-0.36949013,-0.40957751,-0.49471918,0.84885391,70.248021,52.066881)"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998" />
|
||||
<rect
|
||||
style="fill:url(#linearGradient573);fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.82671446"
|
||||
id="rect934"
|
||||
width="42.326431"
|
||||
height="4.7363882"
|
||||
ry="0.42912331"
|
||||
x="67.651756"
|
||||
y="106.34497"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="0.44939449" />
|
||||
<rect
|
||||
width="49.823761"
|
||||
height="41.677303"
|
||||
ry="1.4120796"
|
||||
x="63.975548"
|
||||
y="65.073692"
|
||||
style="font-size:12px;fill:url(#linearGradient580);fill-rule:evenodd;stroke:#000000;stroke-width:1.27855873;stroke-opacity:1"
|
||||
id="rect562"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="1.3970969" />
|
||||
<rect
|
||||
width="39.411831"
|
||||
height="30.805574"
|
||||
ry="0.5422883"
|
||||
x="68.990387"
|
||||
y="70.097008"
|
||||
style="font-size:12px;fill:#003d88;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.61407685;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.93023257"
|
||||
id="rect975"
|
||||
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
|
||||
inkscape:export-xdpi="721.66998"
|
||||
inkscape:export-ydpi="721.66998"
|
||||
rx="0.5422883" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 27 KiB |
64
python/build/autotools.py
Normal file
64
python/build/autotools.py
Normal file
@@ -0,0 +1,64 @@
|
||||
import os.path, subprocess, sys
|
||||
|
||||
from build.makeproject import MakeProject
|
||||
|
||||
class AutotoolsProject(MakeProject):
|
||||
def __init__(self, url, md5, installed, configure_args=[],
|
||||
autogen=False,
|
||||
autoreconf=False,
|
||||
cppflags='',
|
||||
ldflags='',
|
||||
libs='',
|
||||
subdirs=None,
|
||||
**kwargs):
|
||||
MakeProject.__init__(self, url, md5, installed, **kwargs)
|
||||
self.configure_args = configure_args
|
||||
self.autogen = autogen
|
||||
self.autoreconf = autoreconf
|
||||
self.cppflags = cppflags
|
||||
self.ldflags = ldflags
|
||||
self.libs = libs
|
||||
self.subdirs = subdirs
|
||||
|
||||
def configure(self, toolchain):
|
||||
src = self.unpack(toolchain)
|
||||
if self.autogen:
|
||||
if sys.platform == 'darwin':
|
||||
subprocess.check_call(['glibtoolize', '--force'], cwd=src)
|
||||
else:
|
||||
subprocess.check_call(['libtoolize', '--force'], cwd=src)
|
||||
subprocess.check_call(['aclocal'], cwd=src)
|
||||
subprocess.check_call(['automake', '--add-missing', '--force-missing', '--foreign'], cwd=src)
|
||||
subprocess.check_call(['autoconf'], cwd=src)
|
||||
if self.autoreconf:
|
||||
subprocess.check_call(['autoreconf', '-vif'], cwd=src)
|
||||
|
||||
build = self.make_build_path(toolchain)
|
||||
|
||||
configure = [
|
||||
os.path.join(src, 'configure'),
|
||||
'CC=' + toolchain.cc,
|
||||
'CXX=' + toolchain.cxx,
|
||||
'CFLAGS=' + toolchain.cflags,
|
||||
'CXXFLAGS=' + toolchain.cxxflags,
|
||||
'CPPFLAGS=' + toolchain.cppflags + ' ' + self.cppflags,
|
||||
'LDFLAGS=' + toolchain.ldflags + ' ' + self.ldflags,
|
||||
'LIBS=' + toolchain.libs + ' ' + self.libs,
|
||||
'AR=' + toolchain.ar,
|
||||
'RANLIB=' + toolchain.ranlib,
|
||||
'STRIP=' + toolchain.strip,
|
||||
'--host=' + toolchain.arch,
|
||||
'--prefix=' + toolchain.install_prefix,
|
||||
'--enable-silent-rules',
|
||||
] + self.configure_args
|
||||
|
||||
subprocess.check_call(configure, cwd=build, env=toolchain.env)
|
||||
return build
|
||||
|
||||
def build(self, toolchain):
|
||||
build = self.configure(toolchain)
|
||||
if self.subdirs is not None:
|
||||
for subdir in self.subdirs:
|
||||
MakeProject.build(self, toolchain, os.path.join(build, subdir))
|
||||
else:
|
||||
MakeProject.build(self, toolchain, build)
|
||||
23
python/build/boost.py
Normal file
23
python/build/boost.py
Normal file
@@ -0,0 +1,23 @@
|
||||
import os, shutil
|
||||
import re
|
||||
|
||||
from build.project import Project
|
||||
|
||||
class BoostProject(Project):
|
||||
def __init__(self, url, md5, installed,
|
||||
**kwargs):
|
||||
m = re.match(r'.*/boost_(\d+)_(\d+)_(\d+)\.tar\.bz2$', url)
|
||||
version = "%s.%s.%s" % (m.group(1), m.group(2), m.group(3))
|
||||
Project.__init__(self, url, md5, installed,
|
||||
name='boost', version=version,
|
||||
**kwargs)
|
||||
|
||||
def build(self, toolchain):
|
||||
src = self.unpack(toolchain)
|
||||
|
||||
# install the headers manually; don't build any library
|
||||
# (because right now, we only use header-only libraries)
|
||||
includedir = os.path.join(toolchain.install_prefix, 'include')
|
||||
dest = os.path.join(includedir, 'boost')
|
||||
shutil.rmtree(dest, ignore_errors=True)
|
||||
shutil.copytree(os.path.join(src, 'boost'), dest)
|
||||
9
python/build/dirs.py
Normal file
9
python/build/dirs.py
Normal file
@@ -0,0 +1,9 @@
|
||||
import os.path
|
||||
|
||||
lib_path = os.path.abspath('lib')
|
||||
|
||||
shared_path = lib_path
|
||||
if 'MPD_SHARED_LIB' in os.environ:
|
||||
shared_path = os.environ['MPD_SHARED_LIB']
|
||||
tarball_path = os.path.join(shared_path, 'download')
|
||||
src_path = os.path.join(shared_path, 'src')
|
||||
26
python/build/download.py
Normal file
26
python/build/download.py
Normal file
@@ -0,0 +1,26 @@
|
||||
from build.verify import verify_file_digest
|
||||
import os
|
||||
import urllib.request
|
||||
|
||||
def download_and_verify(url, md5, parent_path):
|
||||
"""Download a file, verify its MD5 checksum and return the local path."""
|
||||
|
||||
os.makedirs(parent_path, exist_ok=True)
|
||||
path = os.path.join(parent_path, os.path.basename(url))
|
||||
|
||||
try:
|
||||
if verify_file_digest(path, md5): return path
|
||||
os.unlink(path)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
tmp_path = path + '.tmp'
|
||||
|
||||
print("download", url)
|
||||
urllib.request.urlretrieve(url, tmp_path)
|
||||
if not verify_file_digest(tmp_path, md5):
|
||||
os.unlink(tmp_path)
|
||||
raise RuntimeError("Digest mismatch")
|
||||
|
||||
os.rename(tmp_path, path)
|
||||
return path
|
||||
56
python/build/ffmpeg.py
Normal file
56
python/build/ffmpeg.py
Normal file
@@ -0,0 +1,56 @@
|
||||
import os.path, subprocess
|
||||
|
||||
from build.project import Project
|
||||
|
||||
class FfmpegProject(Project):
|
||||
def __init__(self, url, md5, installed, configure_args=[],
|
||||
cppflags='',
|
||||
**kwargs):
|
||||
Project.__init__(self, url, md5, installed, **kwargs)
|
||||
self.configure_args = configure_args
|
||||
self.cppflags = cppflags
|
||||
|
||||
def _filter_cflags(self, flags):
|
||||
# FFmpeg expects the GNU as syntax
|
||||
flags = flags.replace(' -integrated-as ', ' -no-integrated-as ')
|
||||
return flags
|
||||
|
||||
def build(self, toolchain):
|
||||
src = self.unpack(toolchain)
|
||||
build = self.make_build_path(toolchain)
|
||||
|
||||
if toolchain.is_arm:
|
||||
arch = 'arm'
|
||||
elif toolchain.is_aarch64:
|
||||
arch = 'aarch64'
|
||||
else:
|
||||
arch = 'x86'
|
||||
|
||||
if toolchain.is_windows:
|
||||
target_os = 'mingw32'
|
||||
else:
|
||||
target_os = 'linux'
|
||||
|
||||
configure = [
|
||||
os.path.join(src, 'configure'),
|
||||
'--cc=' + toolchain.cc,
|
||||
'--cxx=' + toolchain.cxx,
|
||||
'--nm=' + toolchain.nm,
|
||||
'--extra-cflags=' + self._filter_cflags(toolchain.cflags) + ' ' + toolchain.cppflags + ' ' + self.cppflags,
|
||||
'--extra-cxxflags=' + self._filter_cflags(toolchain.cxxflags) + ' ' + toolchain.cppflags + ' ' + self.cppflags,
|
||||
'--extra-ldflags=' + toolchain.ldflags,
|
||||
'--extra-libs=' + toolchain.libs,
|
||||
'--ar=' + toolchain.ar,
|
||||
'--ranlib=' + toolchain.ranlib,
|
||||
'--enable-cross-compile',
|
||||
'--arch=' + arch,
|
||||
'--target-os=' + target_os,
|
||||
'--prefix=' + toolchain.install_prefix,
|
||||
] + self.configure_args
|
||||
|
||||
if toolchain.is_armv7:
|
||||
configure.append('--cpu=cortex-a8')
|
||||
|
||||
subprocess.check_call(configure, cwd=build, env=toolchain.env)
|
||||
subprocess.check_call(['/usr/bin/make', '--quiet', '-j12'], cwd=build, env=toolchain.env)
|
||||
subprocess.check_call(['/usr/bin/make', '--quiet', 'install'], cwd=build, env=toolchain.env)
|
||||
398
python/build/libs.py
Normal file
398
python/build/libs.py
Normal file
@@ -0,0 +1,398 @@
|
||||
import re
|
||||
from os.path import abspath
|
||||
|
||||
from build.project import Project
|
||||
from build.zlib import ZlibProject
|
||||
from build.meson import MesonProject
|
||||
from build.autotools import AutotoolsProject
|
||||
from build.ffmpeg import FfmpegProject
|
||||
from build.boost import BoostProject
|
||||
|
||||
libmpdclient = MesonProject(
|
||||
'https://www.musicpd.org/download/libmpdclient/2/libmpdclient-2.16.tar.xz',
|
||||
'fa6bdab67c0e0490302b38f00c27b4959735c3ec8aef7a88327adb1407654464',
|
||||
'lib/libmpdclient.a',
|
||||
)
|
||||
|
||||
libogg = AutotoolsProject(
|
||||
'http://downloads.xiph.org/releases/ogg/libogg-1.3.3.tar.xz',
|
||||
'4f3fc6178a533d392064f14776b23c397ed4b9f48f5de297aba73b643f955c08',
|
||||
'lib/libogg.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
],
|
||||
)
|
||||
|
||||
libvorbis = AutotoolsProject(
|
||||
'http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.6.tar.xz',
|
||||
'af00bb5a784e7c9e69f56823de4637c350643deedaf333d0fa86ecdba6fcb415',
|
||||
'lib/libvorbis.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
],
|
||||
|
||||
edits={
|
||||
# this option is not understood by clang
|
||||
'configure': lambda data: data.replace('-mno-ieee-fp', ' '),
|
||||
}
|
||||
)
|
||||
|
||||
opus = AutotoolsProject(
|
||||
'https://archive.mozilla.org/pub/opus/opus-1.3.tar.gz',
|
||||
'4f3d69aefdf2dbaf9825408e452a8a414ffc60494c70633560700398820dc550',
|
||||
'lib/libopus.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
'--disable-doc',
|
||||
'--disable-extra-programs',
|
||||
],
|
||||
|
||||
# suppress "visibility default" from opus_defines.h
|
||||
cppflags='-DOPUS_EXPORT=',
|
||||
)
|
||||
|
||||
flac = AutotoolsProject(
|
||||
'http://downloads.xiph.org/releases/flac/flac-1.3.2.tar.xz',
|
||||
'91cfc3ed61dc40f47f050a109b08610667d73477af6ef36dcad31c31a4a8d53f',
|
||||
'lib/libFLAC.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
'--disable-xmms-plugin', '--disable-cpplibs',
|
||||
'--disable-doxygen-docs',
|
||||
],
|
||||
subdirs=['include', 'src/libFLAC'],
|
||||
)
|
||||
|
||||
zlib = ZlibProject(
|
||||
'http://zlib.net/zlib-1.2.11.tar.xz',
|
||||
'4ff941449631ace0d4d203e3483be9dbc9da454084111f97ea0a2114e19bf066',
|
||||
'lib/libz.a',
|
||||
)
|
||||
|
||||
libid3tag = AutotoolsProject(
|
||||
'ftp://ftp.mars.org/pub/mpeg/libid3tag-0.15.1b.tar.gz',
|
||||
'e5808ad997ba32c498803822078748c3',
|
||||
'lib/libid3tag.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
|
||||
# without this, libid3tag's configure.ac ignores -O* and -f*
|
||||
'--disable-debugging',
|
||||
],
|
||||
autogen=True,
|
||||
|
||||
edits={
|
||||
# fix bug in libid3tag's configure.ac which discards all but the last optimization flag
|
||||
'configure.ac': lambda data: re.sub(r'optimize="\$1"', r'optimize="$optimize $1"', data, count=1),
|
||||
}
|
||||
)
|
||||
|
||||
libmad = AutotoolsProject(
|
||||
'ftp://ftp.mars.org/pub/mpeg/libmad-0.15.1b.tar.gz',
|
||||
'1be543bc30c56fb6bea1d7bf6a64e66c',
|
||||
'lib/libmad.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
|
||||
# without this, libmad's configure.ac ignores -O* and -f*
|
||||
'--disable-debugging',
|
||||
],
|
||||
autogen=True,
|
||||
)
|
||||
|
||||
liblame = AutotoolsProject(
|
||||
'http://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz',
|
||||
'ddfe36cab873794038ae2c1210557ad34857a4b6bdc515785d1da9e175b1da1e',
|
||||
'lib/libmp3lame.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
'--disable-gtktest', '--disable-analyzer-hooks',
|
||||
'--disable-decoder', '--disable-frontend',
|
||||
],
|
||||
)
|
||||
|
||||
ffmpeg = FfmpegProject(
|
||||
'http://ffmpeg.org/releases/ffmpeg-4.1.tar.xz',
|
||||
'a38ec4d026efb58506a99ad5cd23d5a9793b4bf415f2c4c2e9c1bb444acd1994',
|
||||
'lib/libavcodec.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
'--enable-gpl',
|
||||
'--enable-small',
|
||||
'--disable-pthreads',
|
||||
'--disable-programs',
|
||||
'--disable-doc',
|
||||
'--disable-avdevice',
|
||||
'--disable-swresample',
|
||||
'--disable-swscale',
|
||||
'--disable-postproc',
|
||||
'--disable-avfilter',
|
||||
'--disable-lzo',
|
||||
'--disable-faan',
|
||||
'--disable-pixelutils',
|
||||
'--disable-network',
|
||||
'--disable-encoders',
|
||||
'--disable-muxers',
|
||||
'--disable-protocols',
|
||||
'--disable-devices',
|
||||
'--disable-filters',
|
||||
'--disable-v4l2_m2m',
|
||||
|
||||
'--disable-parser=bmp',
|
||||
'--disable-parser=cavsvideo',
|
||||
'--disable-parser=dvbsub',
|
||||
'--disable-parser=dvdsub',
|
||||
'--disable-parser=dvd_nav',
|
||||
'--disable-parser=flac',
|
||||
'--disable-parser=g729',
|
||||
'--disable-parser=gsm',
|
||||
'--disable-parser=h261',
|
||||
'--disable-parser=h263',
|
||||
'--disable-parser=h264',
|
||||
'--disable-parser=hevc',
|
||||
'--disable-parser=mjpeg',
|
||||
'--disable-parser=mlp',
|
||||
'--disable-parser=mpeg4video',
|
||||
'--disable-parser=mpegvideo',
|
||||
'--disable-parser=opus',
|
||||
'--disable-parser=vc1',
|
||||
'--disable-parser=vp3',
|
||||
'--disable-parser=vp8',
|
||||
'--disable-parser=vp9',
|
||||
'--disable-parser=png',
|
||||
'--disable-parser=pnm',
|
||||
'--disable-parser=xma',
|
||||
|
||||
'--disable-demuxer=aqtitle',
|
||||
'--disable-demuxer=ass',
|
||||
'--disable-demuxer=bethsoftvid',
|
||||
'--disable-demuxer=bink',
|
||||
'--disable-demuxer=cavsvideo',
|
||||
'--disable-demuxer=cdxl',
|
||||
'--disable-demuxer=dvbsub',
|
||||
'--disable-demuxer=dvbtxt',
|
||||
'--disable-demuxer=h261',
|
||||
'--disable-demuxer=h263',
|
||||
'--disable-demuxer=h264',
|
||||
'--disable-demuxer=ico',
|
||||
'--disable-demuxer=image2',
|
||||
'--disable-demuxer=jacosub',
|
||||
'--disable-demuxer=lrc',
|
||||
'--disable-demuxer=microdvd',
|
||||
'--disable-demuxer=mjpeg',
|
||||
'--disable-demuxer=mjpeg_2000',
|
||||
'--disable-demuxer=mpegps',
|
||||
'--disable-demuxer=mpegvideo',
|
||||
'--disable-demuxer=mpl2',
|
||||
'--disable-demuxer=mpsub',
|
||||
'--disable-demuxer=pjs',
|
||||
'--disable-demuxer=rawvideo',
|
||||
'--disable-demuxer=realtext',
|
||||
'--disable-demuxer=sami',
|
||||
'--disable-demuxer=scc',
|
||||
'--disable-demuxer=srt',
|
||||
'--disable-demuxer=stl',
|
||||
'--disable-demuxer=subviewer',
|
||||
'--disable-demuxer=subviewer1',
|
||||
'--disable-demuxer=swf',
|
||||
'--disable-demuxer=tedcaptions',
|
||||
'--disable-demuxer=vobsub',
|
||||
'--disable-demuxer=vplayer',
|
||||
'--disable-demuxer=webvtt',
|
||||
'--disable-demuxer=yuv4mpegpipe',
|
||||
|
||||
# we don't need these decoders, because we have the dedicated
|
||||
# libraries
|
||||
'--disable-decoder=flac',
|
||||
'--disable-decoder=opus',
|
||||
'--disable-decoder=vorbis',
|
||||
|
||||
# audio codecs nobody uses
|
||||
'--disable-decoder=atrac1',
|
||||
'--disable-decoder=atrac3',
|
||||
'--disable-decoder=atrac3al',
|
||||
'--disable-decoder=atrac3p',
|
||||
'--disable-decoder=atrac3pal',
|
||||
'--disable-decoder=binkaudio_dct',
|
||||
'--disable-decoder=binkaudio_rdft',
|
||||
'--disable-decoder=bmv_audio',
|
||||
'--disable-decoder=dsicinaudio',
|
||||
'--disable-decoder=dvaudio',
|
||||
'--disable-decoder=metasound',
|
||||
'--disable-decoder=paf_audio',
|
||||
'--disable-decoder=ra_144',
|
||||
'--disable-decoder=ra_288',
|
||||
'--disable-decoder=ralf',
|
||||
'--disable-decoder=qdm2',
|
||||
'--disable-decoder=qdmc',
|
||||
|
||||
# disable lots of image and video codecs
|
||||
'--disable-decoder=ass',
|
||||
'--disable-decoder=asv1',
|
||||
'--disable-decoder=asv2',
|
||||
'--disable-decoder=apng',
|
||||
'--disable-decoder=avrn',
|
||||
'--disable-decoder=avrp',
|
||||
'--disable-decoder=bethsoftvid',
|
||||
'--disable-decoder=bink',
|
||||
'--disable-decoder=bmp',
|
||||
'--disable-decoder=bmv_video',
|
||||
'--disable-decoder=cavs',
|
||||
'--disable-decoder=ccaption',
|
||||
'--disable-decoder=cdgraphics',
|
||||
'--disable-decoder=clearvideo',
|
||||
'--disable-decoder=dirac',
|
||||
'--disable-decoder=dsicinvideo',
|
||||
'--disable-decoder=dvbsub',
|
||||
'--disable-decoder=dvdsub',
|
||||
'--disable-decoder=dvvideo',
|
||||
'--disable-decoder=exr',
|
||||
'--disable-decoder=ffv1',
|
||||
'--disable-decoder=ffvhuff',
|
||||
'--disable-decoder=ffwavesynth',
|
||||
'--disable-decoder=flic',
|
||||
'--disable-decoder=flv',
|
||||
'--disable-decoder=fraps',
|
||||
'--disable-decoder=gif',
|
||||
'--disable-decoder=h261',
|
||||
'--disable-decoder=h263',
|
||||
'--disable-decoder=h263i',
|
||||
'--disable-decoder=h263p',
|
||||
'--disable-decoder=h264',
|
||||
'--disable-decoder=hevc',
|
||||
'--disable-decoder=hnm4_video',
|
||||
'--disable-decoder=hq_hqa',
|
||||
'--disable-decoder=hqx',
|
||||
'--disable-decoder=idcin',
|
||||
'--disable-decoder=iff_ilbm',
|
||||
'--disable-decoder=indeo2',
|
||||
'--disable-decoder=indeo3',
|
||||
'--disable-decoder=indeo4',
|
||||
'--disable-decoder=indeo5',
|
||||
'--disable-decoder=interplay_video',
|
||||
'--disable-decoder=jacosub',
|
||||
'--disable-decoder=jpeg2000',
|
||||
'--disable-decoder=jpegls',
|
||||
'--disable-decoder=microdvd',
|
||||
'--disable-decoder=mimic',
|
||||
'--disable-decoder=mjpeg',
|
||||
'--disable-decoder=mmvideo',
|
||||
'--disable-decoder=mpl2',
|
||||
'--disable-decoder=motionpixels',
|
||||
'--disable-decoder=mpeg1video',
|
||||
'--disable-decoder=mpeg2video',
|
||||
'--disable-decoder=mpeg4',
|
||||
'--disable-decoder=mpegvideo',
|
||||
'--disable-decoder=mscc',
|
||||
'--disable-decoder=msmpeg4_crystalhd',
|
||||
'--disable-decoder=msmpeg4v1',
|
||||
'--disable-decoder=msmpeg4v2',
|
||||
'--disable-decoder=msmpeg4v3',
|
||||
'--disable-decoder=msvideo1',
|
||||
'--disable-decoder=mszh',
|
||||
'--disable-decoder=mvc1',
|
||||
'--disable-decoder=mvc2',
|
||||
'--disable-decoder=on2avc',
|
||||
'--disable-decoder=paf_video',
|
||||
'--disable-decoder=png',
|
||||
'--disable-decoder=qdraw',
|
||||
'--disable-decoder=qpeg',
|
||||
'--disable-decoder=rawvideo',
|
||||
'--disable-decoder=realtext',
|
||||
'--disable-decoder=roq',
|
||||
'--disable-decoder=roq_dpcm',
|
||||
'--disable-decoder=rscc',
|
||||
'--disable-decoder=rv10',
|
||||
'--disable-decoder=rv20',
|
||||
'--disable-decoder=rv30',
|
||||
'--disable-decoder=rv40',
|
||||
'--disable-decoder=sami',
|
||||
'--disable-decoder=sheervideo',
|
||||
'--disable-decoder=snow',
|
||||
'--disable-decoder=srt',
|
||||
'--disable-decoder=stl',
|
||||
'--disable-decoder=subrip',
|
||||
'--disable-decoder=subviewer',
|
||||
'--disable-decoder=subviewer1',
|
||||
'--disable-decoder=svq1',
|
||||
'--disable-decoder=svq3',
|
||||
'--disable-decoder=tiff',
|
||||
'--disable-decoder=tiertexseqvideo',
|
||||
'--disable-decoder=truemotion1',
|
||||
'--disable-decoder=truemotion2',
|
||||
'--disable-decoder=truemotion2rt',
|
||||
'--disable-decoder=twinvq',
|
||||
'--disable-decoder=utvideo',
|
||||
'--disable-decoder=vc1',
|
||||
'--disable-decoder=vmdvideo',
|
||||
'--disable-decoder=vp3',
|
||||
'--disable-decoder=vp5',
|
||||
'--disable-decoder=vp6',
|
||||
'--disable-decoder=vp7',
|
||||
'--disable-decoder=vp8',
|
||||
'--disable-decoder=vp9',
|
||||
'--disable-decoder=vqa',
|
||||
'--disable-decoder=webvtt',
|
||||
'--disable-decoder=wmv1',
|
||||
'--disable-decoder=wmv2',
|
||||
'--disable-decoder=wmv3',
|
||||
'--disable-decoder=yuv4',
|
||||
],
|
||||
)
|
||||
|
||||
curl = AutotoolsProject(
|
||||
'http://curl.haxx.se/download/curl-7.62.0.tar.xz',
|
||||
'dab5643a5fe775ae92570b9f3df6b0ef4bc2a827a959361fb130c73b721275c1',
|
||||
'lib/libcurl.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
'--disable-debug',
|
||||
'--enable-http',
|
||||
'--enable-ipv6',
|
||||
'--disable-ftp', '--disable-file',
|
||||
'--disable-ldap', '--disable-ldaps',
|
||||
'--disable-rtsp', '--disable-proxy', '--disable-dict', '--disable-telnet',
|
||||
'--disable-tftp', '--disable-pop3', '--disable-imap', '--disable-smtp',
|
||||
'--disable-smb',
|
||||
'--disable-gopher',
|
||||
'--disable-manual',
|
||||
'--disable-threaded-resolver', '--disable-verbose', '--disable-sspi',
|
||||
'--disable-crypto-auth', '--disable-ntlm-wb', '--disable-tls-srp', '--disable-cookies',
|
||||
'--without-ssl', '--without-gnutls', '--without-nss', '--without-libssh2',
|
||||
],
|
||||
|
||||
patches='src/lib/curl/patches',
|
||||
)
|
||||
|
||||
libexpat = AutotoolsProject(
|
||||
'https://github.com/libexpat/libexpat/releases/download/R_2_2_6/expat-2.2.6.tar.bz2',
|
||||
'17b43c2716d521369f82fc2dc70f359860e90fa440bea65b3b85f0b246ea81f2',
|
||||
'lib/libexpat.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
'--without-docbook',
|
||||
],
|
||||
)
|
||||
|
||||
libnfs = AutotoolsProject(
|
||||
'https://github.com/sahlberg/libnfs/archive/libnfs-3.0.0.tar.gz',
|
||||
'445d92c5fc55e4a5b115e358e60486cf8f87ee50e0103d46a02e7fb4618566a5',
|
||||
'lib/libnfs.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
'--disable-debug',
|
||||
|
||||
# work around -Wtautological-compare
|
||||
'--disable-werror',
|
||||
|
||||
'--disable-utils', '--disable-examples',
|
||||
],
|
||||
base='libnfs-libnfs-3.0.0',
|
||||
autoreconf=True,
|
||||
)
|
||||
|
||||
boost = BoostProject(
|
||||
'http://downloads.sourceforge.net/project/boost/boost/1.68.0/boost_1_68_0.tar.bz2',
|
||||
'7f6130bc3cf65f56a618888ce9d5ea704fa10b462be126ad053e80e553d6d8b7',
|
||||
'include/boost/version.hpp',
|
||||
)
|
||||
28
python/build/makeproject.py
Normal file
28
python/build/makeproject.py
Normal file
@@ -0,0 +1,28 @@
|
||||
import subprocess
|
||||
|
||||
from build.project import Project
|
||||
|
||||
class MakeProject(Project):
|
||||
def __init__(self, url, md5, installed,
|
||||
install_target='install',
|
||||
**kwargs):
|
||||
Project.__init__(self, url, md5, installed, **kwargs)
|
||||
self.install_target = install_target
|
||||
|
||||
def get_simultaneous_jobs(self):
|
||||
return 12
|
||||
|
||||
def get_make_args(self, toolchain):
|
||||
return ['--quiet', '-j' + str(self.get_simultaneous_jobs())]
|
||||
|
||||
def get_make_install_args(self, toolchain):
|
||||
return ['--quiet', self.install_target]
|
||||
|
||||
def make(self, toolchain, wd, args):
|
||||
subprocess.check_call(['/usr/bin/make'] + args,
|
||||
cwd=wd, env=toolchain.env)
|
||||
|
||||
def build(self, toolchain, wd, install=True):
|
||||
self.make(toolchain, wd, self.get_make_args(toolchain))
|
||||
if install:
|
||||
self.make(toolchain, wd, self.get_make_install_args(toolchain))
|
||||
111
python/build/meson.py
Normal file
111
python/build/meson.py
Normal file
@@ -0,0 +1,111 @@
|
||||
import os.path, subprocess, sys
|
||||
|
||||
from build.project import Project
|
||||
|
||||
def make_cross_file(toolchain):
|
||||
if toolchain.is_windows:
|
||||
system = 'windows'
|
||||
windres = "windres = '%s'" % toolchain.windres
|
||||
else:
|
||||
system = 'linux'
|
||||
windres = ''
|
||||
|
||||
if toolchain.is_arm:
|
||||
cpu_family = 'arm'
|
||||
if toolchain.is_armv7:
|
||||
cpu = 'armv7'
|
||||
else:
|
||||
cpu = 'armv6'
|
||||
elif toolchain.is_aarch64:
|
||||
cpu_family = 'aarch64'
|
||||
cpu = 'arm64-v8a'
|
||||
else:
|
||||
cpu_family = 'x86'
|
||||
if 'x86_64' in toolchain.arch:
|
||||
cpu = 'x86_64'
|
||||
else:
|
||||
cpu = 'i686'
|
||||
|
||||
# TODO: support more CPUs
|
||||
endian = 'little'
|
||||
|
||||
# TODO: write pkg-config wrapper
|
||||
|
||||
path = os.path.join(toolchain.build_path, 'meson.cross')
|
||||
os.makedirs(toolchain.build_path, exist_ok=True)
|
||||
with open(path, 'w') as f:
|
||||
f.write("""
|
||||
[binaries]
|
||||
c = '%s'
|
||||
cpp = '%s'
|
||||
ar = '%s'
|
||||
strip = '%s'
|
||||
pkgconfig = '%s'
|
||||
%s
|
||||
|
||||
[properties]
|
||||
root = '%s'
|
||||
|
||||
c_args = %s
|
||||
c_link_args = %s
|
||||
|
||||
cpp_args = %s
|
||||
cpp_link_args = %s
|
||||
|
||||
# Keep Meson from executing Android-x86 test binariees
|
||||
needs_exe_wrapper = true
|
||||
|
||||
[host_machine]
|
||||
system = '%s'
|
||||
cpu_family = '%s'
|
||||
cpu = '%s'
|
||||
endian = '%s'
|
||||
""" % (toolchain.cc, toolchain.cxx, toolchain.ar, toolchain.strip,
|
||||
toolchain.pkg_config,
|
||||
windres,
|
||||
toolchain.install_prefix,
|
||||
repr((toolchain.cppflags + ' ' + toolchain.cflags).split()),
|
||||
repr(toolchain.ldflags.split() + toolchain.libs.split()),
|
||||
repr((toolchain.cppflags + ' ' + toolchain.cxxflags).split()),
|
||||
repr(toolchain.ldflags.split() + toolchain.libs.split()),
|
||||
system, cpu_family, cpu, endian))
|
||||
return path
|
||||
|
||||
def configure(toolchain, src, build, args=()):
|
||||
cross_file = make_cross_file(toolchain)
|
||||
configure = [
|
||||
'meson',
|
||||
src, build,
|
||||
|
||||
'--prefix', toolchain.install_prefix,
|
||||
|
||||
# this is necessary because Meson uses Debian's build machine
|
||||
# MultiArch path (e.g. "lib/x86_64-linux-gnu") for cross
|
||||
# builds, which is obviously wrong
|
||||
'--libdir', 'lib',
|
||||
|
||||
'--buildtype', 'plain',
|
||||
|
||||
'--default-library=static',
|
||||
|
||||
'--cross-file', cross_file,
|
||||
] + args
|
||||
|
||||
subprocess.check_call(configure, env=toolchain.env)
|
||||
|
||||
class MesonProject(Project):
|
||||
def __init__(self, url, md5, installed, configure_args=[],
|
||||
**kwargs):
|
||||
Project.__init__(self, url, md5, installed, **kwargs)
|
||||
self.configure_args = configure_args
|
||||
|
||||
def configure(self, toolchain):
|
||||
src = self.unpack(toolchain)
|
||||
build = self.make_build_path(toolchain)
|
||||
configure(toolchain, src, build, self.configure_args)
|
||||
return build
|
||||
|
||||
def build(self, toolchain):
|
||||
build = self.configure(toolchain)
|
||||
subprocess.check_call(['ninja', 'install'],
|
||||
cwd=build, env=toolchain.env)
|
||||
81
python/build/project.py
Normal file
81
python/build/project.py
Normal file
@@ -0,0 +1,81 @@
|
||||
import os, shutil
|
||||
import re
|
||||
|
||||
from build.download import download_and_verify
|
||||
from build.tar import untar
|
||||
from build.quilt import push_all
|
||||
|
||||
class Project:
|
||||
def __init__(self, url, md5, installed, name=None, version=None,
|
||||
base=None,
|
||||
patches=None,
|
||||
edits=None,
|
||||
use_cxx=False):
|
||||
if base is None:
|
||||
basename = os.path.basename(url)
|
||||
m = re.match(r'^(.+)\.(tar(\.(gz|bz2|xz|lzma))?|zip)$', basename)
|
||||
if not m: raise
|
||||
self.base = m.group(1)
|
||||
else:
|
||||
self.base = base
|
||||
|
||||
if name is None or version is None:
|
||||
m = re.match(r'^([-\w]+)-(\d[\d.]*[a-z]?[\d.]*)$', self.base)
|
||||
if name is None: name = m.group(1)
|
||||
if version is None: version = m.group(2)
|
||||
|
||||
self.name = name
|
||||
self.version = version
|
||||
|
||||
self.url = url
|
||||
self.md5 = md5
|
||||
self.installed = installed
|
||||
|
||||
if patches is not None:
|
||||
srcdir = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
|
||||
patches = os.path.join(srcdir, patches)
|
||||
self.patches = patches
|
||||
self.edits = edits
|
||||
self.use_cxx = use_cxx
|
||||
|
||||
def download(self, toolchain):
|
||||
return download_and_verify(self.url, self.md5, toolchain.tarball_path)
|
||||
|
||||
def is_installed(self, toolchain):
|
||||
tarball = self.download(toolchain)
|
||||
installed = os.path.join(toolchain.install_prefix, self.installed)
|
||||
tarball_mtime = os.path.getmtime(tarball)
|
||||
try:
|
||||
return os.path.getmtime(installed) >= tarball_mtime
|
||||
except FileNotFoundError:
|
||||
return False
|
||||
|
||||
def unpack(self, toolchain, out_of_tree=True):
|
||||
if out_of_tree:
|
||||
parent_path = toolchain.src_path
|
||||
else:
|
||||
parent_path = toolchain.build_path
|
||||
path = untar(self.download(toolchain), parent_path, self.base)
|
||||
|
||||
if self.patches is not None:
|
||||
push_all(toolchain, path, self.patches)
|
||||
|
||||
if self.edits is not None:
|
||||
for filename, function in self.edits.items():
|
||||
with open(os.path.join(path, filename), 'r+t') as f:
|
||||
old_data = f.read()
|
||||
new_data = function(old_data)
|
||||
f.seek(0)
|
||||
f.truncate(0)
|
||||
f.write(new_data)
|
||||
|
||||
return path
|
||||
|
||||
def make_build_path(self, toolchain):
|
||||
path = os.path.join(toolchain.build_path, self.base)
|
||||
try:
|
||||
shutil.rmtree(path)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
os.makedirs(path, exist_ok=True)
|
||||
return path
|
||||
9
python/build/quilt.py
Normal file
9
python/build/quilt.py
Normal file
@@ -0,0 +1,9 @@
|
||||
import subprocess
|
||||
|
||||
def run_quilt(toolchain, cwd, patches_path, *args):
|
||||
env = dict(toolchain.env)
|
||||
env['QUILT_PATCHES'] = patches_path
|
||||
subprocess.check_call(['quilt'] + list(args), cwd=cwd, env=env)
|
||||
|
||||
def push_all(toolchain, src_path, patches_path):
|
||||
run_quilt(toolchain, src_path, patches_path, 'push', '-a')
|
||||
11
python/build/tar.py
Normal file
11
python/build/tar.py
Normal file
@@ -0,0 +1,11 @@
|
||||
import os, shutil, subprocess
|
||||
|
||||
def untar(tarball_path, parent_path, base):
|
||||
path = os.path.join(parent_path, base)
|
||||
try:
|
||||
shutil.rmtree(path)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
os.makedirs(parent_path, exist_ok=True)
|
||||
subprocess.check_call(['/bin/tar', 'xfC', tarball_path, parent_path])
|
||||
return path
|
||||
42
python/build/verify.py
Normal file
42
python/build/verify.py
Normal file
@@ -0,0 +1,42 @@
|
||||
import hashlib
|
||||
|
||||
def feed_file(h, f):
|
||||
"""Feed data read from an open file into the hashlib instance."""
|
||||
|
||||
while True:
|
||||
data = f.read(65536)
|
||||
if len(data) == 0:
|
||||
# end of file
|
||||
break
|
||||
h.update(data)
|
||||
|
||||
def feed_file_path(h, path):
|
||||
"""Feed data read from a file (to be opened by this function) into the hashlib instance."""
|
||||
|
||||
with open(path, 'rb') as f:
|
||||
feed_file(h, f)
|
||||
|
||||
def file_digest(algorithm, path):
|
||||
"""Calculate the digest of a file and return it in hexadecimal notation."""
|
||||
|
||||
h = algorithm()
|
||||
feed_file_path(h, path)
|
||||
return h.hexdigest()
|
||||
|
||||
def guess_digest_algorithm(digest):
|
||||
l = len(digest)
|
||||
if l == 32:
|
||||
return hashlib.md5
|
||||
elif l == 40:
|
||||
return hashlib.sha1
|
||||
elif l == 64:
|
||||
return hashlib.sha256
|
||||
else:
|
||||
return None
|
||||
|
||||
def verify_file_digest(path, expected_digest):
|
||||
"""Verify the digest of a file, and return True if the digest matches with the given expected digest."""
|
||||
|
||||
algorithm = guess_digest_algorithm(expected_digest)
|
||||
assert(algorithm is not None)
|
||||
return file_digest(algorithm, path) == expected_digest
|
||||
22
python/build/zlib.py
Normal file
22
python/build/zlib.py
Normal file
@@ -0,0 +1,22 @@
|
||||
import os.path, subprocess
|
||||
|
||||
from build.project import Project
|
||||
|
||||
class ZlibProject(Project):
|
||||
def __init__(self, url, md5, installed,
|
||||
**kwargs):
|
||||
Project.__init__(self, url, md5, installed, **kwargs)
|
||||
|
||||
def build(self, toolchain):
|
||||
src = self.unpack(toolchain, out_of_tree=False)
|
||||
|
||||
subprocess.check_call(['/usr/bin/make', '--quiet',
|
||||
'-f', 'win32/Makefile.gcc',
|
||||
'PREFIX=' + toolchain.arch + '-',
|
||||
'-j12',
|
||||
'install',
|
||||
'INCLUDE_PATH='+ os.path.join(toolchain.install_prefix, 'include'),
|
||||
'LIBRARY_PATH=' + os.path.join(toolchain.install_prefix, 'lib'),
|
||||
'BINARY_PATH=' + os.path.join(toolchain.install_prefix, 'bin'),
|
||||
],
|
||||
cwd=src, env=toolchain.env)
|
||||
@@ -1,25 +0,0 @@
|
||||
#!/bin/sh
|
||||
PWD=`pwd`
|
||||
|
||||
## If we're not in the scripts directory
|
||||
## assume the base directory.
|
||||
if test "`basename $PWD`" = "scripts"; then
|
||||
cd ../
|
||||
else
|
||||
MYOLDPWD=`pwd`
|
||||
cd `dirname $0`/../
|
||||
fi
|
||||
|
||||
if test -e Makefile
|
||||
then
|
||||
make distclean
|
||||
fi
|
||||
./autogen.sh
|
||||
make
|
||||
make dist
|
||||
|
||||
if test "`basename $PWD`" = "scripts"; then
|
||||
cd contrib/
|
||||
else
|
||||
cd $MYOLDPWD
|
||||
fi
|
||||
@@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
indent -npro -kr -i8 -ts8 -sob -l80 -ss -ncs -cdw -cd0 -c0 -cp0 "$@"
|
||||
|
||||
# there doesn't seem to be an indent switch for this, but this
|
||||
# forces goto labels to the left-most column, without indentation
|
||||
perl -i -p -e 's/^\s+(\w+):/$1:/g unless /^\s+default:/' "$@"
|
||||
@@ -1,93 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
#
|
||||
# This shell script tests the build of MPD with various compile-time
|
||||
# options.
|
||||
#
|
||||
# Author: Max Kellermann <max@duempel.org>
|
||||
|
||||
PREFIX=/tmp/mpd
|
||||
rm -rf $PREFIX
|
||||
|
||||
test "x$MAKE" != x || MAKE=make
|
||||
|
||||
export CFLAGS="-Os"
|
||||
|
||||
test -x configure || NOCONFIGURE=1 ./autogen.sh
|
||||
|
||||
# all features on
|
||||
./configure --prefix=$PREFIX/full \
|
||||
--disable-dependency-tracking --enable-debug --enable-werror \
|
||||
--enable-un \
|
||||
--enable-modplug \
|
||||
--enable-ao --enable-mikmod --enable-mvp
|
||||
$MAKE install
|
||||
$MAKE distclean
|
||||
|
||||
# no UN, no oggvorbis, no flac, enable oggflac
|
||||
./configure --prefix=$PREFIX/small \
|
||||
--disable-dependency-tracking --enable-debug --enable-werror \
|
||||
--disable-un \
|
||||
--disable-flac --disable-vorbis --enable-oggflac
|
||||
$MAKE install
|
||||
$MAKE distclean
|
||||
|
||||
# strip down (disable TCP, disable nearly all plugins)
|
||||
CFLAGS="$CFLAGS -DNDEBUG" \
|
||||
./configure --prefix=$PREFIX/tiny \
|
||||
--disable-dependency-tracking --disable-debug --enable-werror \
|
||||
--disable-tcp \
|
||||
--disable-curl \
|
||||
--disable-id3 --disable-lsr \
|
||||
--disable-ao --disable-alsa --disable-jack --disable-pulse --disable-fifo \
|
||||
--disable-shout-ogg --disable-shout-mp3 --disable-lame-encoder \
|
||||
--disable-ffmpeg --disable-wavpack --disable-mpc --disable-aac \
|
||||
--disable-flac --disable-vorbis --disable-oggflac --disable-audiofile \
|
||||
--disable-cue \
|
||||
--with-zeroconf=no
|
||||
$MAKE install
|
||||
$MAKE distclean
|
||||
|
||||
# shout: ogg without mp3
|
||||
# sndfile instead of modplug
|
||||
./configure --prefix=$PREFIX/shout_ogg \
|
||||
--disable-dependency-tracking --disable-debug --enable-werror \
|
||||
--disable-tcp \
|
||||
--disable-curl \
|
||||
--disable-id3 --disable-lsr \
|
||||
--disable-ao --disable-alsa --disable-jack --disable-pulse --disable-fifo \
|
||||
--enable-shout-ogg --disable-shout-mp3 --disable-lame-encoder \
|
||||
--disable-ffmpeg --disable-wavpack --disable-mpc --disable-aac \
|
||||
--disable-flac --enable-vorbis --disable-oggflac --disable-audiofile \
|
||||
--disable-modplug --enable-sndfile \
|
||||
--with-zeroconf=no
|
||||
$MAKE install
|
||||
$MAKE distclean
|
||||
|
||||
# shout: mp3 without ogg
|
||||
./configure --prefix=$PREFIX/shout_mp3 \
|
||||
--disable-dependency-tracking --disable-debug --enable-werror \
|
||||
--disable-tcp \
|
||||
--disable-curl \
|
||||
--disable-id3 --disable-lsr \
|
||||
--disable-ao --disable-alsa --disable-jack --disable-pulse --disable-fifo \
|
||||
--disable-shout-ogg --enable-shout-mp3 --enable-lame-encoder \
|
||||
--disable-ffmpeg --disable-wavpack --disable-mpc --disable-aac \
|
||||
--disable-flac --disable-vorbis --disable-oggflac --disable-audiofile \
|
||||
--with-zeroconf=no
|
||||
$MAKE install
|
||||
$MAKE distclean
|
||||
|
||||
# oggvorbis + oggflac
|
||||
./configure --prefix=$PREFIX/oggvorbisflac \
|
||||
--disable-dependency-tracking --disable-debug --enable-werror \
|
||||
--disable-tcp \
|
||||
--disable-curl \
|
||||
--disable-id3 --disable-lsr \
|
||||
--disable-mp3 \
|
||||
--disable-ao --disable-alsa --disable-jack --disable-pulse --disable-fifo \
|
||||
--disable-shout-ogg --disable-shout-mp3 --disable-lame-encoder \
|
||||
--disable-ffmpeg --disable-wavpack --disable-mpc --disable-aac \
|
||||
--disable-flac --enable-vorbis --enable-oggflac --disable-audiofile \
|
||||
--with-zeroconf=no
|
||||
$MAKE install
|
||||
$MAKE distclean
|
||||
@@ -33,6 +33,9 @@ struct Compressor {
|
||||
struct Compressor *Compressor_new(unsigned int history)
|
||||
{
|
||||
struct Compressor *obj = malloc(sizeof(struct Compressor));
|
||||
if (obj == NULL)
|
||||
/* out of memory, not much we can do */
|
||||
abort();
|
||||
|
||||
obj->prefs.target = TARGET;
|
||||
obj->prefs.maxgain = GAINMAX;
|
||||
@@ -61,6 +64,10 @@ void Compressor_delete(struct Compressor *obj)
|
||||
static int *resizeArray(int *data, int newsz, int oldsz)
|
||||
{
|
||||
data = realloc(data, newsz*sizeof(int));
|
||||
if (data == NULL)
|
||||
/* out of memory, not much we can do */
|
||||
abort();
|
||||
|
||||
if (newsz > oldsz)
|
||||
memset(data + oldsz, 0, sizeof(int)*(newsz - oldsz));
|
||||
return data;
|
||||
|
||||
@@ -19,6 +19,10 @@ struct CompressorConfig {
|
||||
|
||||
struct Compressor;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//! Create a new compressor (use history value of 0 for default)
|
||||
struct Compressor *Compressor_new(unsigned int history);
|
||||
|
||||
@@ -34,7 +38,12 @@ struct CompressorConfig *Compressor_getConfig(struct Compressor *);
|
||||
//! Process 16-bit signed data
|
||||
void Compressor_Process_int16(struct Compressor *, int16_t *data, unsigned int count);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
//! TODO: Compressor_Process_int32, Compressor_Process_float, others as needed
|
||||
|
||||
//! TODO: functions for getting at the peak/gain/clip history buffers (for monitoring)
|
||||
|
||||
#endif
|
||||
|
||||
75
src/AudioFormat.cxx
Normal file
75
src/AudioFormat.cxx
Normal file
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "AudioFormat.hxx"
|
||||
#include "util/StringBuffer.hxx"
|
||||
#include "util/StringFormat.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
void
|
||||
AudioFormat::ApplyMask(AudioFormat mask) noexcept
|
||||
{
|
||||
assert(IsValid());
|
||||
assert(mask.IsMaskValid());
|
||||
|
||||
if (mask.sample_rate != 0)
|
||||
sample_rate = mask.sample_rate;
|
||||
|
||||
if (mask.format != SampleFormat::UNDEFINED)
|
||||
format = mask.format;
|
||||
|
||||
if (mask.channels != 0)
|
||||
channels = mask.channels;
|
||||
|
||||
assert(IsValid());
|
||||
}
|
||||
|
||||
StringBuffer<24>
|
||||
ToString(const AudioFormat af) noexcept
|
||||
{
|
||||
StringBuffer<24> buffer;
|
||||
char *p = buffer.data();
|
||||
|
||||
if (af.format == SampleFormat::DSD && af.sample_rate > 0 &&
|
||||
af.sample_rate % 44100 == 0) {
|
||||
/* use shortcuts such as "dsd64" which implies the
|
||||
sample rate */
|
||||
p += sprintf(p, "dsd%u:", af.sample_rate * 8 / 44100);
|
||||
} else {
|
||||
const char *sample_format = af.format != SampleFormat::UNDEFINED
|
||||
? sample_format_to_string(af.format)
|
||||
: "*";
|
||||
|
||||
if (af.sample_rate > 0)
|
||||
p += sprintf(p, "%u:%s:", af.sample_rate,
|
||||
sample_format);
|
||||
else
|
||||
p += sprintf(p, "*:%s:", sample_format);
|
||||
}
|
||||
|
||||
if (af.channels > 0)
|
||||
p += sprintf(p, "%u", af.channels);
|
||||
else {
|
||||
*p++ = '*';
|
||||
*p = 0;
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
245
src/AudioFormat.hxx
Normal file
245
src/AudioFormat.hxx
Normal file
@@ -0,0 +1,245 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_AUDIO_FORMAT_HXX
|
||||
#define MPD_AUDIO_FORMAT_HXX
|
||||
|
||||
#include "pcm/SampleFormat.hxx"
|
||||
#include "util/Compiler.h"
|
||||
|
||||
#include <chrono>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
template<size_t CAPACITY> class StringBuffer;
|
||||
|
||||
static constexpr unsigned MAX_CHANNELS = 8;
|
||||
|
||||
/**
|
||||
* This structure describes the format of a raw PCM stream.
|
||||
*/
|
||||
struct AudioFormat {
|
||||
/**
|
||||
* The sample rate in Hz. A better name for this attribute is
|
||||
* "frame rate", because technically, you have two samples per
|
||||
* frame in stereo sound.
|
||||
*/
|
||||
uint32_t sample_rate;
|
||||
|
||||
/**
|
||||
* The format samples are stored in. See the #sample_format
|
||||
* enum for valid values.
|
||||
*/
|
||||
SampleFormat format;
|
||||
|
||||
/**
|
||||
* The number of channels.
|
||||
*
|
||||
* Channel order follows the FLAC convention
|
||||
* (https://xiph.org/flac/format.html):
|
||||
*
|
||||
* - 1 channel: mono
|
||||
* - 2 channels: left, right
|
||||
* - 3 channels: left, right, center
|
||||
* - 4 channels: front left, front right, back left, back right
|
||||
* - 5 channels: front left, front right, front center, back/surround left, back/surround right
|
||||
* - 6 channels: front left, front right, front center, LFE, back/surround left, back/surround right
|
||||
* - 7 channels: front left, front right, front center, LFE, back center, side left, side right
|
||||
* - 8 channels: front left, front right, front center, LFE, back left, back right, side left, side right
|
||||
*/
|
||||
uint8_t channels;
|
||||
|
||||
AudioFormat() = default;
|
||||
|
||||
constexpr AudioFormat(uint32_t _sample_rate,
|
||||
SampleFormat _format, uint8_t _channels)
|
||||
:sample_rate(_sample_rate),
|
||||
format(_format), channels(_channels) {}
|
||||
|
||||
static constexpr AudioFormat Undefined() {
|
||||
return AudioFormat(0, SampleFormat::UNDEFINED,0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears the object, i.e. sets all attributes to an undefined
|
||||
* (invalid) value.
|
||||
*/
|
||||
void Clear() {
|
||||
sample_rate = 0;
|
||||
format = SampleFormat::UNDEFINED;
|
||||
channels = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the object has a defined value.
|
||||
*/
|
||||
constexpr bool IsDefined() const {
|
||||
return sample_rate != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the object is full, i.e. all attributes are
|
||||
* defined. This is more complete than IsDefined(), but
|
||||
* slower.
|
||||
*/
|
||||
constexpr bool IsFullyDefined() const {
|
||||
return sample_rate != 0 && format != SampleFormat::UNDEFINED &&
|
||||
channels != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the object has at least one defined value.
|
||||
*/
|
||||
constexpr bool IsMaskDefined() const {
|
||||
return sample_rate != 0 || format != SampleFormat::UNDEFINED ||
|
||||
channels != 0;
|
||||
}
|
||||
|
||||
bool IsValid() const;
|
||||
bool IsMaskValid() const;
|
||||
|
||||
constexpr bool operator==(const AudioFormat other) const {
|
||||
return sample_rate == other.sample_rate &&
|
||||
format == other.format &&
|
||||
channels == other.channels;
|
||||
}
|
||||
|
||||
constexpr bool operator!=(const AudioFormat other) const {
|
||||
return !(*this == other);
|
||||
}
|
||||
|
||||
void ApplyMask(AudioFormat mask) noexcept;
|
||||
|
||||
gcc_pure
|
||||
AudioFormat WithMask(AudioFormat mask) const noexcept {
|
||||
AudioFormat result = *this;
|
||||
result.ApplyMask(mask);
|
||||
return result;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool MatchMask(AudioFormat mask) const noexcept {
|
||||
return WithMask(mask) == *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the size of each (mono) sample in bytes.
|
||||
*/
|
||||
unsigned GetSampleSize() const;
|
||||
|
||||
/**
|
||||
* Returns the size of each full frame in bytes.
|
||||
*/
|
||||
unsigned GetFrameSize() const;
|
||||
|
||||
template<typename D>
|
||||
constexpr auto TimeToFrames(D t) const noexcept {
|
||||
using Period = typename D::period;
|
||||
return ((t.count() * sample_rate) / Period::den) * Period::num;
|
||||
}
|
||||
|
||||
template<typename D>
|
||||
constexpr size_t TimeToSize(D t) const noexcept {
|
||||
return size_t(size_t(TimeToFrames(t)) * GetFrameSize());
|
||||
}
|
||||
|
||||
template<typename D>
|
||||
constexpr D FramesToTime(std::uintmax_t size) const noexcept {
|
||||
using Rep = typename D::rep;
|
||||
using Period = typename D::period;
|
||||
return D(((Rep(1) * size / Period::num) * Period::den) / sample_rate);
|
||||
}
|
||||
|
||||
template<typename D>
|
||||
constexpr D SizeToTime(std::uintmax_t size) const noexcept {
|
||||
return FramesToTime<D>(size / GetFrameSize());
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Checks whether the sample rate is valid.
|
||||
*
|
||||
* @param sample_rate the sample rate in Hz
|
||||
*/
|
||||
static constexpr inline bool
|
||||
audio_valid_sample_rate(unsigned sample_rate)
|
||||
{
|
||||
return sample_rate > 0 && sample_rate < (1 << 30);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the number of channels is valid.
|
||||
*/
|
||||
static constexpr inline bool
|
||||
audio_valid_channel_count(unsigned channels)
|
||||
{
|
||||
return channels >= 1 && channels <= MAX_CHANNELS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns false if the format is not valid for playback with MPD.
|
||||
* This function performs some basic validity checks.
|
||||
*/
|
||||
inline bool
|
||||
AudioFormat::IsValid() const
|
||||
{
|
||||
return audio_valid_sample_rate(sample_rate) &&
|
||||
audio_valid_sample_format(format) &&
|
||||
audio_valid_channel_count(channels);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns false if the format mask is not valid for playback with
|
||||
* MPD. This function performs some basic validity checks.
|
||||
*/
|
||||
inline bool
|
||||
AudioFormat::IsMaskValid() const
|
||||
{
|
||||
return (sample_rate == 0 ||
|
||||
audio_valid_sample_rate(sample_rate)) &&
|
||||
(format == SampleFormat::UNDEFINED ||
|
||||
audio_valid_sample_format(format)) &&
|
||||
(channels == 0 || audio_valid_channel_count(channels));
|
||||
}
|
||||
|
||||
inline unsigned
|
||||
AudioFormat::GetSampleSize() const
|
||||
{
|
||||
return sample_format_size(format);
|
||||
}
|
||||
|
||||
inline unsigned
|
||||
AudioFormat::GetFrameSize() const
|
||||
{
|
||||
return GetSampleSize() * channels;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the #AudioFormat object into a string, e.g. for printing
|
||||
* it in a log file.
|
||||
*
|
||||
* @param af the #AudioFormat object
|
||||
* @return the string buffer
|
||||
*/
|
||||
gcc_const
|
||||
StringBuffer<24>
|
||||
ToString(AudioFormat af) noexcept;
|
||||
|
||||
#endif
|
||||
188
src/AudioParser.cxx
Normal file
188
src/AudioParser.cxx
Normal file
@@ -0,0 +1,188 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Parser functions for audio related objects.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "AudioParser.hxx"
|
||||
#include "AudioFormat.hxx"
|
||||
#include "util/RuntimeError.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
static uint32_t
|
||||
ParseSampleRate(const char *src, bool mask, const char **endptr_r)
|
||||
{
|
||||
unsigned long value;
|
||||
char *endptr;
|
||||
|
||||
if (mask && *src == '*') {
|
||||
*endptr_r = src + 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
value = strtoul(src, &endptr, 10);
|
||||
if (endptr == src) {
|
||||
throw std::invalid_argument("Failed to parse the sample rate");
|
||||
} else if (!audio_valid_sample_rate(value))
|
||||
throw FormatInvalidArgument("Invalid sample rate: %lu", value);
|
||||
|
||||
*endptr_r = endptr;
|
||||
return value;
|
||||
}
|
||||
|
||||
static SampleFormat
|
||||
ParseSampleFormat(const char *src, bool mask, const char **endptr_r)
|
||||
{
|
||||
unsigned long value;
|
||||
char *endptr;
|
||||
SampleFormat sample_format;
|
||||
|
||||
if (mask && *src == '*') {
|
||||
*endptr_r = src + 1;
|
||||
return SampleFormat::UNDEFINED;
|
||||
}
|
||||
|
||||
if (*src == 'f') {
|
||||
*endptr_r = src + 1;
|
||||
return SampleFormat::FLOAT;
|
||||
}
|
||||
|
||||
if (memcmp(src, "dsd", 3) == 0) {
|
||||
*endptr_r = src + 3;
|
||||
return SampleFormat::DSD;
|
||||
}
|
||||
|
||||
value = strtoul(src, &endptr, 10);
|
||||
if (endptr == src)
|
||||
throw std::invalid_argument("Failed to parse the sample format");
|
||||
|
||||
switch (value) {
|
||||
case 8:
|
||||
sample_format = SampleFormat::S8;
|
||||
break;
|
||||
|
||||
case 16:
|
||||
sample_format = SampleFormat::S16;
|
||||
break;
|
||||
|
||||
case 24:
|
||||
if (memcmp(endptr, "_3", 2) == 0)
|
||||
/* for backwards compatibility */
|
||||
endptr += 2;
|
||||
|
||||
sample_format = SampleFormat::S24_P32;
|
||||
break;
|
||||
|
||||
case 32:
|
||||
sample_format = SampleFormat::S32;
|
||||
break;
|
||||
|
||||
default:
|
||||
throw FormatInvalidArgument("Invalid sample format: %lu",
|
||||
value);
|
||||
}
|
||||
|
||||
assert(audio_valid_sample_format(sample_format));
|
||||
|
||||
*endptr_r = endptr;
|
||||
return sample_format;
|
||||
}
|
||||
|
||||
static uint8_t
|
||||
ParseChannelCount(const char *src, bool mask, const char **endptr_r)
|
||||
{
|
||||
unsigned long value;
|
||||
char *endptr;
|
||||
|
||||
if (mask && *src == '*') {
|
||||
*endptr_r = src + 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
value = strtoul(src, &endptr, 10);
|
||||
if (endptr == src)
|
||||
throw std::invalid_argument("Failed to parse the channel count");
|
||||
else if (!audio_valid_channel_count(value))
|
||||
throw FormatInvalidArgument("Invalid channel count: %u",
|
||||
value);
|
||||
|
||||
*endptr_r = endptr;
|
||||
return value;
|
||||
}
|
||||
|
||||
AudioFormat
|
||||
ParseAudioFormat(const char *src, bool mask)
|
||||
{
|
||||
AudioFormat dest;
|
||||
dest.Clear();
|
||||
|
||||
if (strncmp(src, "dsd", 3) == 0) {
|
||||
/* allow format specifications such as "dsd64" which
|
||||
implies the sample rate */
|
||||
|
||||
char *endptr;
|
||||
auto dsd = strtoul(src + 3, &endptr, 10);
|
||||
if (endptr > src + 3 && *endptr == ':' &&
|
||||
dsd >= 32 && dsd <= 4096 && dsd % 2 == 0) {
|
||||
dest.sample_rate = dsd * 44100 / 8;
|
||||
dest.format = SampleFormat::DSD;
|
||||
|
||||
src = endptr + 1;
|
||||
dest.channels = ParseChannelCount(src, mask, &src);
|
||||
if (*src != 0)
|
||||
throw FormatInvalidArgument("Extra data after channel count: %s",
|
||||
src);
|
||||
|
||||
return dest;
|
||||
}
|
||||
}
|
||||
|
||||
/* parse sample rate */
|
||||
|
||||
dest.sample_rate = ParseSampleRate(src, mask, &src);
|
||||
|
||||
if (*src++ != ':')
|
||||
throw std::invalid_argument("Sample format missing");
|
||||
|
||||
/* parse sample format */
|
||||
|
||||
dest.format = ParseSampleFormat(src, mask, &src);
|
||||
|
||||
if (*src++ != ':')
|
||||
throw std::invalid_argument("Channel count missing");
|
||||
|
||||
/* parse channel count */
|
||||
|
||||
dest.channels = ParseChannelCount(src, mask, &src);
|
||||
|
||||
if (*src != 0)
|
||||
throw FormatInvalidArgument("Extra data after channel count: %s",
|
||||
src);
|
||||
|
||||
assert(mask
|
||||
? dest.IsMaskValid()
|
||||
: dest.IsValid());
|
||||
return dest;
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2003-2010 The Music Player Daemon Project
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -22,28 +22,21 @@
|
||||
* Parser functions for audio related objects.
|
||||
*/
|
||||
|
||||
#ifndef AUDIO_PARSER_H
|
||||
#define AUDIO_PARSER_H
|
||||
#ifndef MPD_AUDIO_PARSER_HXX
|
||||
#define MPD_AUDIO_PARSER_HXX
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
struct audio_format;
|
||||
struct AudioFormat;
|
||||
|
||||
/**
|
||||
* Parses a string in the form "SAMPLE_RATE:BITS:CHANNELS" into an
|
||||
* #audio_format.
|
||||
* #AudioFormat.
|
||||
*
|
||||
* Throws #std::runtime_error on error.
|
||||
*
|
||||
* @param dest the destination #audio_format struct
|
||||
* @param src the input string
|
||||
* @param mask if true, then "*" is allowed for any number of items
|
||||
* @param error_r location to store the error occuring, or NULL to
|
||||
* ignore errors
|
||||
* @return true on success
|
||||
*/
|
||||
bool
|
||||
audio_format_parse(struct audio_format *dest, const char *src,
|
||||
bool mask, GError **error_r);
|
||||
AudioFormat
|
||||
ParseAudioFormat(const char *src, bool mask);
|
||||
|
||||
#endif
|
||||
41
src/BulkEdit.hxx
Normal file
41
src/BulkEdit.hxx
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_BULK_EDIT_HXX
|
||||
#define MPD_BULK_EDIT_HXX
|
||||
|
||||
#include "Partition.hxx"
|
||||
|
||||
/**
|
||||
* Begin a "bulk edit" and commit it automatically.
|
||||
*/
|
||||
class ScopeBulkEdit {
|
||||
Partition &partition;
|
||||
|
||||
public:
|
||||
ScopeBulkEdit(Partition &_partition):partition(_partition) {
|
||||
partition.playlist.BeginBulk();
|
||||
}
|
||||
|
||||
~ScopeBulkEdit() {
|
||||
partition.playlist.CommitBulk(partition.pc);
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
62
src/CheckAudioFormat.cxx
Normal file
62
src/CheckAudioFormat.cxx
Normal file
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "CheckAudioFormat.hxx"
|
||||
#include "AudioFormat.hxx"
|
||||
#include "util/RuntimeError.hxx"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
void
|
||||
CheckSampleRate(unsigned long sample_rate)
|
||||
{
|
||||
if (!audio_valid_sample_rate(sample_rate))
|
||||
throw FormatRuntimeError("Invalid sample rate: %lu",
|
||||
sample_rate);
|
||||
}
|
||||
|
||||
void
|
||||
CheckSampleFormat(SampleFormat sample_format)
|
||||
{
|
||||
if (!audio_valid_sample_format(sample_format))
|
||||
throw FormatRuntimeError("Invalid sample format: %u",
|
||||
unsigned(sample_format));
|
||||
}
|
||||
|
||||
void
|
||||
CheckChannelCount(unsigned channels)
|
||||
{
|
||||
if (!audio_valid_channel_count(channels))
|
||||
throw FormatRuntimeError("Invalid channel count: %u",
|
||||
channels);
|
||||
}
|
||||
|
||||
AudioFormat
|
||||
CheckAudioFormat(unsigned long sample_rate,
|
||||
SampleFormat sample_format, unsigned channels)
|
||||
{
|
||||
CheckSampleRate(sample_rate);
|
||||
CheckSampleFormat(sample_format);
|
||||
CheckChannelCount(channels);
|
||||
|
||||
return AudioFormat(sample_rate, sample_format, channels);
|
||||
}
|
||||
44
src/CheckAudioFormat.hxx
Normal file
44
src/CheckAudioFormat.hxx
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_CHECK_AUDIO_FORMAT_HXX
|
||||
#define MPD_CHECK_AUDIO_FORMAT_HXX
|
||||
|
||||
#include "AudioFormat.hxx"
|
||||
|
||||
void
|
||||
CheckSampleRate(unsigned long sample_rate);
|
||||
|
||||
void
|
||||
CheckSampleFormat(SampleFormat sample_format);
|
||||
|
||||
void
|
||||
CheckChannelCount(unsigned sample_format);
|
||||
|
||||
/**
|
||||
* Check #AudioFormat attributes and construct an #AudioFormat
|
||||
* instance.
|
||||
*
|
||||
* Throws #std::runtime_error on error.
|
||||
*/
|
||||
AudioFormat
|
||||
CheckAudioFormat(unsigned long sample_rate,
|
||||
SampleFormat sample_format, unsigned channels);
|
||||
|
||||
#endif
|
||||
225
src/Chrono.hxx
Normal file
225
src/Chrono.hxx
Normal file
@@ -0,0 +1,225 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_CHRONO_HXX
|
||||
#define MPD_CHRONO_HXX
|
||||
|
||||
#include <chrono>
|
||||
#include <utility>
|
||||
#include <cstdint>
|
||||
|
||||
using FloatDuration = std::chrono::duration<double>;
|
||||
|
||||
/**
|
||||
* A time stamp within a song. Granularity is 1 millisecond and the
|
||||
* maximum value is about 49 days.
|
||||
*/
|
||||
class SongTime : public std::chrono::duration<std::uint32_t, std::milli> {
|
||||
typedef std::chrono::duration<std::uint32_t, std::milli> Base;
|
||||
|
||||
public:
|
||||
SongTime() = default;
|
||||
|
||||
template<typename T>
|
||||
explicit constexpr SongTime(T t):Base(t) {}
|
||||
|
||||
static constexpr SongTime zero() {
|
||||
return SongTime(Base::zero());
|
||||
}
|
||||
|
||||
template<typename D>
|
||||
static constexpr SongTime Cast(D src) {
|
||||
return SongTime(std::chrono::duration_cast<Base>(src));
|
||||
}
|
||||
|
||||
static constexpr SongTime FromS(unsigned s) {
|
||||
return SongTime(rep(s) * 1000);
|
||||
}
|
||||
|
||||
static constexpr SongTime FromS(float s) {
|
||||
return SongTime(rep(s * 1000));
|
||||
}
|
||||
|
||||
static constexpr SongTime FromS(double s) {
|
||||
return SongTime(rep(s * 1000));
|
||||
}
|
||||
|
||||
static constexpr SongTime FromMS(rep ms) {
|
||||
return SongTime(ms);
|
||||
}
|
||||
|
||||
constexpr rep ToS() const {
|
||||
return count() / rep(1000);
|
||||
}
|
||||
|
||||
constexpr rep RoundS() const {
|
||||
return (count() + 500) / rep(1000);
|
||||
}
|
||||
|
||||
constexpr rep ToMS() const {
|
||||
return count();
|
||||
}
|
||||
|
||||
template<typename T=rep>
|
||||
constexpr T ToScale(unsigned scale) const {
|
||||
return count() * T(scale) / 1000;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a scalar value with the given scale to a #SongTime
|
||||
* instance.
|
||||
*
|
||||
* @param value the input value
|
||||
* @param scale the value's scale in Hz
|
||||
*/
|
||||
template<typename T=rep>
|
||||
static constexpr SongTime FromScale(T value, unsigned scale) {
|
||||
return SongTime(value * T(1000) / T(scale));
|
||||
}
|
||||
|
||||
constexpr double ToDoubleS() const {
|
||||
return double(count()) / 1000.;
|
||||
};
|
||||
|
||||
constexpr bool IsZero() const {
|
||||
return count() == 0;
|
||||
}
|
||||
|
||||
constexpr bool IsPositive() const {
|
||||
return count() > 0;
|
||||
}
|
||||
|
||||
constexpr SongTime operator+(const SongTime &other) const {
|
||||
return SongTime(*(const Base *)this + (const Base &)other);
|
||||
}
|
||||
|
||||
constexpr SongTime operator-(const SongTime &other) const {
|
||||
return SongTime(*(const Base *)this - (const Base &)other);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* A variant of #SongTime that is based on a signed integer. It can
|
||||
* be used for relative values.
|
||||
*/
|
||||
class SignedSongTime : public std::chrono::duration<std::int32_t, std::milli> {
|
||||
typedef std::chrono::duration<std::int32_t, std::milli> Base;
|
||||
|
||||
public:
|
||||
SignedSongTime() = default;
|
||||
|
||||
template<typename T>
|
||||
explicit constexpr SignedSongTime(T t):Base(t) {}
|
||||
|
||||
/**
|
||||
* Allow implicit conversion from SongTime to SignedSongTime.
|
||||
*/
|
||||
constexpr SignedSongTime(SongTime t):Base(t) {}
|
||||
|
||||
static constexpr SignedSongTime zero() {
|
||||
return SignedSongTime(Base::zero());
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a negative value.
|
||||
*/
|
||||
static constexpr SignedSongTime Negative() {
|
||||
return SignedSongTime(-1);
|
||||
}
|
||||
|
||||
template<typename D>
|
||||
static constexpr SongTime Cast(D src) {
|
||||
return SongTime(std::chrono::duration_cast<Base>(src));
|
||||
}
|
||||
|
||||
static constexpr SignedSongTime FromS(int s) {
|
||||
return SignedSongTime(rep(s) * 1000);
|
||||
}
|
||||
|
||||
static constexpr SignedSongTime FromS(unsigned s) {
|
||||
return SignedSongTime(rep(s) * 1000);
|
||||
}
|
||||
|
||||
static constexpr SignedSongTime FromS(float s) {
|
||||
return SignedSongTime(rep(s * 1000));
|
||||
}
|
||||
|
||||
static constexpr SignedSongTime FromS(double s) {
|
||||
return SignedSongTime(rep(s * 1000));
|
||||
}
|
||||
|
||||
static constexpr SignedSongTime FromMS(rep ms) {
|
||||
return SignedSongTime(ms);
|
||||
}
|
||||
|
||||
constexpr rep ToS() const {
|
||||
return count() / rep(1000);
|
||||
}
|
||||
|
||||
constexpr rep RoundS() const {
|
||||
return (count() + 500) / rep(1000);
|
||||
}
|
||||
|
||||
constexpr rep ToMS() const {
|
||||
return count();
|
||||
}
|
||||
|
||||
template<typename T=rep>
|
||||
constexpr T ToScale(unsigned scale) const {
|
||||
return count() * T(scale) / 1000;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a scalar value with the given scale to a
|
||||
* #SignedSongTime instance.
|
||||
*
|
||||
* @param value the input value
|
||||
* @param scale the value's scale in Hz
|
||||
*/
|
||||
template<typename T=rep>
|
||||
static constexpr SignedSongTime FromScale(T value, unsigned scale) {
|
||||
return SignedSongTime(value * T(1000) / T(scale));
|
||||
}
|
||||
|
||||
constexpr double ToDoubleS() const {
|
||||
return double(count()) / 1000.;
|
||||
};
|
||||
|
||||
constexpr bool IsZero() const {
|
||||
return count() == 0;
|
||||
}
|
||||
|
||||
constexpr bool IsPositive() const {
|
||||
return count() > 0;
|
||||
}
|
||||
|
||||
constexpr bool IsNegative() const {
|
||||
return count() < 0;
|
||||
}
|
||||
|
||||
constexpr SignedSongTime operator+(const SignedSongTime &other) const {
|
||||
return SignedSongTime(*(const Base *)this + (const Base &)other);
|
||||
}
|
||||
|
||||
constexpr SignedSongTime operator-(const SignedSongTime &other) const {
|
||||
return SignedSongTime(*(const Base *)this - (const Base &)other);
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
415
src/CommandLine.cxx
Normal file
415
src/CommandLine.cxx
Normal file
@@ -0,0 +1,415 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "CommandLine.hxx"
|
||||
#include "GitVersion.hxx"
|
||||
#include "ls.hxx"
|
||||
#include "LogInit.hxx"
|
||||
#include "Log.hxx"
|
||||
#include "config/File.hxx"
|
||||
#include "decoder/DecoderList.hxx"
|
||||
#include "decoder/DecoderPlugin.hxx"
|
||||
#include "output/Registry.hxx"
|
||||
#include "output/OutputPlugin.hxx"
|
||||
#include "input/Registry.hxx"
|
||||
#include "input/InputPlugin.hxx"
|
||||
#include "playlist/PlaylistRegistry.hxx"
|
||||
#include "playlist/PlaylistPlugin.hxx"
|
||||
#include "fs/AllocatedPath.hxx"
|
||||
#include "fs/Traits.hxx"
|
||||
#include "fs/FileSystem.hxx"
|
||||
#include "fs/StandardDirectory.hxx"
|
||||
#include "system/Error.hxx"
|
||||
#include "util/Macros.hxx"
|
||||
#include "util/RuntimeError.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "util/OptionDef.hxx"
|
||||
#include "util/OptionParser.hxx"
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
#include "db/Registry.hxx"
|
||||
#include "db/DatabasePlugin.hxx"
|
||||
#include "storage/Registry.hxx"
|
||||
#include "storage/StoragePlugin.hxx"
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_NEIGHBOR_PLUGINS
|
||||
#include "neighbor/Registry.hxx"
|
||||
#include "neighbor/NeighborPlugin.hxx"
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_ENCODER
|
||||
#include "encoder/EncoderList.hxx"
|
||||
#include "encoder/EncoderPlugin.hxx"
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_ARCHIVE
|
||||
#include "archive/ArchiveList.hxx"
|
||||
#include "archive/ArchivePlugin.hxx"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
namespace {
|
||||
#ifdef _WIN32
|
||||
constexpr auto CONFIG_FILE_LOCATION = Path::FromFS(PATH_LITERAL("mpd\\mpd.conf"));
|
||||
constexpr auto APP_CONFIG_FILE_LOCATION = Path::FromFS(PATH_LITERAL("conf\\mpd.conf"));
|
||||
#else
|
||||
constexpr auto USER_CONFIG_FILE_LOCATION1 = Path::FromFS(PATH_LITERAL(".mpdconf"));
|
||||
constexpr auto USER_CONFIG_FILE_LOCATION2 = Path::FromFS(PATH_LITERAL(".mpd/mpd.conf"));
|
||||
constexpr auto USER_CONFIG_FILE_LOCATION_XDG = Path::FromFS(PATH_LITERAL("mpd/mpd.conf"));
|
||||
#endif
|
||||
}
|
||||
|
||||
enum Option {
|
||||
OPTION_KILL,
|
||||
OPTION_NO_CONFIG,
|
||||
OPTION_NO_DAEMON,
|
||||
OPTION_STDOUT,
|
||||
OPTION_STDERR,
|
||||
OPTION_VERBOSE,
|
||||
OPTION_VERSION,
|
||||
OPTION_HELP,
|
||||
OPTION_HELP2,
|
||||
};
|
||||
|
||||
static constexpr OptionDef option_defs[] = {
|
||||
{"kill", "kill the currently running mpd session"},
|
||||
{"no-config", "don't read from config"},
|
||||
{"no-daemon", "don't detach from console"},
|
||||
{"stdout", nullptr}, // hidden, compatibility with old versions
|
||||
{"stderr", "print messages to stderr"},
|
||||
{"verbose", 'v', "verbose logging"},
|
||||
{"version", 'V', "print version number"},
|
||||
{"help", 'h', "show help options"},
|
||||
{nullptr, '?', nullptr}, // hidden, standard alias for --help
|
||||
};
|
||||
|
||||
static constexpr Domain cmdline_domain("cmdline");
|
||||
|
||||
gcc_noreturn
|
||||
static void version(void)
|
||||
{
|
||||
printf("Music Player Daemon " VERSION " (%s)\n"
|
||||
"\n"
|
||||
"Copyright 2003-2007 Warren Dukes <warren.dukes@gmail.com>\n"
|
||||
"Copyright 2008-2018 Max Kellermann <max.kellermann@gmail.com>\n"
|
||||
"This is free software; see the source for copying conditions. There is NO\n"
|
||||
"warranty; not even MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
"\n"
|
||||
"Database plugins:\n",
|
||||
GIT_VERSION);
|
||||
|
||||
for (auto i = database_plugins; *i != nullptr; ++i)
|
||||
printf(" %s", (*i)->name);
|
||||
|
||||
printf("\n\n"
|
||||
"Storage plugins:\n");
|
||||
|
||||
for (auto i = storage_plugins; *i != nullptr; ++i)
|
||||
printf(" %s", (*i)->name);
|
||||
|
||||
printf("\n"
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_NEIGHBOR_PLUGINS
|
||||
"\n"
|
||||
"Neighbor plugins:\n");
|
||||
for (auto i = neighbor_plugins; *i != nullptr; ++i)
|
||||
printf(" %s", (*i)->name);
|
||||
|
||||
printf("\n"
|
||||
#endif
|
||||
|
||||
"\n"
|
||||
"Decoders plugins:\n");
|
||||
|
||||
decoder_plugins_for_each([](const DecoderPlugin &plugin){
|
||||
printf(" [%s]", plugin.name);
|
||||
|
||||
const char *const*suffixes = plugin.suffixes;
|
||||
if (suffixes != nullptr)
|
||||
for (; *suffixes != nullptr; ++suffixes)
|
||||
printf(" %s", *suffixes);
|
||||
|
||||
printf("\n");
|
||||
});
|
||||
|
||||
printf("\n"
|
||||
"Filters:\n"
|
||||
#ifdef ENABLE_LIBSAMPLERATE
|
||||
" libsamplerate"
|
||||
#endif
|
||||
#ifdef ENABLE_SOXR
|
||||
" soxr"
|
||||
#endif
|
||||
"\n\n"
|
||||
"Tag plugins:\n"
|
||||
#ifdef ENABLE_ID3TAG
|
||||
" id3tag"
|
||||
#endif
|
||||
"\n\n"
|
||||
"Output plugins:\n");
|
||||
audio_output_plugins_for_each(plugin)
|
||||
printf(" %s", plugin->name);
|
||||
printf("\n"
|
||||
|
||||
#ifdef ENABLE_ENCODER
|
||||
"\n"
|
||||
"Encoder plugins:\n");
|
||||
encoder_plugins_for_each(plugin)
|
||||
printf(" %s", plugin->name);
|
||||
printf("\n"
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_ARCHIVE
|
||||
"\n"
|
||||
"Archive plugins:\n");
|
||||
archive_plugins_for_each(plugin) {
|
||||
printf(" [%s]", plugin->name);
|
||||
|
||||
const char *const*suffixes = plugin->suffixes;
|
||||
if (suffixes != nullptr)
|
||||
for (; *suffixes != nullptr; ++suffixes)
|
||||
printf(" %s", *suffixes);
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
printf(""
|
||||
#endif
|
||||
|
||||
"\n"
|
||||
"Input plugins:\n"
|
||||
" file"
|
||||
#ifdef ENABLE_ARCHIVE
|
||||
" archive"
|
||||
#endif
|
||||
);
|
||||
input_plugins_for_each(plugin)
|
||||
printf(" %s", plugin->name);
|
||||
|
||||
printf("\n\n"
|
||||
"Playlist plugins:\n");
|
||||
playlist_plugins_for_each(plugin)
|
||||
printf(" %s", plugin->name);
|
||||
|
||||
printf("\n\n"
|
||||
"Protocols:\n");
|
||||
print_supported_uri_schemes_to_fp(stdout);
|
||||
|
||||
printf("\n"
|
||||
"Other features:\n"
|
||||
#ifdef HAVE_AVAHI
|
||||
" avahi"
|
||||
#endif
|
||||
#ifdef ENABLE_DBUS
|
||||
" dbus"
|
||||
#endif
|
||||
#ifdef ENABLE_UDISKS
|
||||
" udisks"
|
||||
#endif
|
||||
#ifdef USE_EPOLL
|
||||
" epoll"
|
||||
#endif
|
||||
#ifdef HAVE_ICONV
|
||||
" iconv"
|
||||
#endif
|
||||
#ifdef HAVE_ICU
|
||||
" icu"
|
||||
#endif
|
||||
#ifdef ENABLE_INOTIFY
|
||||
" inotify"
|
||||
#endif
|
||||
#ifdef HAVE_IPV6
|
||||
" ipv6"
|
||||
#endif
|
||||
#ifdef ENABLE_SYSTEMD_DAEMON
|
||||
" systemd"
|
||||
#endif
|
||||
#ifdef HAVE_TCP
|
||||
" tcp"
|
||||
#endif
|
||||
#ifdef HAVE_UN
|
||||
" un"
|
||||
#endif
|
||||
"\n");
|
||||
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
static void PrintOption(const OptionDef &opt)
|
||||
{
|
||||
if (opt.HasShortOption())
|
||||
printf(" -%c, --%-12s%s\n",
|
||||
opt.GetShortOption(),
|
||||
opt.GetLongOption(),
|
||||
opt.GetDescription());
|
||||
else
|
||||
printf(" --%-16s%s\n",
|
||||
opt.GetLongOption(),
|
||||
opt.GetDescription());
|
||||
}
|
||||
|
||||
gcc_noreturn
|
||||
static void help(void)
|
||||
{
|
||||
printf("Usage:\n"
|
||||
" mpd [OPTION...] [path/to/mpd.conf]\n"
|
||||
"\n"
|
||||
"Music Player Daemon - a daemon for playing music.\n"
|
||||
"\n"
|
||||
"Options:\n");
|
||||
|
||||
for (const auto &i : option_defs)
|
||||
if(i.HasDescription() == true) // hide hidden options from help print
|
||||
PrintOption(i);
|
||||
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
class ConfigLoader
|
||||
{
|
||||
ConfigData &config;
|
||||
|
||||
public:
|
||||
explicit ConfigLoader(ConfigData &_config) noexcept
|
||||
:config(_config) {}
|
||||
|
||||
bool TryFile(const Path path);
|
||||
bool TryFile(const AllocatedPath &base_path, Path path);
|
||||
};
|
||||
|
||||
bool ConfigLoader::TryFile(Path path)
|
||||
{
|
||||
if (FileExists(path)) {
|
||||
ReadConfigFile(config, path);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ConfigLoader::TryFile(const AllocatedPath &base_path, Path path)
|
||||
{
|
||||
if (base_path.IsNull())
|
||||
return false;
|
||||
auto full_path = base_path / path;
|
||||
return TryFile(full_path);
|
||||
}
|
||||
|
||||
void
|
||||
ParseCommandLine(int argc, char **argv, struct options &options,
|
||||
ConfigData &config)
|
||||
{
|
||||
bool use_config_file = true;
|
||||
|
||||
// First pass: handle command line options
|
||||
OptionParser parser(option_defs, argc, argv);
|
||||
while (auto o = parser.Next()) {
|
||||
switch (Option(o.index)) {
|
||||
case OPTION_KILL:
|
||||
options.kill = true;
|
||||
break;
|
||||
|
||||
case OPTION_NO_CONFIG:
|
||||
use_config_file = false;
|
||||
break;
|
||||
|
||||
case OPTION_NO_DAEMON:
|
||||
options.daemon = false;
|
||||
break;
|
||||
|
||||
case OPTION_STDOUT:
|
||||
case OPTION_STDERR:
|
||||
options.log_stderr = true;
|
||||
break;
|
||||
|
||||
case OPTION_VERBOSE:
|
||||
options.verbose = true;
|
||||
break;
|
||||
|
||||
case OPTION_VERSION:
|
||||
version();
|
||||
|
||||
case OPTION_HELP:
|
||||
case OPTION_HELP2:
|
||||
help();
|
||||
}
|
||||
}
|
||||
|
||||
/* initialize the logging library, so the configuration file
|
||||
parser can use it already */
|
||||
log_early_init(options.verbose);
|
||||
|
||||
if (!use_config_file) {
|
||||
LogDebug(cmdline_domain,
|
||||
"Ignoring config, using daemon defaults");
|
||||
return;
|
||||
}
|
||||
|
||||
// Second pass: find non-option parameters (i.e. config file)
|
||||
const char *config_file = nullptr;
|
||||
for (const char *i : parser.GetRemaining()) {
|
||||
if (config_file == nullptr) {
|
||||
config_file = i;
|
||||
continue;
|
||||
}
|
||||
|
||||
throw std::runtime_error("too many arguments");
|
||||
}
|
||||
|
||||
if (config_file != nullptr) {
|
||||
/* use specified configuration file */
|
||||
#ifdef _UNICODE
|
||||
wchar_t buffer[MAX_PATH];
|
||||
auto result = MultiByteToWideChar(CP_ACP, 0, config_file, -1,
|
||||
buffer, ARRAY_SIZE(buffer));
|
||||
if (result <= 0)
|
||||
throw MakeLastError("MultiByteToWideChar() failed");
|
||||
|
||||
ReadConfigFile(config, Path::FromFS(buffer));
|
||||
#else
|
||||
ReadConfigFile(config, Path::FromFS(config_file));
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
/* use default configuration file path */
|
||||
|
||||
ConfigLoader loader(config);
|
||||
|
||||
bool found =
|
||||
#ifdef _WIN32
|
||||
loader.TryFile(GetUserConfigDir(), CONFIG_FILE_LOCATION) ||
|
||||
loader.TryFile(GetSystemConfigDir(), CONFIG_FILE_LOCATION) ||
|
||||
loader.TryFile(GetAppBaseDir(), APP_CONFIG_FILE_LOCATION);
|
||||
#else
|
||||
loader.TryFile(GetUserConfigDir(),
|
||||
USER_CONFIG_FILE_LOCATION_XDG) ||
|
||||
loader.TryFile(GetHomeDir(), USER_CONFIG_FILE_LOCATION1) ||
|
||||
loader.TryFile(GetHomeDir(), USER_CONFIG_FILE_LOCATION2) ||
|
||||
loader.TryFile(Path::FromFS(SYSTEM_CONFIG_FILE_LOCATION));
|
||||
#endif
|
||||
if (!found)
|
||||
throw std::runtime_error("No configuration file found");
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2003-2010 The Music Player Daemon Project
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -17,22 +17,20 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef CMDLINE_H
|
||||
#define CMDLINE_H
|
||||
#ifndef MPD_COMMAND_LINE_HXX
|
||||
#define MPD_COMMAND_LINE_HXX
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
struct ConfigData;
|
||||
|
||||
struct options {
|
||||
gboolean kill;
|
||||
gboolean daemon;
|
||||
gboolean log_stderr;
|
||||
gboolean verbose;
|
||||
bool kill = false;
|
||||
bool daemon = true;
|
||||
bool log_stderr = false;
|
||||
bool verbose = false;
|
||||
};
|
||||
|
||||
bool
|
||||
parse_cmdline(int argc, char **argv, struct options *options,
|
||||
GError **error_r);
|
||||
void
|
||||
ParseCommandLine(int argc, char **argv, struct options &options,
|
||||
ConfigData &config);
|
||||
|
||||
#endif
|
||||
22
src/GitVersion.cxx
Normal file
22
src/GitVersion.cxx
Normal file
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "GitVersion.hxx"
|
||||
|
||||
char GIT_VERSION[] = "@VCS_TAG@";
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2003-2010 The Music Player Daemon Project
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -17,9 +17,9 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_SIG_HANDLERS_H
|
||||
#define MPD_SIG_HANDLERS_H
|
||||
#ifndef MPD_GIT_VERSION_HXX
|
||||
#define MPD_GIT_VERSION_HXX
|
||||
|
||||
void initSigHandlers(void);
|
||||
extern char GIT_VERSION[];
|
||||
|
||||
#endif
|
||||
251
src/IcyMetaDataParser.cxx
Normal file
251
src/IcyMetaDataParser.cxx
Normal file
@@ -0,0 +1,251 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "IcyMetaDataParser.hxx"
|
||||
#include "tag/Tag.hxx"
|
||||
#include "tag/Builder.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "util/StringView.hxx"
|
||||
#include "Log.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
static constexpr Domain icy_metadata_domain("icy_metadata");
|
||||
|
||||
void
|
||||
IcyMetaDataParser::Reset() noexcept
|
||||
{
|
||||
if (!IsDefined())
|
||||
return;
|
||||
|
||||
if (data_rest == 0 && meta_size > 0)
|
||||
delete[] meta_data;
|
||||
|
||||
tag.reset();
|
||||
|
||||
data_rest = data_size;
|
||||
meta_size = 0;
|
||||
}
|
||||
|
||||
size_t
|
||||
IcyMetaDataParser::Data(size_t length) noexcept
|
||||
{
|
||||
assert(length > 0);
|
||||
|
||||
if (!IsDefined())
|
||||
return length;
|
||||
|
||||
if (data_rest == 0)
|
||||
return 0;
|
||||
|
||||
if (length >= data_rest) {
|
||||
length = data_rest;
|
||||
data_rest = 0;
|
||||
} else
|
||||
data_rest -= length;
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
static void
|
||||
icy_add_item(TagBuilder &tag, TagType type, const char *value) noexcept
|
||||
{
|
||||
size_t length = strlen(value);
|
||||
|
||||
if (length >= 2 && value[0] == '\'' && value[length - 1] == '\'') {
|
||||
/* strip the single quotes */
|
||||
++value;
|
||||
length -= 2;
|
||||
}
|
||||
|
||||
if (length > 0)
|
||||
tag.AddItem(type, {value, length});
|
||||
}
|
||||
|
||||
static void
|
||||
icy_parse_tag_item(TagBuilder &tag,
|
||||
const char *name, const char *value) noexcept
|
||||
{
|
||||
if (strcmp(name, "StreamTitle") == 0)
|
||||
icy_add_item(tag, TAG_TITLE, value);
|
||||
else
|
||||
FormatDebug(icy_metadata_domain,
|
||||
"unknown icy-tag: '%s'", name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a single quote that is followed by a semicolon (or by the end
|
||||
* of the string). If that fails, return the first single quote. If
|
||||
* that also fails, return #end.
|
||||
*/
|
||||
static char *
|
||||
find_end_quote(char *p, char *const end) noexcept
|
||||
{
|
||||
char *fallback = std::find(p, end, '\'');
|
||||
if (fallback >= end - 1 || fallback[1] == ';')
|
||||
return fallback;
|
||||
|
||||
p = fallback + 1;
|
||||
while (true) {
|
||||
p = std::find(p, end, '\'');
|
||||
if (p == end)
|
||||
return fallback;
|
||||
|
||||
if (p == end - 1 || p[1] == ';')
|
||||
return p;
|
||||
|
||||
++p;
|
||||
}
|
||||
}
|
||||
|
||||
static std::unique_ptr<Tag>
|
||||
icy_parse_tag(char *p, char *const end) noexcept
|
||||
{
|
||||
assert(p != nullptr);
|
||||
assert(end != nullptr);
|
||||
assert(p <= end);
|
||||
|
||||
TagBuilder tag;
|
||||
|
||||
while (p != end) {
|
||||
const char *const name = p;
|
||||
char *eq = std::find(p, end, '=');
|
||||
if (eq == end)
|
||||
break;
|
||||
|
||||
*eq = 0;
|
||||
p = eq + 1;
|
||||
|
||||
if (*p != '\'') {
|
||||
/* syntax error; skip to the next semicolon,
|
||||
try to recover */
|
||||
char *semicolon = std::find(p, end, ';');
|
||||
if (semicolon == end)
|
||||
break;
|
||||
p = semicolon + 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
++p;
|
||||
|
||||
const char *const value = p;
|
||||
char *quote = find_end_quote(p, end);
|
||||
if (quote == end)
|
||||
break;
|
||||
|
||||
*quote = 0;
|
||||
p = quote + 1;
|
||||
|
||||
icy_parse_tag_item(tag, name, value);
|
||||
|
||||
char *semicolon = std::find(p, end, ';');
|
||||
if (semicolon == end)
|
||||
break;
|
||||
p = semicolon + 1;
|
||||
}
|
||||
|
||||
return tag.CommitNew();
|
||||
}
|
||||
|
||||
size_t
|
||||
IcyMetaDataParser::Meta(const void *data, size_t length) noexcept
|
||||
{
|
||||
const unsigned char *p = (const unsigned char *)data;
|
||||
|
||||
assert(IsDefined());
|
||||
assert(data_rest == 0);
|
||||
assert(length > 0);
|
||||
|
||||
if (meta_size == 0) {
|
||||
/* read meta_size from the first byte of a meta
|
||||
block */
|
||||
meta_size = *p++ * 16;
|
||||
if (meta_size == 0) {
|
||||
/* special case: no metadata */
|
||||
data_rest = data_size;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* 1 byte was consumed (must be re-added later for the
|
||||
return value */
|
||||
--length;
|
||||
|
||||
/* initialize metadata reader, allocate enough
|
||||
memory (+1 for the null terminator) */
|
||||
meta_position = 0;
|
||||
meta_data = new char[meta_size + 1];
|
||||
}
|
||||
|
||||
assert(meta_position < meta_size);
|
||||
|
||||
if (length > meta_size - meta_position)
|
||||
length = meta_size - meta_position;
|
||||
|
||||
memcpy(meta_data + meta_position, p, length);
|
||||
meta_position += length;
|
||||
|
||||
if (p != data)
|
||||
/* re-add the first byte (which contained meta_size) */
|
||||
++length;
|
||||
|
||||
if (meta_position == meta_size) {
|
||||
/* parse */
|
||||
|
||||
tag = icy_parse_tag(meta_data, meta_data + meta_size);
|
||||
delete[] meta_data;
|
||||
|
||||
/* change back to normal data mode */
|
||||
|
||||
meta_size = 0;
|
||||
data_rest = data_size;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
size_t
|
||||
IcyMetaDataParser::ParseInPlace(void *data, size_t length) noexcept
|
||||
{
|
||||
uint8_t *const dest0 = (uint8_t *)data;
|
||||
uint8_t *dest = dest0;
|
||||
const uint8_t *src = dest0;
|
||||
|
||||
while (length > 0) {
|
||||
size_t chunk = Data(length);
|
||||
if (chunk > 0) {
|
||||
memmove(dest, src, chunk);
|
||||
dest += chunk;
|
||||
src += chunk;
|
||||
length -= chunk;
|
||||
|
||||
if (length == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
chunk = Meta(src, length);
|
||||
if (chunk > 0) {
|
||||
src += chunk;
|
||||
length -= chunk;
|
||||
}
|
||||
}
|
||||
|
||||
return dest - dest0;
|
||||
}
|
||||
91
src/IcyMetaDataParser.hxx
Normal file
91
src/IcyMetaDataParser.hxx
Normal file
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_ICY_META_DATA_PARSER_HXX
|
||||
#define MPD_ICY_META_DATA_PARSER_HXX
|
||||
|
||||
#include "tag/Tag.hxx"
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
class IcyMetaDataParser {
|
||||
size_t data_size = 0, data_rest;
|
||||
|
||||
size_t meta_size, meta_position;
|
||||
char *meta_data;
|
||||
|
||||
std::unique_ptr<Tag> tag;
|
||||
|
||||
public:
|
||||
~IcyMetaDataParser() noexcept {
|
||||
Reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize an enabled icy_metadata object with the specified
|
||||
* data_size (from the icy-metaint HTTP response header).
|
||||
*/
|
||||
void Start(size_t _data_size) noexcept {
|
||||
data_size = data_rest = _data_size;
|
||||
meta_size = 0;
|
||||
tag = nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the icy_metadata. Call this after rewinding the stream.
|
||||
*/
|
||||
void Reset() noexcept;
|
||||
|
||||
/**
|
||||
* Checks whether the icy_metadata object is enabled.
|
||||
*/
|
||||
bool IsDefined() const noexcept {
|
||||
return data_size > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates data. Returns the number of bytes of normal data which
|
||||
* can be read by the caller, but not more than "length". If the
|
||||
* return value is smaller than "length", the caller should invoke
|
||||
* icy_meta().
|
||||
*/
|
||||
size_t Data(size_t length) noexcept;
|
||||
|
||||
/**
|
||||
* Reads metadata from the stream. Returns the number of bytes
|
||||
* consumed. If the return value is smaller than "length", the caller
|
||||
* should invoke icy_data().
|
||||
*/
|
||||
size_t Meta(const void *data, size_t length) noexcept;
|
||||
|
||||
/**
|
||||
* Parse data and eliminate metadata.
|
||||
*
|
||||
* @return the number of data bytes remaining in the buffer
|
||||
*/
|
||||
size_t ParseInPlace(void *data, size_t length) noexcept;
|
||||
|
||||
std::unique_ptr<Tag> ReadTag() noexcept {
|
||||
return std::exchange(tag, nullptr);
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
38
src/Idle.cxx
Normal file
38
src/Idle.cxx
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Support library for the "idle" command.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "Idle.hxx"
|
||||
#include "Main.hxx"
|
||||
#include "Instance.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
void
|
||||
idle_add(unsigned flags)
|
||||
{
|
||||
assert(flags != 0);
|
||||
|
||||
instance->EmitIdle(flags);
|
||||
}
|
||||
37
src/Idle.hxx
Normal file
37
src/Idle.hxx
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Support library for the "idle" command.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef MPD_IDLE_HXX
|
||||
#define MPD_IDLE_HXX
|
||||
|
||||
#include "IdleFlags.hxx"
|
||||
|
||||
/**
|
||||
* Adds idle flag (with bitwise "or") and queues notifications to all
|
||||
* clients.
|
||||
*/
|
||||
void
|
||||
idle_add(unsigned flags);
|
||||
|
||||
#endif
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2003-2010 The Music Player Daemon Project
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -23,14 +23,10 @@
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "idle.h"
|
||||
#include "event_pipe.h"
|
||||
#include "IdleFlags.hxx"
|
||||
#include "util/ASCII.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
#include <glib.h>
|
||||
|
||||
static unsigned idle_flags;
|
||||
static GMutex *idle_mutex = NULL;
|
||||
|
||||
static const char *const idle_names[] = {
|
||||
"database",
|
||||
@@ -42,51 +38,31 @@ static const char *const idle_names[] = {
|
||||
"options",
|
||||
"sticker",
|
||||
"update",
|
||||
NULL
|
||||
"subscription",
|
||||
"message",
|
||||
"neighbor",
|
||||
"mount",
|
||||
"partition",
|
||||
nullptr
|
||||
};
|
||||
|
||||
void
|
||||
idle_init(void)
|
||||
{
|
||||
g_assert(idle_mutex == NULL);
|
||||
idle_mutex = g_mutex_new();
|
||||
}
|
||||
|
||||
void
|
||||
idle_deinit(void)
|
||||
{
|
||||
g_assert(idle_mutex != NULL);
|
||||
g_mutex_free(idle_mutex);
|
||||
idle_mutex = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
idle_add(unsigned flags)
|
||||
{
|
||||
assert(flags != 0);
|
||||
|
||||
g_mutex_lock(idle_mutex);
|
||||
idle_flags |= flags;
|
||||
g_mutex_unlock(idle_mutex);
|
||||
|
||||
event_pipe_emit(PIPE_EVENT_IDLE);
|
||||
}
|
||||
|
||||
unsigned
|
||||
idle_get(void)
|
||||
{
|
||||
unsigned flags;
|
||||
|
||||
g_mutex_lock(idle_mutex);
|
||||
flags = idle_flags;
|
||||
idle_flags = 0;
|
||||
g_mutex_unlock(idle_mutex);
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
const char*const*
|
||||
idle_get_names(void)
|
||||
idle_get_names() noexcept
|
||||
{
|
||||
return idle_names;
|
||||
}
|
||||
|
||||
unsigned
|
||||
idle_parse_name(const char *name) noexcept
|
||||
{
|
||||
#if !CLANG_CHECK_VERSION(3,6)
|
||||
/* disabled on clang due to -Wtautological-pointer-compare */
|
||||
assert(name != nullptr);
|
||||
#endif
|
||||
|
||||
for (unsigned i = 0; idle_names[i] != nullptr; ++i)
|
||||
if (StringEqualsCaseASCII(name, idle_names[i]))
|
||||
return 1 << i;
|
||||
|
||||
return 0;
|
||||
}
|
||||
88
src/IdleFlags.hxx
Normal file
88
src/IdleFlags.hxx
Normal file
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Support library for the "idle" command.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef MPD_IDLE_FLAGS_HXX
|
||||
#define MPD_IDLE_FLAGS_HXX
|
||||
|
||||
#include "util/Compiler.h"
|
||||
|
||||
/** song database has been updated*/
|
||||
static constexpr unsigned IDLE_DATABASE = 0x1;
|
||||
|
||||
/** a stored playlist has been modified, created, deleted or
|
||||
renamed */
|
||||
static constexpr unsigned IDLE_STORED_PLAYLIST = 0x2;
|
||||
|
||||
/** the current playlist has been modified */
|
||||
static constexpr unsigned IDLE_PLAYLIST = 0x4;
|
||||
|
||||
/** the player state has changed: play, stop, pause, seek, ... */
|
||||
static constexpr unsigned IDLE_PLAYER = 0x8;
|
||||
|
||||
/** the volume has been modified */
|
||||
static constexpr unsigned IDLE_MIXER = 0x10;
|
||||
|
||||
/** an audio output device has been enabled or disabled */
|
||||
static constexpr unsigned IDLE_OUTPUT = 0x20;
|
||||
|
||||
/** options have changed: crossfade; random; repeat; ... */
|
||||
static constexpr unsigned IDLE_OPTIONS = 0x40;
|
||||
|
||||
/** a sticker has been modified. */
|
||||
static constexpr unsigned IDLE_STICKER = 0x80;
|
||||
|
||||
/** a database update has started or finished. */
|
||||
static constexpr unsigned IDLE_UPDATE = 0x100;
|
||||
|
||||
/** a client has subscribed or unsubscribed to/from a channel */
|
||||
static constexpr unsigned IDLE_SUBSCRIPTION = 0x200;
|
||||
|
||||
/** a message on the subscribed channel was received */
|
||||
static constexpr unsigned IDLE_MESSAGE = 0x400;
|
||||
|
||||
/** a neighbor was found or lost */
|
||||
static constexpr unsigned IDLE_NEIGHBOR = 0x800;
|
||||
|
||||
/** the mount list has changed */
|
||||
static constexpr unsigned IDLE_MOUNT = 0x1000;
|
||||
|
||||
/** the partition list has changed */
|
||||
static constexpr unsigned IDLE_PARTITION = 0x2000;
|
||||
|
||||
/**
|
||||
* Get idle names
|
||||
*/
|
||||
gcc_const
|
||||
const char*const*
|
||||
idle_get_names() noexcept;
|
||||
|
||||
/**
|
||||
* Parse an idle name and return its mask. Returns 0 if the given
|
||||
* name is unknown.
|
||||
*/
|
||||
gcc_nonnull_all gcc_pure
|
||||
unsigned
|
||||
idle_parse_name(const char *name) noexcept;
|
||||
|
||||
#endif
|
||||
153
src/Instance.cxx
Normal file
153
src/Instance.cxx
Normal file
@@ -0,0 +1,153 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "Instance.hxx"
|
||||
#include "Partition.hxx"
|
||||
#include "Idle.hxx"
|
||||
#include "Stats.hxx"
|
||||
|
||||
#ifdef ENABLE_CURL
|
||||
#include "RemoteTagCache.hxx"
|
||||
#include "util/UriUtil.hxx"
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
#include "db/DatabaseError.hxx"
|
||||
|
||||
#ifdef ENABLE_SQLITE
|
||||
#include "sticker/StickerDatabase.hxx"
|
||||
#include "sticker/SongSticker.hxx"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <exception>
|
||||
|
||||
Instance::Instance()
|
||||
:rtio_thread(true),
|
||||
#ifdef ENABLE_SYSTEMD_DAEMON
|
||||
systemd_watchdog(event_loop),
|
||||
#endif
|
||||
idle_monitor(event_loop, BIND_THIS_METHOD(OnIdle))
|
||||
{
|
||||
}
|
||||
|
||||
Instance::~Instance() noexcept = default;
|
||||
|
||||
Partition *
|
||||
Instance::FindPartition(const char *name) noexcept
|
||||
{
|
||||
for (auto &partition : partitions)
|
||||
if (partition.name == name)
|
||||
return &partition;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
|
||||
const Database &
|
||||
Instance::GetDatabaseOrThrow() const
|
||||
{
|
||||
if (database == nullptr)
|
||||
throw DatabaseError(DatabaseErrorCode::DISABLED,
|
||||
"No database");
|
||||
|
||||
return *database;
|
||||
}
|
||||
|
||||
void
|
||||
Instance::OnDatabaseModified()
|
||||
{
|
||||
assert(database != nullptr);
|
||||
|
||||
/* propagate the change to all subsystems */
|
||||
|
||||
stats_invalidate();
|
||||
|
||||
for (auto &partition : partitions)
|
||||
partition.DatabaseModified(*database);
|
||||
}
|
||||
|
||||
void
|
||||
Instance::OnDatabaseSongRemoved(const char *uri)
|
||||
{
|
||||
assert(database != nullptr);
|
||||
|
||||
#ifdef ENABLE_SQLITE
|
||||
/* if the song has a sticker, remove it */
|
||||
if (sticker_enabled()) {
|
||||
try {
|
||||
sticker_song_delete(uri);
|
||||
} catch (...) {
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
for (auto &partition : partitions)
|
||||
partition.StaleSong(uri);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_NEIGHBOR_PLUGINS
|
||||
|
||||
void
|
||||
Instance::FoundNeighbor(gcc_unused const NeighborInfo &info) noexcept
|
||||
{
|
||||
for (auto &partition : partitions)
|
||||
partition.EmitIdle(IDLE_NEIGHBOR);
|
||||
}
|
||||
|
||||
void
|
||||
Instance::LostNeighbor(gcc_unused const NeighborInfo &info) noexcept
|
||||
{
|
||||
for (auto &partition : partitions)
|
||||
partition.EmitIdle(IDLE_NEIGHBOR);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_CURL
|
||||
|
||||
void
|
||||
Instance::LookupRemoteTag(const char *uri) noexcept
|
||||
{
|
||||
if (!uri_has_scheme(uri))
|
||||
return;
|
||||
|
||||
if (!remote_tag_cache)
|
||||
remote_tag_cache = std::make_unique<RemoteTagCache>(event_loop,
|
||||
*this);
|
||||
|
||||
remote_tag_cache->Lookup(uri);
|
||||
}
|
||||
|
||||
void
|
||||
Instance::OnRemoteTag(const char *uri, const Tag &tag) noexcept
|
||||
{
|
||||
if (!tag.IsDefined())
|
||||
/* boring */
|
||||
return;
|
||||
|
||||
for (auto &partition : partitions)
|
||||
partition.TagModified(uri, tag);
|
||||
}
|
||||
|
||||
#endif
|
||||
203
src/Instance.hxx
Normal file
203
src/Instance.hxx
Normal file
@@ -0,0 +1,203 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_INSTANCE_HXX
|
||||
#define MPD_INSTANCE_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "event/Loop.hxx"
|
||||
#include "event/Thread.hxx"
|
||||
#include "event/MaskMonitor.hxx"
|
||||
#include "util/Compiler.h"
|
||||
|
||||
#ifdef ENABLE_SYSTEMD_DAEMON
|
||||
#include "lib/systemd/Watchdog.hxx"
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_CURL
|
||||
#include "RemoteTagCacheHandler.hxx"
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_NEIGHBOR_PLUGINS
|
||||
#include "neighbor/Listener.hxx"
|
||||
class NeighborGlue;
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
#include "db/DatabaseListener.hxx"
|
||||
class Database;
|
||||
class Storage;
|
||||
class UpdateService;
|
||||
#endif
|
||||
|
||||
#include <memory>
|
||||
#include <list>
|
||||
|
||||
class ClientList;
|
||||
struct Partition;
|
||||
class StateFile;
|
||||
class RemoteTagCache;
|
||||
|
||||
/**
|
||||
* A utility class which, when used as the first base class, ensures
|
||||
* that the #EventLoop gets initialized before the other base classes.
|
||||
*/
|
||||
struct EventLoopHolder {
|
||||
EventLoop event_loop;
|
||||
};
|
||||
|
||||
struct Instance final
|
||||
: EventLoopHolder
|
||||
#if defined(ENABLE_DATABASE) || defined(ENABLE_NEIGHBOR_PLUGINS)
|
||||
,
|
||||
#endif
|
||||
#ifdef ENABLE_DATABASE
|
||||
public DatabaseListener
|
||||
#ifdef ENABLE_NEIGHBOR_PLUGINS
|
||||
,
|
||||
#endif
|
||||
#endif
|
||||
#ifdef ENABLE_NEIGHBOR_PLUGINS
|
||||
public NeighborListener
|
||||
#endif
|
||||
#ifdef ENABLE_CURL
|
||||
, public RemoteTagCacheHandler
|
||||
#endif
|
||||
{
|
||||
/**
|
||||
* A thread running an #EventLoop for non-blocking (bulk) I/O.
|
||||
*/
|
||||
EventThread io_thread;
|
||||
|
||||
/**
|
||||
* Another thread running an #EventLoop for non-blocking
|
||||
* (real-time) I/O. This is used instead of #io_thread for
|
||||
* events which require low latency, e.g. for filling hardware
|
||||
* ring buffers.
|
||||
*/
|
||||
EventThread rtio_thread;
|
||||
|
||||
#ifdef ENABLE_SYSTEMD_DAEMON
|
||||
Systemd::Watchdog systemd_watchdog;
|
||||
#endif
|
||||
|
||||
MaskMonitor idle_monitor;
|
||||
|
||||
#ifdef ENABLE_NEIGHBOR_PLUGINS
|
||||
NeighborGlue *neighbors;
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
Database *database;
|
||||
|
||||
/**
|
||||
* This is really a #CompositeStorage. To avoid heavy include
|
||||
* dependencies, we declare it as just #Storage.
|
||||
*/
|
||||
Storage *storage = nullptr;
|
||||
|
||||
UpdateService *update = nullptr;
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_CURL
|
||||
std::unique_ptr<RemoteTagCache> remote_tag_cache;
|
||||
#endif
|
||||
|
||||
ClientList *client_list;
|
||||
|
||||
std::list<Partition> partitions;
|
||||
|
||||
StateFile *state_file = nullptr;
|
||||
|
||||
Instance();
|
||||
~Instance() noexcept;
|
||||
|
||||
/**
|
||||
* Wrapper for EventLoop::Break(). Call to initiate shutdown.
|
||||
*/
|
||||
void Break() {
|
||||
event_loop.Break();
|
||||
}
|
||||
|
||||
void EmitIdle(unsigned mask) {
|
||||
idle_monitor.OrMask(mask);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a #Partition with the given name. Returns nullptr if
|
||||
* no such partition was found.
|
||||
*/
|
||||
gcc_pure
|
||||
Partition *FindPartition(const char *name) noexcept;
|
||||
|
||||
void BeginShutdownPartitions() noexcept;
|
||||
void FinishShutdownPartitions() noexcept;
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
/**
|
||||
* Returns the global #Database instance. May return nullptr
|
||||
* if this MPD configuration has no database (no
|
||||
* music_directory was configured).
|
||||
*/
|
||||
Database *GetDatabase() {
|
||||
return database;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the global #Database instance. Throws
|
||||
* DatabaseError if this MPD configuration has no database (no
|
||||
* music_directory was configured).
|
||||
*/
|
||||
const Database &GetDatabaseOrThrow() const;
|
||||
#endif
|
||||
|
||||
void BeginShutdownUpdate() noexcept;
|
||||
void FinishShutdownUpdate() noexcept;
|
||||
void ShutdownDatabase() noexcept;
|
||||
|
||||
#ifdef ENABLE_CURL
|
||||
void LookupRemoteTag(const char *uri) noexcept;
|
||||
#else
|
||||
void LookupRemoteTag(const char *) noexcept {
|
||||
/* no-op */
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
#ifdef ENABLE_DATABASE
|
||||
void OnDatabaseModified() override;
|
||||
void OnDatabaseSongRemoved(const char *uri) override;
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_NEIGHBOR_PLUGINS
|
||||
/* virtual methods from class NeighborListener */
|
||||
void FoundNeighbor(const NeighborInfo &info) noexcept override;
|
||||
void LostNeighbor(const NeighborInfo &info) noexcept override;
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_CURL
|
||||
/* virtual methods from class RemoteTagCacheHandler */
|
||||
void OnRemoteTag(const char *uri, const Tag &tag) noexcept override;
|
||||
#endif
|
||||
|
||||
/* callback for #idle_monitor */
|
||||
void OnIdle(unsigned mask);
|
||||
};
|
||||
|
||||
#endif
|
||||
161
src/Listen.cxx
Normal file
161
src/Listen.cxx
Normal file
@@ -0,0 +1,161 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "Listen.hxx"
|
||||
#include "Log.hxx"
|
||||
#include "client/Listener.hxx"
|
||||
#include "config/Param.hxx"
|
||||
#include "config/Data.hxx"
|
||||
#include "config/Option.hxx"
|
||||
#include "config/Net.hxx"
|
||||
#include "net/AllocatedSocketAddress.hxx"
|
||||
#include "net/UniqueSocketDescriptor.hxx"
|
||||
#include "net/SocketUtil.hxx"
|
||||
#include "system/Error.hxx"
|
||||
#include "util/RuntimeError.hxx"
|
||||
#include "fs/AllocatedPath.hxx"
|
||||
#include "fs/XDG.hxx"
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef ENABLE_SYSTEMD_DAEMON
|
||||
#include <systemd/sd-daemon.h>
|
||||
#endif
|
||||
|
||||
#define DEFAULT_PORT 6600
|
||||
|
||||
int listen_port;
|
||||
|
||||
#ifdef ENABLE_SYSTEMD_DAEMON
|
||||
|
||||
static bool
|
||||
listen_systemd_activation(ClientListener &listener)
|
||||
{
|
||||
int n = sd_listen_fds(true);
|
||||
if (n <= 0) {
|
||||
if (n < 0)
|
||||
throw MakeErrno(-n, "sd_listen_fds() failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int i = SD_LISTEN_FDS_START, end = SD_LISTEN_FDS_START + n;
|
||||
i != end; ++i)
|
||||
listener.AddFD(UniqueSocketDescriptor(i));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Listen on "$XDG_RUNTIME_DIR/mpd/socket" (if applicable).
|
||||
*
|
||||
* @return true if a listener socket was added
|
||||
*/
|
||||
static bool
|
||||
ListenXdgRuntimeDir(ClientListener &listener) noexcept
|
||||
{
|
||||
#if defined(USE_XDG) && defined(HAVE_UN)
|
||||
if (geteuid() == 0)
|
||||
/* this MPD instance is a system-wide daemon; don't
|
||||
use $XDG_RUNTIME_DIR */
|
||||
return false;
|
||||
|
||||
Path xdg_runtime_dir = Path::FromFS(getenv("XDG_RUNTIME_DIR"));
|
||||
if (xdg_runtime_dir.IsNull())
|
||||
return false;
|
||||
|
||||
const auto mpd_runtime_dir = xdg_runtime_dir / Path::FromFS("mpd");
|
||||
mkdir(mpd_runtime_dir.c_str(), 0700);
|
||||
|
||||
const auto socket_path = mpd_runtime_dir / Path::FromFS("socket");
|
||||
unlink(socket_path.c_str());
|
||||
|
||||
AllocatedSocketAddress address;
|
||||
address.SetLocal(socket_path.c_str());
|
||||
|
||||
try {
|
||||
auto fd = socket_bind_listen(AF_LOCAL, SOCK_STREAM, 0,
|
||||
address, 5);
|
||||
chmod(socket_path.c_str(), 0600);
|
||||
listener.AddFD(std::move(fd), std::move(address));
|
||||
return true;
|
||||
} catch (...) {
|
||||
FormatError(std::current_exception(),
|
||||
"Failed to listen on '%s' (not fatal)",
|
||||
socket_path.c_str());
|
||||
return false;
|
||||
}
|
||||
#else
|
||||
(void)listener;
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
listen_global_init(const ConfigData &config, ClientListener &listener)
|
||||
{
|
||||
int port = config.GetPositive(ConfigOption::PORT, DEFAULT_PORT);
|
||||
|
||||
#ifdef ENABLE_SYSTEMD_DAEMON
|
||||
if (listen_systemd_activation(listener))
|
||||
return;
|
||||
#endif
|
||||
|
||||
for (const auto ¶m : config.GetParamList(ConfigOption::BIND_TO_ADDRESS)) {
|
||||
try {
|
||||
ServerSocketAddGeneric(listener, param.value.c_str(),
|
||||
port);
|
||||
} catch (...) {
|
||||
std::throw_with_nested(FormatRuntimeError("Failed to listen on %s (line %i)",
|
||||
param.value.c_str(),
|
||||
param.line));
|
||||
}
|
||||
}
|
||||
|
||||
bool have_xdg_runtime_listener = false;
|
||||
|
||||
if (listener.IsEmpty()) {
|
||||
/* no "bind_to_address" configured, bind the
|
||||
configured port on all interfaces */
|
||||
|
||||
have_xdg_runtime_listener = ListenXdgRuntimeDir(listener);
|
||||
|
||||
try {
|
||||
listener.AddPort(port);
|
||||
} catch (...) {
|
||||
std::throw_with_nested(FormatRuntimeError("Failed to listen on *:%d: ", port));
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
listener.Open();
|
||||
} catch (...) {
|
||||
if (have_xdg_runtime_listener)
|
||||
LogError(std::current_exception(),
|
||||
"Default TCP listener setup failed, but this is okay because we have a $XDG_RUNTIME_DIR listener");
|
||||
else
|
||||
throw;
|
||||
}
|
||||
|
||||
listen_port = port;
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2003-2010 The Music Player Daemon Project
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -17,18 +17,15 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_LISTEN_H
|
||||
#define MPD_LISTEN_H
|
||||
#ifndef MPD_LISTEN_HXX
|
||||
#define MPD_LISTEN_HXX
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
struct ConfigData;
|
||||
class ClientListener;
|
||||
|
||||
extern int listen_port;
|
||||
|
||||
bool
|
||||
listen_global_init(GError **error_r);
|
||||
|
||||
void listen_global_finish(void);
|
||||
void
|
||||
listen_global_init(const ConfigData &config, ClientListener &listener);
|
||||
|
||||
#endif
|
||||
110
src/LocateUri.cxx
Normal file
110
src/LocateUri.cxx
Normal file
@@ -0,0 +1,110 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "LocateUri.hxx"
|
||||
#include "client/Client.hxx"
|
||||
#include "fs/AllocatedPath.hxx"
|
||||
#include "ls.hxx"
|
||||
#include "util/UriUtil.hxx"
|
||||
#include "util/ASCII.hxx"
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
#include "storage/StorageInterface.hxx"
|
||||
#endif
|
||||
|
||||
static LocatedUri
|
||||
LocateFileUri(const char *uri, const Client *client
|
||||
#ifdef ENABLE_DATABASE
|
||||
, const Storage *storage
|
||||
#endif
|
||||
)
|
||||
{
|
||||
auto path = AllocatedPath::FromUTF8Throw(uri);
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
if (storage != nullptr) {
|
||||
const char *suffix = storage->MapToRelativeUTF8(uri);
|
||||
if (suffix != nullptr)
|
||||
/* this path was relative to the music
|
||||
directory */
|
||||
return LocatedUri(LocatedUri::Type::RELATIVE, suffix);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (client != nullptr)
|
||||
client->AllowFile(path);
|
||||
|
||||
return LocatedUri(LocatedUri::Type::PATH, uri, std::move(path));
|
||||
}
|
||||
|
||||
static LocatedUri
|
||||
LocateAbsoluteUri(const char *uri
|
||||
#ifdef ENABLE_DATABASE
|
||||
, const Storage *storage
|
||||
#endif
|
||||
)
|
||||
{
|
||||
if (!uri_supported_scheme(uri))
|
||||
throw std::runtime_error("Unsupported URI scheme");
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
if (storage != nullptr) {
|
||||
const char *suffix = storage->MapToRelativeUTF8(uri);
|
||||
if (suffix != nullptr)
|
||||
return LocatedUri(LocatedUri::Type::RELATIVE, suffix);
|
||||
}
|
||||
#endif
|
||||
|
||||
return LocatedUri(LocatedUri::Type::ABSOLUTE, uri);
|
||||
}
|
||||
|
||||
LocatedUri
|
||||
LocateUri(const char *uri, const Client *client
|
||||
#ifdef ENABLE_DATABASE
|
||||
, const Storage *storage
|
||||
#endif
|
||||
)
|
||||
{
|
||||
/* skip the obsolete "file://" prefix */
|
||||
const char *path_utf8 = StringAfterPrefixCaseASCII(uri, "file://");
|
||||
if (path_utf8 != nullptr) {
|
||||
if (!PathTraitsUTF8::IsAbsolute(path_utf8))
|
||||
throw std::runtime_error("Malformed file:// URI");
|
||||
|
||||
return LocateFileUri(path_utf8, client
|
||||
#ifdef ENABLE_DATABASE
|
||||
, storage
|
||||
#endif
|
||||
);
|
||||
} else if (PathTraitsUTF8::IsAbsolute(uri))
|
||||
return LocateFileUri(uri, client
|
||||
#ifdef ENABLE_DATABASE
|
||||
, storage
|
||||
#endif
|
||||
);
|
||||
else if (uri_has_scheme(uri))
|
||||
return LocateAbsoluteUri(uri
|
||||
#ifdef ENABLE_DATABASE
|
||||
, storage
|
||||
#endif
|
||||
);
|
||||
else
|
||||
return LocatedUri(LocatedUri::Type::RELATIVE, uri);
|
||||
}
|
||||
93
src/LocateUri.hxx
Normal file
93
src/LocateUri.hxx
Normal file
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* Copyright 2003-2018 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_LOCATE_URI_HXX
|
||||
#define MPD_LOCATE_URI_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "util/Compiler.h"
|
||||
#include "fs/AllocatedPath.hxx"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
/* damn you, windows.h! */
|
||||
#ifdef ABSOLUTE
|
||||
#undef ABSOLUTE
|
||||
#endif
|
||||
#ifdef RELATIVE
|
||||
#undef RELATIVE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
class Client;
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
class Storage;
|
||||
#endif
|
||||
|
||||
struct LocatedUri {
|
||||
enum class Type {
|
||||
/**
|
||||
* An absolute URI with a supported scheme.
|
||||
*/
|
||||
ABSOLUTE,
|
||||
|
||||
/**
|
||||
* A relative URI path.
|
||||
*/
|
||||
RELATIVE,
|
||||
|
||||
/**
|
||||
* A local file. The #path attribute is valid.
|
||||
*/
|
||||
PATH,
|
||||
} type;
|
||||
|
||||
const char *canonical_uri;
|
||||
|
||||
/**
|
||||
* Contains the local file path if type==FILE.
|
||||
*/
|
||||
AllocatedPath path;
|
||||
|
||||
LocatedUri(Type _type, const char *_uri,
|
||||
AllocatedPath &&_path=nullptr)
|
||||
:type(_type), canonical_uri(_uri), path(std::move(_path)) {}
|
||||
};
|
||||
|
||||
/**
|
||||
* Classify a URI.
|
||||
*
|
||||
* Throws #std::runtime_error on error.
|
||||
*
|
||||
* @param client the #Client that is used to determine whether a local
|
||||
* file is allowed; nullptr disables the check and allows all local
|
||||
* files
|
||||
* @param storage a #Storage instance which may be used to convert
|
||||
* absolute URIs to relative ones, using Storage::MapToRelativeUTF8();
|
||||
* that feature is disabled if this parameter is nullptr
|
||||
*/
|
||||
LocatedUri
|
||||
LocateUri(const char *uri, const Client *client
|
||||
#ifdef ENABLE_DATABASE
|
||||
, const Storage *storage
|
||||
#endif
|
||||
);
|
||||
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user