mirror of
https://github.com/nghttp2/nghttp2.git
synced 2026-03-29 09:19:18 +08:00
Compare commits
7350 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0880de4668 | ||
|
|
e4454672f0 | ||
|
|
e15a5517c7 | ||
|
|
9b0044d051 | ||
|
|
e9e5e15bbf | ||
|
|
2c7ef6442d | ||
|
|
d3ecf78031 | ||
|
|
d01db47215 | ||
|
|
8a760d0726 | ||
|
|
73bfe4bf21 | ||
|
|
6e5e9bceca | ||
|
|
0476f0efbc | ||
|
|
ca23a490c3 | ||
|
|
ee2a4b625b | ||
|
|
cec4bf08a2 | ||
|
|
ebf4b7eaee | ||
|
|
0bf5b764fa | ||
|
|
081eb29e9f | ||
|
|
ca81d89fe1 | ||
|
|
450ed6afce | ||
|
|
e72f4af5de | ||
|
|
3fa6a6349c | ||
|
|
6c0fd9400d | ||
|
|
de81da7621 | ||
|
|
8593b1f46c | ||
|
|
0e9d325dee | ||
|
|
534b74b725 | ||
|
|
090c7fe26c | ||
|
|
527cdebfee | ||
|
|
a2667a6692 | ||
|
|
aedc348754 | ||
|
|
19fbcf5238 | ||
|
|
6fe99003df | ||
|
|
0139746d53 | ||
|
|
8dd0c86bde | ||
|
|
5d4df477e8 | ||
|
|
2b355a338c | ||
|
|
cfeec12a52 | ||
|
|
26e2d53536 | ||
|
|
d921c54209 | ||
|
|
8f729331c1 | ||
|
|
a25dd12811 | ||
|
|
2f1565b0e2 | ||
|
|
389ae66d12 | ||
|
|
a60e00c628 | ||
|
|
53ce088694 | ||
|
|
e802ccc02a | ||
|
|
17428a5d09 | ||
|
|
83683742f1 | ||
|
|
fa585e9182 | ||
|
|
7434a37016 | ||
|
|
a2c47748f0 | ||
|
|
1784c1c0d1 | ||
|
|
59a9534a2d | ||
|
|
7fcbcd786e | ||
|
|
4e0738d24a | ||
|
|
1e0413f4a6 | ||
|
|
06e7219d10 | ||
|
|
c06c069126 | ||
|
|
d8ed2559f6 | ||
|
|
d829be3517 | ||
|
|
6aa9f6c72e | ||
|
|
4181fffc02 | ||
|
|
8f8eef40e8 | ||
|
|
3a95bf47f3 | ||
|
|
c218d441ea | ||
|
|
1952b166e9 | ||
|
|
bcfb5d8305 | ||
|
|
37fb82621c | ||
|
|
00bd05edcc | ||
|
|
45c67616b9 | ||
|
|
d94ce2a557 | ||
|
|
8a5c731533 | ||
|
|
6dfb3bdb8f | ||
|
|
43649c8004 | ||
|
|
b35fa94ba5 | ||
|
|
ee6565feb7 | ||
|
|
7caa11f09e | ||
|
|
cb73b18a53 | ||
|
|
4da70b34d1 | ||
|
|
cd868f00b9 | ||
|
|
9fc31cfd16 | ||
|
|
e9f04ae0ad | ||
|
|
5e75f0ac81 | ||
|
|
8c3f077c5e | ||
|
|
9cbe936a25 | ||
|
|
b815972b03 | ||
|
|
59b6d0d1d9 | ||
|
|
028eeeefeb | ||
|
|
1feb3679fe | ||
|
|
b00d8da2e2 | ||
|
|
9df3962d08 | ||
|
|
304bfcbb70 | ||
|
|
280845e52e | ||
|
|
bdc5d5a6d1 | ||
|
|
c9ff3599de | ||
|
|
15912bf810 | ||
|
|
9e65104b00 | ||
|
|
80ecefebb5 | ||
|
|
43b4369fba | ||
|
|
89b30903cc | ||
|
|
4904c736e1 | ||
|
|
3b45a19423 | ||
|
|
fbf4a7b750 | ||
|
|
2a190bf5ee | ||
|
|
877a78186c | ||
|
|
3d363ae478 | ||
|
|
73141a7698 | ||
|
|
eacf3484ca | ||
|
|
45ac57609b | ||
|
|
3190d030f7 | ||
|
|
6979a07da6 | ||
|
|
768e383662 | ||
|
|
6fd2f9e027 | ||
|
|
54359802fa | ||
|
|
bc57689f17 | ||
|
|
3ae75e840e | ||
|
|
7f79fbfa3e | ||
|
|
4c10abe99e | ||
|
|
2fed8b4945 | ||
|
|
f266ee500d | ||
|
|
708912fe20 | ||
|
|
f90a801609 | ||
|
|
107b7814fa | ||
|
|
bd70a1546c | ||
|
|
6e660ddc4b | ||
|
|
ea28e672ae | ||
|
|
fe8685e37f | ||
|
|
62c12b673b | ||
|
|
9ba0b7fde0 | ||
|
|
f9f5db5b6a | ||
|
|
7ef3a91d9b | ||
|
|
e435050378 | ||
|
|
8f5b450237 | ||
|
|
5f5fdc780f | ||
|
|
fd48570e7f | ||
|
|
daa4260f61 | ||
|
|
451853f39b | ||
|
|
dfab53ef65 | ||
|
|
5d4d517535 | ||
|
|
c36b8ee88a | ||
|
|
2e84de0be9 | ||
|
|
e18beaa3bd | ||
|
|
4890cb0fb8 | ||
|
|
06fb688be2 | ||
|
|
56d5406bce | ||
|
|
0196b2cc03 | ||
|
|
de7da99453 | ||
|
|
40124de400 | ||
|
|
6d7f80ed7f | ||
|
|
7bf98f2729 | ||
|
|
e434b74e50 | ||
|
|
7784fa979d | ||
|
|
8391ae7a57 | ||
|
|
d63d2568b7 | ||
|
|
d8d94e7a69 | ||
|
|
ef3b25e152 | ||
|
|
52ae8b7d9f | ||
|
|
d204cd0880 | ||
|
|
32a5793b02 | ||
|
|
b81979f35b | ||
|
|
808271a5a9 | ||
|
|
4bfd528d44 | ||
|
|
2fefe482bf | ||
|
|
1c2ba03f94 | ||
|
|
5edfa62c7b | ||
|
|
efad89d9d2 | ||
|
|
a8dfe825d0 | ||
|
|
a9b0230e57 | ||
|
|
01b16f64f4 | ||
|
|
b41ca012b4 | ||
|
|
d2b58bd0cd | ||
|
|
fc43fc1805 | ||
|
|
1616d9ef05 | ||
|
|
05b29df6eb | ||
|
|
9f0c59d6dd | ||
|
|
af02195b60 | ||
|
|
0f46173c2d | ||
|
|
ac22e0efe3 | ||
|
|
031ae82552 | ||
|
|
6b3e58127d | ||
|
|
5e576bda7d | ||
|
|
6039258f01 | ||
|
|
121e401166 | ||
|
|
67ab8145c7 | ||
|
|
68b663eaba | ||
|
|
c9f3166c4d | ||
|
|
eafb876a5b | ||
|
|
c8790efadf | ||
|
|
fbcf341878 | ||
|
|
1adb1d9bb7 | ||
|
|
c9bf55f125 | ||
|
|
2b07607cac | ||
|
|
556fa9f781 | ||
|
|
827da803f6 | ||
|
|
b1496253d0 | ||
|
|
811608bef8 | ||
|
|
db304adf70 | ||
|
|
ef94a3be9a | ||
|
|
2f283177f7 | ||
|
|
b13eb2c13f | ||
|
|
9707f9bfbe | ||
|
|
53785c2434 | ||
|
|
4f450d0f5a | ||
|
|
86a36fec8a | ||
|
|
5ccd54734a | ||
|
|
ecf42e76a8 | ||
|
|
c72e5f116d | ||
|
|
d79fd53b67 | ||
|
|
0bfdc8682d | ||
|
|
af5f768a52 | ||
|
|
9a51528aab | ||
|
|
e403873ac8 | ||
|
|
e004f75e77 | ||
|
|
55e02bdb70 | ||
|
|
d28170aaeb | ||
|
|
d2e9479da4 | ||
|
|
e0c815249d | ||
|
|
f5053fb2ad | ||
|
|
53ca70ae70 | ||
|
|
eea717d21b | ||
|
|
2e86b1bd77 | ||
|
|
8b638f219c | ||
|
|
91340d59bb | ||
|
|
3eafe7e630 | ||
|
|
923014d163 | ||
|
|
4fe2aab723 | ||
|
|
65c9142cd1 | ||
|
|
d159ff9baa | ||
|
|
4ef64cab52 | ||
|
|
a7ae4f80ab | ||
|
|
075788af7c | ||
|
|
24d4afb967 | ||
|
|
a4d961eb17 | ||
|
|
1d8abe7d1c | ||
|
|
6ad6c61af2 | ||
|
|
1440e88347 | ||
|
|
4e34e45be6 | ||
|
|
3ebd7f9966 | ||
|
|
ef7b349928 | ||
|
|
abdd0ea313 | ||
|
|
7eb7740e01 | ||
|
|
bbc091d762 | ||
|
|
4fa4e5fdad | ||
|
|
06b758de98 | ||
|
|
c98c67ae73 | ||
|
|
32e26bcf68 | ||
|
|
b420749135 | ||
|
|
47e886b5a0 | ||
|
|
cf5b34a12e | ||
|
|
91328046dd | ||
|
|
d34515372a | ||
|
|
2a79151248 | ||
|
|
b07227a169 | ||
|
|
1213986096 | ||
|
|
fe0f31a85c | ||
|
|
550000f160 | ||
|
|
36a9d3620e | ||
|
|
e6463c00f7 | ||
|
|
c827d07c10 | ||
|
|
f8e31cf478 | ||
|
|
963cbb4cce | ||
|
|
a1e557a725 | ||
|
|
a6c036e719 | ||
|
|
80627afe00 | ||
|
|
052a3fafa9 | ||
|
|
5535d099f6 | ||
|
|
23e555662e | ||
|
|
bbe10abe2e | ||
|
|
a86e70d278 | ||
|
|
ba484c41a9 | ||
|
|
413674f3ab | ||
|
|
e907529aaf | ||
|
|
05f517b118 | ||
|
|
d99de27967 | ||
|
|
ceeb73fbfb | ||
|
|
f336a3dfde | ||
|
|
196e533430 | ||
|
|
eefe3759f1 | ||
|
|
fd18019e84 | ||
|
|
8dfd1c3f95 | ||
|
|
d448ee9fa5 | ||
|
|
0f6f47ebc9 | ||
|
|
03c416a2ca | ||
|
|
2ac38479f5 | ||
|
|
a4e447bd84 | ||
|
|
bf292cc752 | ||
|
|
3ed14f2b38 | ||
|
|
c3574b711d | ||
|
|
8d9c80a285 | ||
|
|
34b18758cb | ||
|
|
89fb8dd503 | ||
|
|
7634e06611 | ||
|
|
9278383c1a | ||
|
|
86ba78b461 | ||
|
|
82320337ea | ||
|
|
3b7cabf15a | ||
|
|
63aa83ac42 | ||
|
|
9a09d9602b | ||
|
|
9ac5a1a773 | ||
|
|
1814fc1f2f | ||
|
|
23f2cb85fe | ||
|
|
1c07b88b2a | ||
|
|
44484e2ed5 | ||
|
|
78f542d59e | ||
|
|
99f658d600 | ||
|
|
aa2955c8fb | ||
|
|
d995c75173 | ||
|
|
bb7a0c78ce | ||
|
|
4993297326 | ||
|
|
e0089070f5 | ||
|
|
c3c418ce7a | ||
|
|
2643afa593 | ||
|
|
1a118fc0b2 | ||
|
|
1af84eca7b | ||
|
|
e3fbf4b0f1 | ||
|
|
ac080aeabb | ||
|
|
f59f7b6ded | ||
|
|
d73b5d42e9 | ||
|
|
8b0c12219a | ||
|
|
f0fce329b3 | ||
|
|
c39db11532 | ||
|
|
be06de738c | ||
|
|
3b82d4848a | ||
|
|
5504920feb | ||
|
|
faa3831d05 | ||
|
|
75d836c21e | ||
|
|
0b730de705 | ||
|
|
4f2b72dbeb | ||
|
|
5faf84cf2f | ||
|
|
784c1dbe36 | ||
|
|
74c6a20d96 | ||
|
|
901d8d777c | ||
|
|
880fa82e65 | ||
|
|
855e65b9c8 | ||
|
|
a2f37abdbe | ||
|
|
e9b9de1006 | ||
|
|
ab32a1bb40 | ||
|
|
e81aeb6fe4 | ||
|
|
a404ba5c12 | ||
|
|
7d15a7aa6b | ||
|
|
d41fd15d23 | ||
|
|
c1f08ca2f6 | ||
|
|
aeb5185a44 | ||
|
|
88171ab2bf | ||
|
|
02d1de1d9d | ||
|
|
339bc419bf | ||
|
|
81e817f695 | ||
|
|
6659de1cfd | ||
|
|
9e11a12c72 | ||
|
|
a1e9e5f640 | ||
|
|
2f02abfe7a | ||
|
|
3bca3282f1 | ||
|
|
646615022d | ||
|
|
dd293082fc | ||
|
|
9e235fe957 | ||
|
|
2b47d4b525 | ||
|
|
fa5ac09ade | ||
|
|
a993d99977 | ||
|
|
d400319bcc | ||
|
|
10d00c8a53 | ||
|
|
b559f69199 | ||
|
|
4513bfc3fc | ||
|
|
5e373a3514 | ||
|
|
0df91a4b0c | ||
|
|
c362f9d36c | ||
|
|
9b568cf542 | ||
|
|
6be52029db | ||
|
|
fef9e8fb20 | ||
|
|
09bb8350e8 | ||
|
|
10ebb3825a | ||
|
|
8bdf022465 | ||
|
|
14f1169a5a | ||
|
|
93dd369b0e | ||
|
|
bb3c2a3664 | ||
|
|
11903f36a9 | ||
|
|
afedd3aa06 | ||
|
|
242c0c3988 | ||
|
|
ed3b31fa4c | ||
|
|
b7be212c30 | ||
|
|
ac92a4daae | ||
|
|
ed1c6ed344 | ||
|
|
f804e92785 | ||
|
|
9275353a47 | ||
|
|
d1bc03bd57 | ||
|
|
853b9ccd3c | ||
|
|
dd02d164ba | ||
|
|
c36d0cb807 | ||
|
|
68ed952004 | ||
|
|
f7f8592d6d | ||
|
|
500eb25302 | ||
|
|
d074d20ad4 | ||
|
|
66e5d45994 | ||
|
|
e68fa65166 | ||
|
|
d5b11e6f94 | ||
|
|
51909d8bf8 | ||
|
|
299b6a4e31 | ||
|
|
a7407b28ce | ||
|
|
4397a37b31 | ||
|
|
996b02c2fe | ||
|
|
f27d667cec | ||
|
|
50c2a0fc99 | ||
|
|
9a7dad6a50 | ||
|
|
12e6caadce | ||
|
|
3cdfcd3819 | ||
|
|
87396313d6 | ||
|
|
48ee27dcd0 | ||
|
|
cb94c00a36 | ||
|
|
fa00277afe | ||
|
|
bf5565ea2c | ||
|
|
da6f0dd646 | ||
|
|
71dd4399fc | ||
|
|
08c0dad06f | ||
|
|
be9066bd7a | ||
|
|
13aa7e5e78 | ||
|
|
0dbcb08e64 | ||
|
|
a158d1dbb4 | ||
|
|
5742430337 | ||
|
|
75453db4ce | ||
|
|
458613c923 | ||
|
|
f29a47d577 | ||
|
|
4b6e156ddf | ||
|
|
5e26011caf | ||
|
|
4cd3369ed1 | ||
|
|
90b2fbea66 | ||
|
|
5b725c8a83 | ||
|
|
83e079322e | ||
|
|
cc0207c967 | ||
|
|
1f84d34371 | ||
|
|
f1808e1a0f | ||
|
|
07cc22bffa | ||
|
|
db0a936158 | ||
|
|
e1c1168db3 | ||
|
|
f5606f9855 | ||
|
|
d014becee2 | ||
|
|
b27c5481ef | ||
|
|
fe6288421f | ||
|
|
6e60f76825 | ||
|
|
5784ff5b46 | ||
|
|
d75fddda00 | ||
|
|
c17cf5f1f5 | ||
|
|
2fb05c54ad | ||
|
|
9555260a65 | ||
|
|
4ce6c8e1dc | ||
|
|
6677faed55 | ||
|
|
8a8838de29 | ||
|
|
fa453878c4 | ||
|
|
93072a2828 | ||
|
|
f52d191a69 | ||
|
|
84f36115e5 | ||
|
|
8dd0637645 | ||
|
|
4d6bca22cc | ||
|
|
7bb4146e58 | ||
|
|
ed5f3df612 | ||
|
|
f402668a4e | ||
|
|
f723380e32 | ||
|
|
1db823f451 | ||
|
|
fcd710e31d | ||
|
|
6922b336b0 | ||
|
|
6edf4343b2 | ||
|
|
81864f3c7f | ||
|
|
2a0c0a2598 | ||
|
|
3db4000c80 | ||
|
|
c7b33ceea9 | ||
|
|
e47a2cc34a | ||
|
|
aa77184ed5 | ||
|
|
58ff9e5188 | ||
|
|
a0bf1d13bb | ||
|
|
c47ab92f69 | ||
|
|
ad4b9529dc | ||
|
|
b5819be055 | ||
|
|
21dfefa0c3 | ||
|
|
4c013d1087 | ||
|
|
825b296d12 | ||
|
|
514b7743d6 | ||
|
|
5265110509 | ||
|
|
aa96bfcb27 | ||
|
|
c7f062aeca | ||
|
|
32eeffcd11 | ||
|
|
67a93b53a3 | ||
|
|
941024f193 | ||
|
|
127adf6acf | ||
|
|
ff3655c7cd | ||
|
|
b58c6402f9 | ||
|
|
0af7b9bb84 | ||
|
|
188cd1ef6b | ||
|
|
aa82e0132a | ||
|
|
dbd027c796 | ||
|
|
999baf9090 | ||
|
|
ce5b1e9235 | ||
|
|
ac29d9da5f | ||
|
|
44495acf4f | ||
|
|
29263b1b41 | ||
|
|
3d2e252e2c | ||
|
|
e1337244d3 | ||
|
|
885ea764a0 | ||
|
|
58a38d00e4 | ||
|
|
24a1554e3a | ||
|
|
d167c34753 | ||
|
|
4fd86afb89 | ||
|
|
a2aa9d1fc7 | ||
|
|
283cbc4df5 | ||
|
|
18d98dd215 | ||
|
|
3dee622df6 | ||
|
|
6b81eeb106 | ||
|
|
594bc072ae | ||
|
|
077259c08c | ||
|
|
168f210f34 | ||
|
|
a86dbfd723 | ||
|
|
daef61594c | ||
|
|
de7b174cec | ||
|
|
d6af4a90d5 | ||
|
|
ea6079c2ab | ||
|
|
3fbebd97cd | ||
|
|
b3f18d73f5 | ||
|
|
cfbe1ff69c | ||
|
|
319bf015de | ||
|
|
99c572448a | ||
|
|
a5007158df | ||
|
|
0b210f072d | ||
|
|
5ca289471f | ||
|
|
2141edda0c | ||
|
|
d9793fceaf | ||
|
|
1459db27fb | ||
|
|
133cc56e70 | ||
|
|
cd9a021a19 | ||
|
|
2e8124eadb | ||
|
|
ce5329a310 | ||
|
|
1049ce0a99 | ||
|
|
6b74e0097b | ||
|
|
785b0b541d | ||
|
|
321b71aedb | ||
|
|
1dbbcc35e1 | ||
|
|
e2e737234e | ||
|
|
2b7ad6e6f3 | ||
|
|
e01c9f10a3 | ||
|
|
a2db898d70 | ||
|
|
fd4505cfb2 | ||
|
|
9c23c72d99 | ||
|
|
d037dc32b4 | ||
|
|
e045b46352 | ||
|
|
a4dad6d36a | ||
|
|
bdf7f14b3d | ||
|
|
0c9fdf2639 | ||
|
|
dd59dd8ba9 | ||
|
|
280110ca8d | ||
|
|
f9958255ee | ||
|
|
e25e68f234 | ||
|
|
01accaef55 | ||
|
|
d06472b2c1 | ||
|
|
8ada192e69 | ||
|
|
639b14710b | ||
|
|
ab19019b77 | ||
|
|
15d754040a | ||
|
|
f88c09857d | ||
|
|
3cb06f116d | ||
|
|
e53096123c | ||
|
|
48cdba3553 | ||
|
|
7149876704 | ||
|
|
6494f05638 | ||
|
|
1f5818070d | ||
|
|
db12ee7a37 | ||
|
|
82602821d0 | ||
|
|
d928ceb75a | ||
|
|
7f871f63ea | ||
|
|
7e096cbc41 | ||
|
|
f25a8dca17 | ||
|
|
c8bcf5a6a2 | ||
|
|
b2a3299e8e | ||
|
|
26a33cf99b | ||
|
|
cb8421e353 | ||
|
|
96e06509ac | ||
|
|
3dd61f8ec3 | ||
|
|
8c83772f6c | ||
|
|
a8d731d81f | ||
|
|
5ca0bca199 | ||
|
|
89f27a597f | ||
|
|
947928bcc2 | ||
|
|
23a17d0048 | ||
|
|
59f85c5d62 | ||
|
|
c7bf69c8e1 | ||
|
|
92fa43ac91 | ||
|
|
b05ee704dd | ||
|
|
68c3600d9f | ||
|
|
f51e9b300f | ||
|
|
f61d304ef3 | ||
|
|
eb22cc1231 | ||
|
|
41c8940a4c | ||
|
|
55c5adf967 | ||
|
|
db315a4588 | ||
|
|
da14a31cfb | ||
|
|
f5b0c5bf06 | ||
|
|
7a96731c6b | ||
|
|
ce70fb2a3e | ||
|
|
82ec1af20e | ||
|
|
5024c1b240 | ||
|
|
a30bc25ac7 | ||
|
|
55d4de7963 | ||
|
|
69df6871f6 | ||
|
|
fcd4f2663a | ||
|
|
526ff38e02 | ||
|
|
881aa25d6d | ||
|
|
6fe7351579 | ||
|
|
01a155a1b9 | ||
|
|
866a93968b | ||
|
|
fd251c590f | ||
|
|
18f5e11d35 | ||
|
|
b62c737dc6 | ||
|
|
dbb0252d19 | ||
|
|
b268018b7f | ||
|
|
cb6dcc39f7 | ||
|
|
a066a27652 | ||
|
|
2d9e460766 | ||
|
|
b59fe32cb6 | ||
|
|
01ec93ad0f | ||
|
|
1f4a5f3ac3 | ||
|
|
d7729f0caf | ||
|
|
c4ab09c509 | ||
|
|
b4d821716d | ||
|
|
e225057700 | ||
|
|
1ee4636528 | ||
|
|
d8449bbd8f | ||
|
|
c4cb8631c6 | ||
|
|
2bf3bb2faa | ||
|
|
32248d62f3 | ||
|
|
0600ed82cc | ||
|
|
ea87bfff51 | ||
|
|
4202608e74 | ||
|
|
ac0bb05bb7 | ||
|
|
cfe26f780e | ||
|
|
b9af7736a1 | ||
|
|
24b467f629 | ||
|
|
af9449e282 | ||
|
|
3e660dcd9c | ||
|
|
8655d26de4 | ||
|
|
fd55d39c10 | ||
|
|
85caffee2f | ||
|
|
8dfb25cb73 | ||
|
|
d71858c853 | ||
|
|
beb25a2194 | ||
|
|
292bcbca4f | ||
|
|
f5d5083110 | ||
|
|
8f44147c38 | ||
|
|
3fde4dc962 | ||
|
|
4c1cd2d89b | ||
|
|
659a1f7fda | ||
|
|
f2422451cf | ||
|
|
dd9de0da0b | ||
|
|
d6fa1f40c2 | ||
|
|
f0ff5cc364 | ||
|
|
c5345df480 | ||
|
|
cac4bbb240 | ||
|
|
af80f6be7f | ||
|
|
f490f5fea6 | ||
|
|
49e16428e5 | ||
|
|
a9a20e5b73 | ||
|
|
783e20a984 | ||
|
|
04d03815d4 | ||
|
|
ba60861ea0 | ||
|
|
d97bc7d874 | ||
|
|
cff7f87d46 | ||
|
|
e4c54d9c82 | ||
|
|
949c613e36 | ||
|
|
e3daa171b6 | ||
|
|
80b5d9a131 | ||
|
|
c2edfc700c | ||
|
|
d9e846a2bd | ||
|
|
525830b87a | ||
|
|
13086404f7 | ||
|
|
1e2ffd32e5 | ||
|
|
98c06c4afe | ||
|
|
4cafc0ee8a | ||
|
|
6308a04a47 | ||
|
|
6ea0a9006e | ||
|
|
91bdb19a86 | ||
|
|
823db26d7c | ||
|
|
a1e3a91a5a | ||
|
|
7c09767d2d | ||
|
|
ca345ff750 | ||
|
|
d9bbcf73aa | ||
|
|
e2e02f874d | ||
|
|
5d94303140 | ||
|
|
516b23d72a | ||
|
|
4d0744181c | ||
|
|
2f97d5702c | ||
|
|
5cede56690 | ||
|
|
556b5a4858 | ||
|
|
9dcca48153 | ||
|
|
58ab46b561 | ||
|
|
91f0a005d6 | ||
|
|
fc3c21f1dc | ||
|
|
ab83ec893f | ||
|
|
35a245554b | ||
|
|
63c2e86c9d | ||
|
|
86b9527109 | ||
|
|
8f44ca03a3 | ||
|
|
6e0923e13e | ||
|
|
e223297360 | ||
|
|
5db776c725 | ||
|
|
85bd79aa64 | ||
|
|
d9d266124c | ||
|
|
d55d5cde0d | ||
|
|
239ff42fd8 | ||
|
|
e28c2d3d43 | ||
|
|
20d21b21ae | ||
|
|
076d3bdc74 | ||
|
|
40c54a66e0 | ||
|
|
c767d8a44c | ||
|
|
dddb904e21 | ||
|
|
3e767d3003 | ||
|
|
f4fc77028d | ||
|
|
8573f53b18 | ||
|
|
a1034c7866 | ||
|
|
f1deade196 | ||
|
|
0ecc418f37 | ||
|
|
d105d660ca | ||
|
|
517ffb3917 | ||
|
|
76cd830b8a | ||
|
|
3f9a980ecb | ||
|
|
c411e30075 | ||
|
|
b691353b0c | ||
|
|
d68048165b | ||
|
|
f0d827f242 | ||
|
|
960c8b3a3a | ||
|
|
ee96f61293 | ||
|
|
db71b2a64c | ||
|
|
70ce073eff | ||
|
|
6d429874b0 | ||
|
|
422167b88b | ||
|
|
f65cfa8da2 | ||
|
|
e3e33a5867 | ||
|
|
f3cdd7a348 | ||
|
|
ad79597416 | ||
|
|
fc1b4a510d | ||
|
|
49ee93f7a4 | ||
|
|
49b7dbde8a | ||
|
|
6619a6f945 | ||
|
|
0d21d59a38 | ||
|
|
1d765368f0 | ||
|
|
f3f10ca1f5 | ||
|
|
34433fdcb3 | ||
|
|
ae678f4f30 | ||
|
|
0caf2a8444 | ||
|
|
f564c30096 | ||
|
|
17a211f45a | ||
|
|
26708239aa | ||
|
|
3d13ef9f06 | ||
|
|
77ac52137f | ||
|
|
82276389fc | ||
|
|
69e2d4d78f | ||
|
|
d51fc54f16 | ||
|
|
481f876653 | ||
|
|
a748575149 | ||
|
|
3b63158b7b | ||
|
|
e7909d76b8 | ||
|
|
9bcc5c25b3 | ||
|
|
2585cc353f | ||
|
|
6d4b2c7dbf | ||
|
|
e6f3901b51 | ||
|
|
b4313ea7a0 | ||
|
|
58c1b7c37a | ||
|
|
c013b36695 | ||
|
|
943fba4590 | ||
|
|
062bc696bc | ||
|
|
b49ce3dfda | ||
|
|
b9890d6797 | ||
|
|
8c6cc0f3b3 | ||
|
|
ee0f4fbce0 | ||
|
|
44724b0750 | ||
|
|
122ae428ad | ||
|
|
375753fdd1 | ||
|
|
4bd5bebc46 | ||
|
|
cab280a576 | ||
|
|
a7f588189f | ||
|
|
dc969cc7f9 | ||
|
|
7d2f75abcf | ||
|
|
18fafddb06 | ||
|
|
6d281826b3 | ||
|
|
dbff91a4f7 | ||
|
|
1fbd73c51a | ||
|
|
db75062d2c | ||
|
|
37f1f978f7 | ||
|
|
08cd3bf619 | ||
|
|
c1c0fa6a3f | ||
|
|
83cca7bc14 | ||
|
|
94d7782d32 | ||
|
|
137d28ac13 | ||
|
|
446cf420e7 | ||
|
|
54b5029886 | ||
|
|
8ce9fbe425 | ||
|
|
bdb812af16 | ||
|
|
41de3e6e65 | ||
|
|
3972c62250 | ||
|
|
ac53ec86aa | ||
|
|
38327104b2 | ||
|
|
4ec8adda6f | ||
|
|
99de5c18a3 | ||
|
|
d43987add7 | ||
|
|
9c61b97a4e | ||
|
|
eb865a6b26 | ||
|
|
9260e53410 | ||
|
|
3b91cd95ea | ||
|
|
7523afe753 | ||
|
|
88bdba7064 | ||
|
|
cccece45f8 | ||
|
|
c35c119ef0 | ||
|
|
3793fcf9d8 | ||
|
|
b8b2efb590 | ||
|
|
609d587397 | ||
|
|
b8f0d17f2f | ||
|
|
0235798136 | ||
|
|
acd8d16bd9 | ||
|
|
35e1ca2039 | ||
|
|
85644ebe3a | ||
|
|
6e2e06ac03 | ||
|
|
6e53efc060 | ||
|
|
dcc5d44094 | ||
|
|
8b567c597a | ||
|
|
d76b8331d1 | ||
|
|
0655cb3be4 | ||
|
|
7a88a0d019 | ||
|
|
086103193a | ||
|
|
d71a4668c6 | ||
|
|
00201ecd8f | ||
|
|
605d9fdd68 | ||
|
|
749e1d8bd2 | ||
|
|
c68456cc68 | ||
|
|
fe06364011 | ||
|
|
68f71ad5fb | ||
|
|
f15e3713ad | ||
|
|
b0b14bf5b6 | ||
|
|
d32324658a | ||
|
|
c9c4f0bb18 | ||
|
|
4c74be62e3 | ||
|
|
fbcb9154fc | ||
|
|
7a507f9a61 | ||
|
|
241b1973cb | ||
|
|
e8c45f4bfd | ||
|
|
5483edded8 | ||
|
|
edd2070a11 | ||
|
|
cd7d5166f1 | ||
|
|
6e57c13727 | ||
|
|
a2f8f75145 | ||
|
|
4dea77ce39 | ||
|
|
ab4b37afab | ||
|
|
c97376d456 | ||
|
|
b3bb189cb8 | ||
|
|
408149ce5e | ||
|
|
f35defd57a | ||
|
|
97c4b72b6a | ||
|
|
9277c1ab40 | ||
|
|
cd993a9648 | ||
|
|
d5cf5621d7 | ||
|
|
f08e3393cb | ||
|
|
8c885ca0f4 | ||
|
|
eecff14cf2 | ||
|
|
2a52b95773 | ||
|
|
e98df05432 | ||
|
|
d242dc8bd5 | ||
|
|
58ba3b178b | ||
|
|
4c24629854 | ||
|
|
bf06b48368 | ||
|
|
c4d150dec6 | ||
|
|
fc2ee9f41e | ||
|
|
bbddd550c6 | ||
|
|
78ab8b1330 | ||
|
|
5acd3c75f7 | ||
|
|
29b87d5434 | ||
|
|
39cc6fd8b2 | ||
|
|
ab30dbaf00 | ||
|
|
a50f408acf | ||
|
|
bb0f2e822d | ||
|
|
c3fe715be2 | ||
|
|
747e9e676d | ||
|
|
d1025ea7e6 | ||
|
|
4bda611ee4 | ||
|
|
ffea7c8793 | ||
|
|
7d516c23c2 | ||
|
|
fe9a989a39 | ||
|
|
9c30ba7f35 | ||
|
|
a46950e972 | ||
|
|
7c644e4982 | ||
|
|
945940e131 | ||
|
|
be512f8298 | ||
|
|
061998e6cf | ||
|
|
ceccba0997 | ||
|
|
a7379389f1 | ||
|
|
9fbde38571 | ||
|
|
c8e149994e | ||
|
|
566737ccc8 | ||
|
|
f28d385e78 | ||
|
|
208b3caa0f | ||
|
|
7ebd0a84ec | ||
|
|
b922740e56 | ||
|
|
d8bb6d2afe | ||
|
|
a35f3d16db | ||
|
|
be76c13da8 | ||
|
|
b8a307ec63 | ||
|
|
ebb92d2ff7 | ||
|
|
ce39c2ade0 | ||
|
|
3cf262f231 | ||
|
|
ac2e671d80 | ||
|
|
86049b7af2 | ||
|
|
99e7413938 | ||
|
|
c5e087b103 | ||
|
|
fb65839653 | ||
|
|
1da27af832 | ||
|
|
c29ac85281 | ||
|
|
1b5fe4a477 | ||
|
|
cdf01d1af8 | ||
|
|
2e54284906 | ||
|
|
b13c97f04f | ||
|
|
c817b2a3e0 | ||
|
|
a354577eff | ||
|
|
09a95983b9 | ||
|
|
25d6df290e | ||
|
|
bd9edc8e76 | ||
|
|
b28998694b | ||
|
|
0b5008eee3 | ||
|
|
a6d128836d | ||
|
|
ea4e5cec19 | ||
|
|
bfeb1ee182 | ||
|
|
2b28011c86 | ||
|
|
66c5ea2216 | ||
|
|
66abd8cbd3 | ||
|
|
a142e81994 | ||
|
|
97b7012ccd | ||
|
|
39d293551a | ||
|
|
fe56b875b4 | ||
|
|
d1035d439a | ||
|
|
532791209e | ||
|
|
ed0b7864d7 | ||
|
|
d2ca281ca1 | ||
|
|
3792c573cd | ||
|
|
ab8ee3fbce | ||
|
|
c2cfab6d9c | ||
|
|
a99667350e | ||
|
|
053703eeab | ||
|
|
3a4e26247b | ||
|
|
a25f19560c | ||
|
|
2af27bb921 | ||
|
|
731c7c0f92 | ||
|
|
b487cf1d19 | ||
|
|
41a2f6de00 | ||
|
|
075254e5a0 | ||
|
|
3daa0de1e6 | ||
|
|
972e372402 | ||
|
|
65c91ba729 | ||
|
|
3ffade5f8a | ||
|
|
33ad4cc2b8 | ||
|
|
f029a09cef | ||
|
|
9468b16f1e | ||
|
|
d4b19d7a5a | ||
|
|
632292731f | ||
|
|
89500e2ab3 | ||
|
|
bc1c6c07b3 | ||
|
|
2fdb959ea1 | ||
|
|
93c4d8bc34 | ||
|
|
504633eadd | ||
|
|
3884aa166e | ||
|
|
ec7abfeabb | ||
|
|
de79d05ad9 | ||
|
|
8b4fd9bd13 | ||
|
|
be8a327258 | ||
|
|
58c1e2bb55 | ||
|
|
5d0a2f5fdb | ||
|
|
4f5a769d01 | ||
|
|
8df2c0090d | ||
|
|
c92aabb6e6 | ||
|
|
c00c44abbe | ||
|
|
92582ce519 | ||
|
|
1291b76986 | ||
|
|
6d291e98e0 | ||
|
|
68498a307c | ||
|
|
a7d73d90db | ||
|
|
69fd5b557d | ||
|
|
3792abd447 | ||
|
|
d55323e575 | ||
|
|
96104d0895 | ||
|
|
2f7dd5ec65 | ||
|
|
8c0fe8f93f | ||
|
|
85ccbd4f95 | ||
|
|
f3b142293c | ||
|
|
4b34dd1965 | ||
|
|
4ae7fe91d6 | ||
|
|
41ac5f7e4e | ||
|
|
343dbafe7d | ||
|
|
5003886591 | ||
|
|
f7de260969 | ||
|
|
69daeb040c | ||
|
|
fdc53b1a76 | ||
|
|
b6247f5391 | ||
|
|
40983f461e | ||
|
|
80ba5ad341 | ||
|
|
0f3a369e12 | ||
|
|
d9edee47aa | ||
|
|
a65b0acd9e | ||
|
|
67c2c481ea | ||
|
|
57c1db3db4 | ||
|
|
cc963b4862 | ||
|
|
2bccc5cf70 | ||
|
|
93404696ac | ||
|
|
a0fc33ecd5 | ||
|
|
4c250df318 | ||
|
|
53fa55655d | ||
|
|
a3e943138a | ||
|
|
f2fd137715 | ||
|
|
830b3b10b0 | ||
|
|
c5ac2f221d | ||
|
|
caaa3fa293 | ||
|
|
1a8456e8ff | ||
|
|
dd2b3c3f26 | ||
|
|
4af5fc041a | ||
|
|
0509a14c0f | ||
|
|
c9c188ceca | ||
|
|
3982bde360 | ||
|
|
aca43d8726 | ||
|
|
d4f07f2096 | ||
|
|
a193fb96b8 | ||
|
|
6d94f9ee16 | ||
|
|
da35daab51 | ||
|
|
48168eacdb | ||
|
|
a27d535f47 | ||
|
|
3a173dcc1f | ||
|
|
619dd15e9a | ||
|
|
6bdeed14fd | ||
|
|
683c1ab16d | ||
|
|
278b2cd004 | ||
|
|
e2b2a5a8d6 | ||
|
|
837f0c67c7 | ||
|
|
fe1b963d38 | ||
|
|
3bce84c0a0 | ||
|
|
d002e9631c | ||
|
|
1348b850bc | ||
|
|
4998cfcf29 | ||
|
|
49d36209bf | ||
|
|
d537e16a47 | ||
|
|
04a14ee3e2 | ||
|
|
7209bff091 | ||
|
|
05b63f6126 | ||
|
|
20058af7ae | ||
|
|
9ae86f6198 | ||
|
|
ad199fe46d | ||
|
|
e6713e850e | ||
|
|
1544abac7a | ||
|
|
87b3e5abec | ||
|
|
5ba03f63c6 | ||
|
|
684397a675 | ||
|
|
361e5d3066 | ||
|
|
c306390c93 | ||
|
|
66364abf73 | ||
|
|
5d68d1dc7a | ||
|
|
6c01530ff3 | ||
|
|
69e15e8371 | ||
|
|
41857be937 | ||
|
|
51e9d0c08f | ||
|
|
841d602fc8 | ||
|
|
35d76d2278 | ||
|
|
add1bcd1dc | ||
|
|
db800f73f1 | ||
|
|
39d093fc45 | ||
|
|
a30fb9917e | ||
|
|
4065f9801d | ||
|
|
25898e4216 | ||
|
|
9354d4a84f | ||
|
|
2bbbbe207e | ||
|
|
826a2a7b63 | ||
|
|
4bfb33bdb4 | ||
|
|
1b70b8ca3a | ||
|
|
09936f47a0 | ||
|
|
ed9a438b62 | ||
|
|
8b26ad55c3 | ||
|
|
7945e4d398 | ||
|
|
9d030c16fa | ||
|
|
147544bbaa | ||
|
|
6cf162b42d | ||
|
|
15a9562697 | ||
|
|
21d6bee5aa | ||
|
|
90f765f516 | ||
|
|
d5e9b2efef | ||
|
|
5e81e58f3f | ||
|
|
ba81277614 | ||
|
|
124e654af4 | ||
|
|
9fb3cffefe | ||
|
|
f4bdc2a23d | ||
|
|
c7c8b50443 | ||
|
|
86d12faf4d | ||
|
|
d07a3d2a24 | ||
|
|
5d2b75964f | ||
|
|
4c0d4f769f | ||
|
|
ebd2555fcc | ||
|
|
9b0114e4c9 | ||
|
|
eaedf85f3e | ||
|
|
ce6b91e4de | ||
|
|
6b54081dc6 | ||
|
|
ef947bd339 | ||
|
|
ccd6ac458f | ||
|
|
884641836b | ||
|
|
bd9d408f53 | ||
|
|
c7dd68015c | ||
|
|
42579964b9 | ||
|
|
241379ef2b | ||
|
|
78d85a459c | ||
|
|
ddbf49bc7e | ||
|
|
2643b6b0c0 | ||
|
|
e2bc59bec9 | ||
|
|
28dc67e2c2 | ||
|
|
f2beef8675 | ||
|
|
c00452b686 | ||
|
|
09832b9672 | ||
|
|
8e01a772ae | ||
|
|
f8670c565c | ||
|
|
d3e7e9554c | ||
|
|
35e15efd37 | ||
|
|
54a5d271d3 | ||
|
|
ba74559c04 | ||
|
|
3209a0b6c7 | ||
|
|
723f131f76 | ||
|
|
164ebe22bf | ||
|
|
ec362f77e4 | ||
|
|
c7536993cf | ||
|
|
c16e5ad42e | ||
|
|
56b762fa55 | ||
|
|
0117e7f6fc | ||
|
|
2a37feb1eb | ||
|
|
475c7ed2eb | ||
|
|
ee1ca9cd10 | ||
|
|
d555153e51 | ||
|
|
e14ddc840e | ||
|
|
013e46b138 | ||
|
|
df5f1ee67b | ||
|
|
4e9bca7218 | ||
|
|
e8bfe253ae | ||
|
|
9585d54b31 | ||
|
|
b25f9cc7d4 | ||
|
|
bd92902560 | ||
|
|
10a77ce888 | ||
|
|
81c199dd9b | ||
|
|
3b82572b9e | ||
|
|
9d85ab415f | ||
|
|
d0358c0063 | ||
|
|
e103726f4d | ||
|
|
4262c90148 | ||
|
|
bf8f419ca9 | ||
|
|
cccb6ad2c9 | ||
|
|
6f41cc7271 | ||
|
|
9b781ca734 | ||
|
|
aa0973caf5 | ||
|
|
72b4af6143 | ||
|
|
d40829b133 | ||
|
|
939506b68b | ||
|
|
e62ef924fb | ||
|
|
8bad736d48 | ||
|
|
e761014ca5 | ||
|
|
e6ca4ff173 | ||
|
|
62d58bdabc | ||
|
|
775e4f1bad | ||
|
|
e37fe5543f | ||
|
|
d54750b365 | ||
|
|
8ebe7b10fc | ||
|
|
5c1b0f261e | ||
|
|
0866ceffc7 | ||
|
|
3c6f94258f | ||
|
|
959a55f95f | ||
|
|
7d0d8775c9 | ||
|
|
52cb8c35c8 | ||
|
|
d19bc4bb67 | ||
|
|
1ee16fdeca | ||
|
|
b809beacab | ||
|
|
8cafb048be | ||
|
|
627b2408e5 | ||
|
|
0d36a2a050 | ||
|
|
06da18089f | ||
|
|
19697bd44a | ||
|
|
2e6c8ddd15 | ||
|
|
b7f9853968 | ||
|
|
80d05fe917 | ||
|
|
08c472230a | ||
|
|
47ecf35737 | ||
|
|
b48355b67e | ||
|
|
0f768bdaab | ||
|
|
05f93ca729 | ||
|
|
d70f0013d6 | ||
|
|
d5cb882e62 | ||
|
|
2a382a2ce9 | ||
|
|
c13b08f861 | ||
|
|
298f71ce4e | ||
|
|
4114507587 | ||
|
|
060d0ac455 | ||
|
|
9a3c345f60 | ||
|
|
98eb01aa3f | ||
|
|
de47400a48 | ||
|
|
871cf8e5a2 | ||
|
|
6ace578e5b | ||
|
|
7273ec17d3 | ||
|
|
07b69bb06f | ||
|
|
98df5b59e5 | ||
|
|
cdfb517528 | ||
|
|
b16d4e951e | ||
|
|
feb5ff560a | ||
|
|
ce385d3f55 | ||
|
|
82fc1163c6 | ||
|
|
79d2b7f931 | ||
|
|
4c1f1b0efc | ||
|
|
989d69be01 | ||
|
|
2143f46f45 | ||
|
|
5bbe86a713 | ||
|
|
3cc152a9a5 | ||
|
|
693372b695 | ||
|
|
43e6a01189 | ||
|
|
9dc39859fc | ||
|
|
5b350acc4c | ||
|
|
42140d3ade | ||
|
|
dfa2a59f99 | ||
|
|
5c11ad80c0 | ||
|
|
ee4de34a42 | ||
|
|
892a6162ab | ||
|
|
811b3554a7 | ||
|
|
e7f5940655 | ||
|
|
e4ad2921e5 | ||
|
|
7872401f73 | ||
|
|
2277f7cc68 | ||
|
|
2c955ab76b | ||
|
|
9fc1f85102 | ||
|
|
2571f78ce7 | ||
|
|
ecbb12f609 | ||
|
|
800e379690 | ||
|
|
45467a9bc3 | ||
|
|
dc940764d7 | ||
|
|
d53e3728f7 | ||
|
|
7414f030c3 | ||
|
|
2674d77519 | ||
|
|
66bbe52576 | ||
|
|
5f10d43c6b | ||
|
|
6dec3353ec | ||
|
|
5e2bb54ee8 | ||
|
|
018922b0b6 | ||
|
|
288b08e3d8 | ||
|
|
dbc607cfcc | ||
|
|
4e2de8808a | ||
|
|
71932baad7 | ||
|
|
483daf3701 | ||
|
|
1534cd8cb7 | ||
|
|
03496a8a0b | ||
|
|
1a57bf110d | ||
|
|
5b83573d04 | ||
|
|
0a8cac68f2 | ||
|
|
ed2ccce0e8 | ||
|
|
7a0e16510a | ||
|
|
f62b2b23b1 | ||
|
|
5e8904e327 | ||
|
|
26ab7c1475 | ||
|
|
e392729d9f | ||
|
|
0fbfc48716 | ||
|
|
88e03cdaf0 | ||
|
|
7645ab89bc | ||
|
|
4f27509e67 | ||
|
|
7a4e706b44 | ||
|
|
757bc3cbe9 | ||
|
|
2ee33fe8cd | ||
|
|
cc1402bf44 | ||
|
|
70690ce010 | ||
|
|
56fcb73cc4 | ||
|
|
84eecc015c | ||
|
|
4bb4ff06e3 | ||
|
|
8610758e14 | ||
|
|
caf9d3abd5 | ||
|
|
51b0288f5d | ||
|
|
7fb488be15 | ||
|
|
251d3f8743 | ||
|
|
3676eb91e3 | ||
|
|
edfc6a8530 | ||
|
|
448c68ef01 | ||
|
|
7efbcfecff | ||
|
|
de743aad4a | ||
|
|
c460afc2d9 | ||
|
|
c03cd59274 | ||
|
|
83993b1dbf | ||
|
|
cc14400096 | ||
|
|
ef7bb8ef9f | ||
|
|
bc6814eb5b | ||
|
|
b8cb6efb37 | ||
|
|
83af9b504b | ||
|
|
ddb667e8bf | ||
|
|
704153e4cb | ||
|
|
39f6c08187 | ||
|
|
7628879e79 | ||
|
|
20173a59f0 | ||
|
|
1e47a1984d | ||
|
|
14268ccbaa | ||
|
|
14cc308d53 | ||
|
|
bb024e3d82 | ||
|
|
1c62a2a923 | ||
|
|
094c60db89 | ||
|
|
dc74b50cc9 | ||
|
|
5cd87eae22 | ||
|
|
a1c7e507aa | ||
|
|
9526e2ff80 | ||
|
|
b400bb5c15 | ||
|
|
89cb55a62f | ||
|
|
878de84feb | ||
|
|
9862a86b31 | ||
|
|
1eb91d2e50 | ||
|
|
50fbb76454 | ||
|
|
5cb908b625 | ||
|
|
be0491294a | ||
|
|
17d54064d8 | ||
|
|
d8fb86a987 | ||
|
|
5967358697 | ||
|
|
7041b41afa | ||
|
|
c597e928f1 | ||
|
|
79f261edf0 | ||
|
|
b082a6b3dd | ||
|
|
64b97acc33 | ||
|
|
936898453d | ||
|
|
62802342aa | ||
|
|
93118d76f4 | ||
|
|
95b2f94671 | ||
|
|
4434fcbde1 | ||
|
|
cbcfdaa655 | ||
|
|
10d52f5a27 | ||
|
|
92c7593cff | ||
|
|
0dbcf9c04d | ||
|
|
f494e88611 | ||
|
|
0ba1718e40 | ||
|
|
5c5d978abe | ||
|
|
a6b0eeacc9 | ||
|
|
6993e63ac4 | ||
|
|
aea182c5a4 | ||
|
|
c78aebf68f | ||
|
|
05b7929019 | ||
|
|
5b665b3e48 | ||
|
|
5089dcd3f2 | ||
|
|
b52f96d38a | ||
|
|
2ca0bb0a2f | ||
|
|
fa3d1bfc8f | ||
|
|
30bb4eb8f2 | ||
|
|
b4cb3b0090 | ||
|
|
2c62572ae1 | ||
|
|
42904a586c | ||
|
|
8538e1ec42 | ||
|
|
e6d608b522 | ||
|
|
00a33281be | ||
|
|
7c7ba0586e | ||
|
|
252c425ea6 | ||
|
|
525630ae7a | ||
|
|
5195e8be6a | ||
|
|
358c15e015 | ||
|
|
b5b18699cb | ||
|
|
44e4475a31 | ||
|
|
a945c057c5 | ||
|
|
babeddb649 | ||
|
|
2d790edac5 | ||
|
|
2bef60a6f4 | ||
|
|
17e3bb4ec5 | ||
|
|
5e1b1a0883 | ||
|
|
5b0cbb4892 | ||
|
|
17a5ba4969 | ||
|
|
20d95edc57 | ||
|
|
126b5f9d2b | ||
|
|
46602a961d | ||
|
|
00399695cb | ||
|
|
f8e014de40 | ||
|
|
172159305c | ||
|
|
aa607875b0 | ||
|
|
954d49f7a0 | ||
|
|
5929aeb47c | ||
|
|
b990df49d6 | ||
|
|
2aa9d61ae2 | ||
|
|
0fb2c6f4f4 | ||
|
|
1c9817af0d | ||
|
|
bea6cae0d5 | ||
|
|
804ce364bf | ||
|
|
83d7fb7fdd | ||
|
|
266a3d84e4 | ||
|
|
e91de24be6 | ||
|
|
b062e9f66c | ||
|
|
f56448be60 | ||
|
|
17aa7b6a61 | ||
|
|
971d3552c7 | ||
|
|
ddd40bae06 | ||
|
|
cb11cfcd2c | ||
|
|
5eed83ee17 | ||
|
|
11632d3c2c | ||
|
|
8c70d9c2e1 | ||
|
|
3b21fbaf03 | ||
|
|
5abafb4268 | ||
|
|
2f71f5c3c9 | ||
|
|
3f65ab7871 | ||
|
|
8e120de5bd | ||
|
|
8a355db8d9 | ||
|
|
93f1096de3 | ||
|
|
f190afd0c0 | ||
|
|
ebef6b5ced | ||
|
|
6c45e943b0 | ||
|
|
61caf66f1b | ||
|
|
c56cda058e | ||
|
|
b63705384a | ||
|
|
7380ff3551 | ||
|
|
bfba6764e0 | ||
|
|
634e65df64 | ||
|
|
011fbf7f10 | ||
|
|
0363606924 | ||
|
|
40c7922386 | ||
|
|
958d9ac63b | ||
|
|
c06f1e9974 | ||
|
|
d3381233b1 | ||
|
|
6d88da58f1 | ||
|
|
77449a9477 | ||
|
|
116feb4a8c | ||
|
|
dd63d1df42 | ||
|
|
c47fa08b40 | ||
|
|
4bfd802937 | ||
|
|
87fef4ab71 | ||
|
|
844af88dc1 | ||
|
|
2f6ebfdf8c | ||
|
|
25858d8ada | ||
|
|
11d1f95412 | ||
|
|
931adb146b | ||
|
|
6a513dc9fd | ||
|
|
f13cff01bb | ||
|
|
2608333ce5 | ||
|
|
9f5bf5c7dd | ||
|
|
eb06e33e38 | ||
|
|
a94d2de89a | ||
|
|
921b4d027a | ||
|
|
026ff48edb | ||
|
|
1340b296dd | ||
|
|
fc5a020bc6 | ||
|
|
f919cf1a8e | ||
|
|
08676d23f9 | ||
|
|
28fa90811c | ||
|
|
56f39b30ce | ||
|
|
df000cd01b | ||
|
|
47b990f508 | ||
|
|
68ea085535 | ||
|
|
eb397721be | ||
|
|
c3fa77158a | ||
|
|
7c0649d466 | ||
|
|
f02f9ff50c | ||
|
|
31be334660 | ||
|
|
9d265e8bb8 | ||
|
|
1aa97d5d2c | ||
|
|
42394e3342 | ||
|
|
1bc1374d0c | ||
|
|
f2c793c75b | ||
|
|
1bb4877976 | ||
|
|
651f3bfce2 | ||
|
|
8a026e18f5 | ||
|
|
5164745ff9 | ||
|
|
179ecf7ccd | ||
|
|
a4d12f2a71 | ||
|
|
0ade040a68 | ||
|
|
59be24be32 | ||
|
|
092014d5af | ||
|
|
39d9efe4bd | ||
|
|
a3be763650 | ||
|
|
b4cf6358d4 | ||
|
|
a80df35b39 | ||
|
|
ff48a84a86 | ||
|
|
75a0d090df | ||
|
|
6418a86504 | ||
|
|
2916208eb3 | ||
|
|
22c88548b9 | ||
|
|
c642a9f856 | ||
|
|
05f8d4e8c9 | ||
|
|
9d389e8744 | ||
|
|
d51647f37e | ||
|
|
c011105124 | ||
|
|
bc909d6157 | ||
|
|
5cf678cf5e | ||
|
|
f11be7df09 | ||
|
|
7113970ff0 | ||
|
|
33974fbcd7 | ||
|
|
6eb90570f0 | ||
|
|
014f1c510d | ||
|
|
db770a815a | ||
|
|
aedb01a1a4 | ||
|
|
3d35558f0e | ||
|
|
02a3a15b82 | ||
|
|
ffe1519366 | ||
|
|
97a5ca584b | ||
|
|
78cb0008d3 | ||
|
|
d38cf2d11c | ||
|
|
b7b09acb81 | ||
|
|
83ea8e5ba5 | ||
|
|
9a16e73813 | ||
|
|
2da1713200 | ||
|
|
118648ff17 | ||
|
|
d9acf873ed | ||
|
|
e065cbccb6 | ||
|
|
cad6f6c3f0 | ||
|
|
fc6d064371 | ||
|
|
501b1d4dcf | ||
|
|
54848210a9 | ||
|
|
7f4c2f9ec3 | ||
|
|
af30e57c5e | ||
|
|
b5c4ba8322 | ||
|
|
d115f580e2 | ||
|
|
511fea418a | ||
|
|
711fb1d3c3 | ||
|
|
31b39ebc4c | ||
|
|
f214519321 | ||
|
|
5dfd6d22fa | ||
|
|
146ca52f26 | ||
|
|
65e7c24df7 | ||
|
|
5ecd1372c3 | ||
|
|
6596cce8fb | ||
|
|
ad7fc183d1 | ||
|
|
22f8cc687f | ||
|
|
294fb07750 | ||
|
|
71f8971dde | ||
|
|
7077096162 | ||
|
|
9800934e19 | ||
|
|
075142ab08 | ||
|
|
ab3f86ab36 | ||
|
|
ce66ac88c8 | ||
|
|
3849337b42 | ||
|
|
e6cf62664d | ||
|
|
56ae4124b1 | ||
|
|
41aaa47fd0 | ||
|
|
ffa50c12b1 | ||
|
|
41955b3878 | ||
|
|
534284477e | ||
|
|
b646c0a351 | ||
|
|
6429551272 | ||
|
|
ae2a9695f0 | ||
|
|
9698bd530b | ||
|
|
8c2386c221 | ||
|
|
d1e07ab6b7 | ||
|
|
b0fbb93022 | ||
|
|
c44caa0580 | ||
|
|
c10a55588b | ||
|
|
4ffb63a737 | ||
|
|
ac3f846f29 | ||
|
|
73b5daddbc | ||
|
|
a26bad3324 | ||
|
|
2c73de5292 | ||
|
|
9812a0bc81 | ||
|
|
8d48686cec | ||
|
|
f38d9f8cf6 | ||
|
|
0d1894ecbb | ||
|
|
d801a23f91 | ||
|
|
24d27977bd | ||
|
|
8bbd0363e9 | ||
|
|
c67dc7ff1d | ||
|
|
0287024e85 | ||
|
|
31b5eb597d | ||
|
|
26ef62d613 | ||
|
|
3977be938f | ||
|
|
fac4dcfc31 | ||
|
|
4cd95470d6 | ||
|
|
e224ef45a4 | ||
|
|
aacc48662a | ||
|
|
0c77d6b943 | ||
|
|
9d159596a4 | ||
|
|
de8eaf6468 | ||
|
|
205e956883 | ||
|
|
d5733b6beb | ||
|
|
4cbe74235d | ||
|
|
974a614020 | ||
|
|
267ce93a7e | ||
|
|
ae1de00c91 | ||
|
|
a144dc0e59 | ||
|
|
516cf851c3 | ||
|
|
59d6828848 | ||
|
|
76ffd6bf96 | ||
|
|
8ad8d70f62 | ||
|
|
9da4449025 | ||
|
|
0a3e55031d | ||
|
|
be9bcdf36e | ||
|
|
c8a032b6f4 | ||
|
|
55cf5ff3da | ||
|
|
a93cac525e | ||
|
|
a20cc23a78 | ||
|
|
854ef0e839 | ||
|
|
317e80c239 | ||
|
|
6f3ba6940e | ||
|
|
7858997c8f | ||
|
|
1ce55d23a3 | ||
|
|
c13a66d26f | ||
|
|
992181a0de | ||
|
|
09344eb1ad | ||
|
|
0f1cba2af5 | ||
|
|
cf78f476b8 | ||
|
|
846b0c076f | ||
|
|
f5757aa18d | ||
|
|
80c09ea4db | ||
|
|
6b33fa3417 | ||
|
|
9ba95c9706 | ||
|
|
7b14706f03 | ||
|
|
bfd08a46ec | ||
|
|
3b84147f45 | ||
|
|
f277dafe1e | ||
|
|
aca0573bed | ||
|
|
8d4c9e4345 | ||
|
|
80a93ddaf8 | ||
|
|
3ab7cf375c | ||
|
|
a3fbd5ad73 | ||
|
|
f2d1cc1a7a | ||
|
|
5ded01e288 | ||
|
|
3ec588bb54 | ||
|
|
470f06e5f6 | ||
|
|
a10bb832fd | ||
|
|
be16a24fcc | ||
|
|
2f5ec66a65 | ||
|
|
7c3e9152ce | ||
|
|
37ad3462d2 | ||
|
|
129daeff6f | ||
|
|
072784c9ee | ||
|
|
89431f1727 | ||
|
|
d9f580c3cb | ||
|
|
f6b05a0111 | ||
|
|
0353da4605 | ||
|
|
039ff29a2f | ||
|
|
385a28c7f1 | ||
|
|
89e49f1066 | ||
|
|
abd6bb6818 | ||
|
|
ad2fbea087 | ||
|
|
47cc36969a | ||
|
|
830cf1e294 | ||
|
|
a22f2cfcc8 | ||
|
|
f3d4b4f846 | ||
|
|
a6537cb9ce | ||
|
|
79524471b4 | ||
|
|
a67822b382 | ||
|
|
79da3fdedc | ||
|
|
b5d74d7c9d | ||
|
|
385abf10f7 | ||
|
|
f3206b12d5 | ||
|
|
b70fdca9ac | ||
|
|
bd3cc94a36 | ||
|
|
02f2336ab1 | ||
|
|
832d811982 | ||
|
|
637f3d7b33 | ||
|
|
254f2b3c42 | ||
|
|
633691e164 | ||
|
|
01bcc72f66 | ||
|
|
7ca255ff54 | ||
|
|
6430c98e86 | ||
|
|
32c2557bb7 | ||
|
|
3122a83900 | ||
|
|
75272a817e | ||
|
|
809d5af43e | ||
|
|
3b549caf90 | ||
|
|
42b659354d | ||
|
|
2275327794 | ||
|
|
02a5649343 | ||
|
|
3b0b9a458c | ||
|
|
6e6388e7c2 | ||
|
|
ea6f0c641d | ||
|
|
c883b18f2d | ||
|
|
97e69f7416 | ||
|
|
ad0c9eebf7 | ||
|
|
8a552631b4 | ||
|
|
cff8106908 | ||
|
|
4eb49ac28e | ||
|
|
deb390cf85 | ||
|
|
d91ae6987d | ||
|
|
8ddb2273b9 | ||
|
|
e1446fd57a | ||
|
|
02e6cad121 | ||
|
|
0b053e06d8 | ||
|
|
c3c0403dfa | ||
|
|
abc15c696d | ||
|
|
344d300cf9 | ||
|
|
dec233b9ef | ||
|
|
f695dc999b | ||
|
|
f92f81c05a | ||
|
|
3c4449c046 | ||
|
|
918e4ea46b | ||
|
|
d14d97ab68 | ||
|
|
2aed077761 | ||
|
|
68b2295f4e | ||
|
|
528d177847 | ||
|
|
deae6c95b1 | ||
|
|
7eb179069d | ||
|
|
47c33b8d03 | ||
|
|
94372fbe2a | ||
|
|
9e154297ff | ||
|
|
c4828dbd7c | ||
|
|
0d16db2c65 | ||
|
|
fb63ef305d | ||
|
|
089fc81d72 | ||
|
|
c20d175ff2 | ||
|
|
3985957c4d | ||
|
|
845a20b582 | ||
|
|
7af0c508be | ||
|
|
f8474b25f0 | ||
|
|
15a8d913ea | ||
|
|
65d3c9047f | ||
|
|
8c36971ea9 | ||
|
|
ba1dff187b | ||
|
|
8ecacc8ed2 | ||
|
|
9d41896663 | ||
|
|
18d4a9e4ff | ||
|
|
1745a30644 | ||
|
|
0cc7c598ff | ||
|
|
8c4fbb86d8 | ||
|
|
693431312c | ||
|
|
f3fca2a19a | ||
|
|
1ce9efc644 | ||
|
|
7055501efd | ||
|
|
c790ee64a4 | ||
|
|
9fb05d5ea2 | ||
|
|
3742acaf39 | ||
|
|
d8282de229 | ||
|
|
3a721a9dd5 | ||
|
|
0b6092446b | ||
|
|
59a76c6d39 | ||
|
|
fa7a916ef3 | ||
|
|
69c4187100 | ||
|
|
07128719c4 | ||
|
|
7471fa627d | ||
|
|
d7af5924ff | ||
|
|
a48e9d3d80 | ||
|
|
474a6db00c | ||
|
|
cb6aea9aa9 | ||
|
|
f4290c6497 | ||
|
|
086b85b8f9 | ||
|
|
abee658a60 | ||
|
|
87bdc21667 | ||
|
|
3e25ee8181 | ||
|
|
0266c458a3 | ||
|
|
d9c7631dcb | ||
|
|
df064fa2ba | ||
|
|
318e0c8447 | ||
|
|
17d5503bf2 | ||
|
|
19b4da6401 | ||
|
|
886dc93f18 | ||
|
|
407df2822e | ||
|
|
f6da0d342a | ||
|
|
7271537a15 | ||
|
|
d0e8efac4d | ||
|
|
27e6d56d83 | ||
|
|
c5122c12cb | ||
|
|
282050c596 | ||
|
|
308c73bfa2 | ||
|
|
c40309ae8e | ||
|
|
1c7a4ecc7f | ||
|
|
80cc623eb2 | ||
|
|
89457fd991 | ||
|
|
257043b8fb | ||
|
|
657d94b992 | ||
|
|
06dc7d5964 | ||
|
|
b50079524b | ||
|
|
cdf1f269ff | ||
|
|
738b562f39 | ||
|
|
58499f256b | ||
|
|
afb455ef80 | ||
|
|
f4515e9034 | ||
|
|
aab07d00d7 | ||
|
|
32ecfc6a86 | ||
|
|
e866f9fae7 | ||
|
|
a029f6ed2c | ||
|
|
5b6e2cb5e0 | ||
|
|
0264847a37 | ||
|
|
d276ca0adc | ||
|
|
6a099ee50a | ||
|
|
be88846972 | ||
|
|
9a6b623c25 | ||
|
|
97b36b8c74 | ||
|
|
0df332e7b8 | ||
|
|
2d7e6fbb11 | ||
|
|
fd107ab47c | ||
|
|
1320d7efab | ||
|
|
7cdc6cfa6d | ||
|
|
095ee9683d | ||
|
|
1e2081a1c5 | ||
|
|
e167e07a9a | ||
|
|
f3b9cd8404 | ||
|
|
8f9744c07b | ||
|
|
684a219e39 | ||
|
|
e2e6d827c7 | ||
|
|
f0108ece6f | ||
|
|
789b7a5ff1 | ||
|
|
0961295a82 | ||
|
|
fd060eb9f1 | ||
|
|
1feeda4514 | ||
|
|
6d29de0f1e | ||
|
|
74162850f0 | ||
|
|
8903bd1e8a | ||
|
|
4b79a4a10d | ||
|
|
8f419a4869 | ||
|
|
fcdac50f79 | ||
|
|
4541134c88 | ||
|
|
b5e5972c2a | ||
|
|
525d59fdf6 | ||
|
|
00f65afe20 | ||
|
|
fc402f5804 | ||
|
|
f74b6d9a43 | ||
|
|
ccaf2333ca | ||
|
|
0066bf8eed | ||
|
|
bc8f88f5fa | ||
|
|
10c9d917ad | ||
|
|
cc5f752f2d | ||
|
|
39b1a51ff4 | ||
|
|
a2e2e46af3 | ||
|
|
9d53a7e0a6 | ||
|
|
7ea57eaa18 | ||
|
|
1657a425c1 | ||
|
|
e929e92245 | ||
|
|
5994e48b28 | ||
|
|
50662c9c9e | ||
|
|
addd614e94 | ||
|
|
fbb228050a | ||
|
|
9bda8e266e | ||
|
|
d977005126 | ||
|
|
8b579bc7d0 | ||
|
|
ab16a11aa3 | ||
|
|
85347e12de | ||
|
|
67afbbbaa6 | ||
|
|
b743ee21f0 | ||
|
|
72702a042e | ||
|
|
649c69fa9e | ||
|
|
9fd0b87925 | ||
|
|
1c7a001489 | ||
|
|
47edc33b0d | ||
|
|
2afad0c650 | ||
|
|
fb53a6a686 | ||
|
|
31b5b78dc1 | ||
|
|
2f941c7fb3 | ||
|
|
ba483b4032 | ||
|
|
977b0ceee4 | ||
|
|
fcc20334da | ||
|
|
83c063346d | ||
|
|
c2e29ad06f | ||
|
|
9194d40da7 | ||
|
|
002073ef57 | ||
|
|
ef3066a1bd | ||
|
|
65db5b94e4 | ||
|
|
3122038c48 | ||
|
|
54fd0efdfe | ||
|
|
f0d1e50d5a | ||
|
|
a87ea20b7c | ||
|
|
8e7e40d0cc | ||
|
|
de4d4f6609 | ||
|
|
e01d61484d | ||
|
|
51f83087f2 | ||
|
|
17012654e1 | ||
|
|
e998d125ab | ||
|
|
95601d3179 | ||
|
|
0566a5833b | ||
|
|
c50459b81a | ||
|
|
0e52cf76eb | ||
|
|
0baf725073 | ||
|
|
e77fd7ddb9 | ||
|
|
e5cb5dca61 | ||
|
|
7941b559c5 | ||
|
|
58d81dbc52 | ||
|
|
2b4dc4496f | ||
|
|
c5e9d0096a | ||
|
|
c6f9780b1b | ||
|
|
ef694923f7 | ||
|
|
8d02203bb6 | ||
|
|
1e75be3b5d | ||
|
|
7d13891066 | ||
|
|
4292bd7ad9 | ||
|
|
82cd110dbe | ||
|
|
d2729193c7 | ||
|
|
87fb325357 | ||
|
|
fb8ff7b892 | ||
|
|
5aeae7444f | ||
|
|
c9b11e9fbf | ||
|
|
0005efa508 | ||
|
|
6931cb9d65 | ||
|
|
c1bcf0f11a | ||
|
|
717e7ae8b2 | ||
|
|
bed00fb8e1 | ||
|
|
2010401b81 | ||
|
|
23e09e3b3c | ||
|
|
80c9d46b70 | ||
|
|
0aa107426c | ||
|
|
1517c77d9c | ||
|
|
51bf79bb8c | ||
|
|
d88eadff13 | ||
|
|
0d35e8e15e | ||
|
|
a0066a1ccf | ||
|
|
7a5082e8c4 | ||
|
|
dfc345756c | ||
|
|
137da6adf6 | ||
|
|
8563ec5a7a | ||
|
|
8ac4bee3bc | ||
|
|
579fb478b5 | ||
|
|
33c580ebbf | ||
|
|
ff389b3e97 | ||
|
|
50fe8e7852 | ||
|
|
cdb6d19989 | ||
|
|
29694e2945 | ||
|
|
9fe08d3913 | ||
|
|
c07a0d9005 | ||
|
|
cbd45478e0 | ||
|
|
6f243108e9 | ||
|
|
0dcdf7ae21 | ||
|
|
e7ef2bec8b | ||
|
|
4f4dce82c6 | ||
|
|
a619e7a88c | ||
|
|
102d960106 | ||
|
|
7de71b29a0 | ||
|
|
4eced8a393 | ||
|
|
710b9c35e5 | ||
|
|
f46984d218 | ||
|
|
44663a7e6e | ||
|
|
446124f378 | ||
|
|
c45f2085d5 | ||
|
|
3abf62b41a | ||
|
|
9b2982510e | ||
|
|
48bb1ebe01 | ||
|
|
fe4c6e4c56 | ||
|
|
37bd9ffc48 | ||
|
|
b0548b4944 | ||
|
|
12425556c1 | ||
|
|
3ed2da562b | ||
|
|
354f46d8c5 | ||
|
|
e70f0db83c | ||
|
|
49b8c56fde | ||
|
|
940fdd5573 | ||
|
|
ef53db201e | ||
|
|
aeb0b0728d | ||
|
|
8b2746abf1 | ||
|
|
01da060496 | ||
|
|
20cbd269c4 | ||
|
|
7c2cd43dfa | ||
|
|
de5feff720 | ||
|
|
7342de837d | ||
|
|
aa2c648918 | ||
|
|
e914b50d16 | ||
|
|
f79554f918 | ||
|
|
213cc9c4b5 | ||
|
|
05f3b8fa0f | ||
|
|
bc53624133 | ||
|
|
5944d034da | ||
|
|
df400feb61 | ||
|
|
48e10c57da | ||
|
|
1eb818b64c | ||
|
|
0954932091 | ||
|
|
e584d9cd2e | ||
|
|
4d140ea6bd | ||
|
|
09a2e50fc2 | ||
|
|
35d8ef33ef | ||
|
|
f1ff2af47a | ||
|
|
d2d2c31ec7 | ||
|
|
95102c1c6c | ||
|
|
fa8c16ae01 | ||
|
|
7ca2a8213d | ||
|
|
1c8e5046e5 | ||
|
|
68a5652733 | ||
|
|
6b4be30c64 | ||
|
|
6ce952ad4a | ||
|
|
5ae62dd9d7 | ||
|
|
51987107a2 | ||
|
|
e4a8c4813c | ||
|
|
3d708f7dc4 | ||
|
|
4b5bcb56bc | ||
|
|
10ec8c9558 | ||
|
|
3900f758ea | ||
|
|
a3346fbad8 | ||
|
|
f73d58d74e | ||
|
|
813d5e1ddf | ||
|
|
acb661df72 | ||
|
|
4bc7710de9 | ||
|
|
b8c1f4f138 | ||
|
|
387b67472c | ||
|
|
b2c099bac6 | ||
|
|
1acebb1cc4 | ||
|
|
8d89a8dcb0 | ||
|
|
a60a34331b | ||
|
|
749015eb86 | ||
|
|
4b45142e72 | ||
|
|
76009ce7b9 | ||
|
|
2722119776 | ||
|
|
c724585bce | ||
|
|
0b61e46f95 | ||
|
|
5c0da486b9 | ||
|
|
9701e5e6e4 | ||
|
|
1684091234 | ||
|
|
a93eb8b8f5 | ||
|
|
c591ab5e6f | ||
|
|
b3fbebed55 | ||
|
|
4621f88441 | ||
|
|
747edb3a99 | ||
|
|
558970e281 | ||
|
|
73fd20a608 | ||
|
|
78c2c33b9e | ||
|
|
610add1f59 | ||
|
|
655510ce28 | ||
|
|
f7414700f4 | ||
|
|
53a860a5bf | ||
|
|
1aae450303 | ||
|
|
b3a2f8837c | ||
|
|
33d2a93294 | ||
|
|
2da0db70de | ||
|
|
8b5cbf8066 | ||
|
|
9668563801 | ||
|
|
ff7067f3a3 | ||
|
|
6b8b152444 | ||
|
|
3dbe3b3e7f | ||
|
|
7aa4bff97b | ||
|
|
6002fac9f1 | ||
|
|
231c6ac862 | ||
|
|
c3eb7e1634 | ||
|
|
05a6ee2b49 | ||
|
|
94d76c042d | ||
|
|
23ccaa6191 | ||
|
|
476e9d0a48 | ||
|
|
7cd5ed6fc6 | ||
|
|
750c23f319 | ||
|
|
bb36df8b2e | ||
|
|
470c43a986 | ||
|
|
8ea78e8361 | ||
|
|
9c748d20d5 | ||
|
|
af15b22b03 | ||
|
|
80c9c705b8 | ||
|
|
138419d232 | ||
|
|
8cee15bc5a | ||
|
|
8113974b26 | ||
|
|
2b70cefd48 | ||
|
|
16054d4bfd | ||
|
|
c2d4a53b67 | ||
|
|
29cbf8b83f | ||
|
|
3448b1c78c | ||
|
|
31253f400d | ||
|
|
1b6f547948 | ||
|
|
deb68b414a | ||
|
|
b799b063f8 | ||
|
|
368014b8dd | ||
|
|
fa16e66a6d | ||
|
|
40af31da4c | ||
|
|
9e6c0685a2 | ||
|
|
ebad3d4755 | ||
|
|
d4fd0681ef | ||
|
|
43a47aa08b | ||
|
|
20079b4c2f | ||
|
|
2aeec7703e | ||
|
|
cef458c31c | ||
|
|
617a5766a2 | ||
|
|
f1d6733554 | ||
|
|
5f3bcb1f58 | ||
|
|
b419bfd95f | ||
|
|
e406a2c15e | ||
|
|
962a75c45e | ||
|
|
6cdc13d6c6 | ||
|
|
92944f7847 | ||
|
|
276792a812 | ||
|
|
579fa6ea93 | ||
|
|
2f2b211766 | ||
|
|
88a3cb51af | ||
|
|
40679cf638 | ||
|
|
5b587e8578 | ||
|
|
50a1121d81 | ||
|
|
3239c5efcc | ||
|
|
fb0bd22979 | ||
|
|
3dc6c0afa2 | ||
|
|
e8762781a7 | ||
|
|
2bf841e22a | ||
|
|
5b9892a902 | ||
|
|
7ebab98e91 | ||
|
|
23fc6cc900 | ||
|
|
2e35cdea6c | ||
|
|
22af8e782b | ||
|
|
c88e910009 | ||
|
|
43ba312593 | ||
|
|
3c17299a92 | ||
|
|
a7ecff657c | ||
|
|
79a4f789a1 | ||
|
|
28ba0b37e1 | ||
|
|
6b7ade9f3f | ||
|
|
465367294f | ||
|
|
563c117303 | ||
|
|
1c04ca8032 | ||
|
|
d32e20bcaa | ||
|
|
8b8ba6b0a6 | ||
|
|
81fb015391 | ||
|
|
d8c71d5fdb | ||
|
|
fb5b5aef0a | ||
|
|
6787423edc | ||
|
|
ffcdf5dfbc | ||
|
|
0cdb173846 | ||
|
|
c9d5472ffb | ||
|
|
15bd71ed94 | ||
|
|
a76b7a37fd | ||
|
|
5cdf9ce19b | ||
|
|
0fba09246b | ||
|
|
444fd8180d | ||
|
|
f6b875e09d | ||
|
|
694c0a4fb3 | ||
|
|
da7959c2e8 | ||
|
|
2e44f23b05 | ||
|
|
f5351bee25 | ||
|
|
a1999ab2a5 | ||
|
|
1bccccc174 | ||
|
|
4e3c61ef4d | ||
|
|
7b4de401d2 | ||
|
|
1570d5f694 | ||
|
|
181a007a34 | ||
|
|
7df73a5d90 | ||
|
|
b00fa5567c | ||
|
|
4ecdc2903d | ||
|
|
7a57b039a6 | ||
|
|
1ce628529b | ||
|
|
6089353d52 | ||
|
|
db45fb483c | ||
|
|
4272dcac1d | ||
|
|
32ac8bdf79 | ||
|
|
7f92b1e0e8 | ||
|
|
d5550e946d | ||
|
|
62411f5a6e | ||
|
|
e9465f0ee5 | ||
|
|
14dfeee4ed | ||
|
|
f1d8547b29 | ||
|
|
7b46edb483 | ||
|
|
5497a1dfa7 | ||
|
|
c8bf8c6521 | ||
|
|
b6b135c060 | ||
|
|
f76ac19627 | ||
|
|
abe80e371e | ||
|
|
1ecc7940b8 | ||
|
|
ab11b2bba5 | ||
|
|
6d7f1256de | ||
|
|
cf094bd56b | ||
|
|
78a56cf66f | ||
|
|
ec084acdba | ||
|
|
8f7b008b15 | ||
|
|
83086ba91a | ||
|
|
c3b4662563 | ||
|
|
3eecc2ca45 | ||
|
|
881c060d8c | ||
|
|
f8da73bd04 | ||
|
|
336a98feb0 | ||
|
|
ef41583614 | ||
|
|
979e6c5325 | ||
|
|
b7d1610141 | ||
|
|
cd53bd81bf | ||
|
|
e5625b8cf0 | ||
|
|
c663349f24 | ||
|
|
854e9fe395 | ||
|
|
c60ea227cc | ||
|
|
49cd8e6e73 | ||
|
|
3b17a659f6 | ||
|
|
600fcdf52d | ||
|
|
4922bb41d6 | ||
|
|
aad8697575 | ||
|
|
dc7a7df61c | ||
|
|
b3f85e2daa | ||
|
|
ffb49c6c58 | ||
|
|
2ec585518e | ||
|
|
459df42b8b | ||
|
|
a4c1fed513 | ||
|
|
866eadb5de | ||
|
|
5e13274b7c | ||
|
|
e0d7f7de5e | ||
|
|
df575f968f | ||
|
|
1fff737955 | ||
|
|
b40c6c862f | ||
|
|
9bc2c75e38 | ||
|
|
2d5f76594a | ||
|
|
cc05c5fe8c | ||
|
|
66d7b194d4 | ||
|
|
41060943bd | ||
|
|
5ae9bb8925 | ||
|
|
bb519154fe | ||
|
|
77f5487a58 | ||
|
|
db9a8f6efe | ||
|
|
6f28a69b7d | ||
|
|
6ce4835eea | ||
|
|
29042f1c95 | ||
|
|
d08c43951f | ||
|
|
5d6964cf81 | ||
|
|
0d855bfc1b | ||
|
|
6f967c6ef3 | ||
|
|
b8a43db84c | ||
|
|
70b62c1a32 | ||
|
|
28b1f0b90f | ||
|
|
1dd966f189 | ||
|
|
fe8946ddc7 | ||
|
|
72b71a6ba3 | ||
|
|
f8933fe504 | ||
|
|
89c33d690f | ||
|
|
7079dc5e75 | ||
|
|
5080db84e2 | ||
|
|
053c7ac588 | ||
|
|
8a59ce6d37 | ||
|
|
f2fde180cd | ||
|
|
95efb3e19d | ||
|
|
0a6ce87c22 | ||
|
|
2aa79fa91d | ||
|
|
3980678d24 | ||
|
|
319d5ab1c6 | ||
|
|
448bbbc38c | ||
|
|
e575a2aad9 | ||
|
|
4f7aedc9d2 | ||
|
|
7a5908933e | ||
|
|
ee44313445 | ||
|
|
abef9b90ef | ||
|
|
12a999f0b8 | ||
|
|
acfb360770 | ||
|
|
bdfd14c2b7 | ||
|
|
cddc09feaa | ||
|
|
3c3b6ae8ca | ||
|
|
2f83aa9e1b | ||
|
|
fc591d0cd6 | ||
|
|
9a17c3efc6 | ||
|
|
b7220f075c | ||
|
|
a1556fd11f | ||
|
|
77f1c872b1 | ||
|
|
49ce44e1f5 | ||
|
|
f54b3ffc0e | ||
|
|
b0f5e5cc79 | ||
|
|
8d6ecd66cc | ||
|
|
f82fb52187 | ||
|
|
2e1975ddf6 | ||
|
|
97ce392bcc | ||
|
|
afefbda518 | ||
|
|
4fca2502d8 | ||
|
|
6975c336fc | ||
|
|
0288093caf | ||
|
|
a3a034813b | ||
|
|
c64d2573dc | ||
|
|
f028cc4392 | ||
|
|
302e37460f | ||
|
|
3cdbc5f525 | ||
|
|
a69251864b | ||
|
|
45d63d2006 | ||
|
|
cbba1ebf8f | ||
|
|
e86d1378da | ||
|
|
4a9d200554 | ||
|
|
acf6a9229d | ||
|
|
4ff4582132 | ||
|
|
42dce01ec1 | ||
|
|
a35059e3f1 | ||
|
|
5a30fafdda | ||
|
|
dce91ad37c | ||
|
|
2cff8b43cf | ||
|
|
be96654d56 | ||
|
|
ce962c3fdf | ||
|
|
f931504e1c | ||
|
|
d978f351da | ||
|
|
ec519f22dc | ||
|
|
e8b213e367 | ||
|
|
cfb47d30a5 | ||
|
|
dbbe4e017a | ||
|
|
371bc3a8f7 | ||
|
|
5e7889c5ef | ||
|
|
b1b2ad5017 | ||
|
|
e043ca83c5 | ||
|
|
c2434dfbbc | ||
|
|
816ad2102f | ||
|
|
f5feb16ef4 | ||
|
|
adf09f2124 | ||
|
|
2591960e2f | ||
|
|
d93842db3e | ||
|
|
8dc2b263ba | ||
|
|
8d842701b5 | ||
|
|
de85b0fda5 | ||
|
|
5d6beed590 | ||
|
|
1ff9de4c87 | ||
|
|
34482ed4df | ||
|
|
9b6ced66f3 | ||
|
|
e7e8ee5fe6 | ||
|
|
b3b4e33535 | ||
|
|
bd93d90a89 | ||
|
|
ea69c84b33 | ||
|
|
783b649bb1 | ||
|
|
eb21e6f8f7 | ||
|
|
ab2aa5672b | ||
|
|
ff87a54202 | ||
|
|
439dbce679 | ||
|
|
e9c9838cdc | ||
|
|
803d4ba948 | ||
|
|
732245e562 | ||
|
|
9e8d5433e7 | ||
|
|
fdcdb21c38 | ||
|
|
11d0533cfc | ||
|
|
dbb5f00d68 | ||
|
|
9cc412e2fd | ||
|
|
5b2efc0a12 | ||
|
|
7e4c48a461 | ||
|
|
082e162f3c | ||
|
|
7cc7c06c7b | ||
|
|
12ebeb30d0 | ||
|
|
c78abbe1d2 | ||
|
|
124c7848c0 | ||
|
|
ce9667c4f5 | ||
|
|
f3f40840b3 | ||
|
|
2c1570595e | ||
|
|
302abf1b46 | ||
|
|
089a03be42 | ||
|
|
de4fe72861 | ||
|
|
d1b3a83f59 | ||
|
|
eb6792533d | ||
|
|
6800d317e7 | ||
|
|
c98362eab1 | ||
|
|
e520469b3e | ||
|
|
54067256eb | ||
|
|
c4d2eeeec7 | ||
|
|
f51e696e4a | ||
|
|
a433b132fc | ||
|
|
cf48a56d2e | ||
|
|
6cad1b243b | ||
|
|
3c393dca58 | ||
|
|
172924457f | ||
|
|
f6644a92af | ||
|
|
48998f7239 | ||
|
|
15ff52f9fb | ||
|
|
6c03bb142b | ||
|
|
524b439221 | ||
|
|
859bf2bc41 | ||
|
|
b5619fb156 | ||
|
|
dcbe0c690f | ||
|
|
2996c28456 | ||
|
|
42e8ceb656 | ||
|
|
1daf9ce8b7 | ||
|
|
d68edf56c0 | ||
|
|
0c4e9fef29 | ||
|
|
571404c6e8 | ||
|
|
4d562b773b | ||
|
|
e62258713e | ||
|
|
4bd075defd | ||
|
|
b46a324943 | ||
|
|
4bd44b9cdf | ||
|
|
1b42110d4f | ||
|
|
0735ec55f3 | ||
|
|
00554779e1 | ||
|
|
0963f38935 | ||
|
|
1abfa3ca5f | ||
|
|
f2159bc2c1 | ||
|
|
b0eb68ee9e | ||
|
|
e7b7b037f6 | ||
|
|
5e4f434fd8 | ||
|
|
20ea964f2f | ||
|
|
d105619bc3 | ||
|
|
ec5729b1fa | ||
|
|
6c9196953e | ||
|
|
46576178a3 | ||
|
|
5e925f873e | ||
|
|
153531d4d0 | ||
|
|
f7287df03f | ||
|
|
2b085815b7 | ||
|
|
986fa30264 | ||
|
|
7c8cb3a0ce | ||
|
|
334c439ce0 | ||
|
|
6c17ed7e61 | ||
|
|
6700626c30 | ||
|
|
15162addc4 | ||
|
|
9327077741 | ||
|
|
aeb92bbbe2 | ||
|
|
fc7489e044 | ||
|
|
87ac872fdc | ||
|
|
c278adde7a | ||
|
|
f94d720909 | ||
|
|
9b9baa6bd9 | ||
|
|
02566ee383 | ||
|
|
3002f31b1f | ||
|
|
d2a594a753 | ||
|
|
651e147711 | ||
|
|
a42faf1cc2 | ||
|
|
4aac05e193 | ||
|
|
b80dfaa8a0 | ||
|
|
a19d8f5d31 | ||
|
|
33f6e90a56 | ||
|
|
ed7fabcbc2 | ||
|
|
8753b6da14 | ||
|
|
f2de733bdf | ||
|
|
88ff8c69a0 | ||
|
|
a63558a1eb | ||
|
|
3575a1325e | ||
|
|
e2de2fee69 | ||
|
|
9f415979fb | ||
|
|
4bfc0cd196 | ||
|
|
9c824b87fe | ||
|
|
a1ea1696be | ||
|
|
dfc0f248c6 | ||
|
|
ed7c9db2a6 | ||
|
|
5b42815afb | ||
|
|
cfe7fa9a75 | ||
|
|
cb8a9d58fd | ||
|
|
023b94480b | ||
|
|
9b03c64f68 | ||
|
|
b8eccec62d | ||
|
|
9f21258720 | ||
|
|
47f6012407 | ||
|
|
770e44de4d | ||
|
|
2ab319c137 | ||
|
|
3992302432 | ||
|
|
b30f312a70 | ||
|
|
c5cdb78a95 | ||
|
|
d82811303b | ||
|
|
f79a58120e | ||
|
|
9d843334d6 | ||
|
|
23cb3f38a6 | ||
|
|
1d682dcdae | ||
|
|
601fbbb4ae | ||
|
|
f44aa2466f | ||
|
|
dd74a6dd34 | ||
|
|
e959e7338e | ||
|
|
fb9a204de2 | ||
|
|
cd096802bd | ||
|
|
7417fd71a4 | ||
|
|
2d1a981c81 | ||
|
|
45acc922eb | ||
|
|
214d089910 | ||
|
|
31fd707d0c | ||
|
|
9a2e38e058 | ||
|
|
d24527e7e6 | ||
|
|
6195d747ce | ||
|
|
fb97f596e1 | ||
|
|
0ccc7a770d | ||
|
|
32826466f5 | ||
|
|
0422f8a844 | ||
|
|
e329479a99 | ||
|
|
f80a7873ba | ||
|
|
866ac6ab27 | ||
|
|
b574ae6aa2 | ||
|
|
de4fd7cd35 | ||
|
|
32d7883c47 | ||
|
|
9b24e19763 | ||
|
|
13ffece12d | ||
|
|
9d5b781df6 | ||
|
|
11d822c2a7 | ||
|
|
4098512b5d | ||
|
|
7e06ac1072 | ||
|
|
c6d8c4013c | ||
|
|
e5b3f9addd | ||
|
|
880f948684 | ||
|
|
bda7e079e2 | ||
|
|
fc94018b97 | ||
|
|
159c5e446a | ||
|
|
bfd4d8b052 | ||
|
|
388e785822 | ||
|
|
2ba1389993 | ||
|
|
d65a417306 | ||
|
|
575bc309b9 | ||
|
|
00909d0742 | ||
|
|
a7e38724e7 | ||
|
|
325612bcde | ||
|
|
8034221525 | ||
|
|
2e6593e5a5 | ||
|
|
572735e496 | ||
|
|
e8d693c395 | ||
|
|
f44dfcd9dc | ||
|
|
1f1b0d93d4 | ||
|
|
ce8c749b77 | ||
|
|
3e4f257b91 | ||
|
|
86fab997b4 | ||
|
|
c3ecd44592 | ||
|
|
c65ca20a49 | ||
|
|
a5c408c5e3 | ||
|
|
06379b2861 | ||
|
|
e04de48ed9 | ||
|
|
009646421c | ||
|
|
8d0b4544f8 | ||
|
|
d8a34131e1 | ||
|
|
5db17d0af9 | ||
|
|
1bf69b5662 | ||
|
|
3febaef1fa | ||
|
|
b1bd6035e8 | ||
|
|
b48bcb214a | ||
|
|
6f3ce2c72d | ||
|
|
2f9121cf44 | ||
|
|
e65e7711ca | ||
|
|
636ef51b0f | ||
|
|
400934e5a3 | ||
|
|
4c3a3acf9b | ||
|
|
9aa6002c37 | ||
|
|
f342260bfe | ||
|
|
a6dd497016 | ||
|
|
842509dab6 | ||
|
|
4add618a3f | ||
|
|
6e74466231 | ||
|
|
478eac099f | ||
|
|
88e2029e37 | ||
|
|
45d76cf501 | ||
|
|
54573f28a8 | ||
|
|
17793e99dc | ||
|
|
5eac3c9025 | ||
|
|
e70195ae91 | ||
|
|
fe51e7fa1a | ||
|
|
eb951c2ce4 | ||
|
|
39f0ce7c25 | ||
|
|
65157811d4 | ||
|
|
e8af7afc65 | ||
|
|
38abfd1863 | ||
|
|
ff3edc09ed | ||
|
|
0bb1540682 | ||
|
|
f0836c7e39 | ||
|
|
25db178b7d | ||
|
|
1b6713e6ec | ||
|
|
c1a496cf4e | ||
|
|
e098a21132 | ||
|
|
0ba4bf51e4 | ||
|
|
6deee2037d | ||
|
|
6761a933fe | ||
|
|
5cc3d159e1 | ||
|
|
652f57e79d | ||
|
|
acd6b40e4c | ||
|
|
0fbb46edd6 | ||
|
|
6ad629de47 | ||
|
|
74754982f1 | ||
|
|
a31a2e3b2c | ||
|
|
a776b0dbcc | ||
|
|
cfd926f09b | ||
|
|
72f52716ae | ||
|
|
439b9b6c6a | ||
|
|
4849845292 | ||
|
|
d30f38163c | ||
|
|
cff9ebe1dd | ||
|
|
4d1139f653 | ||
|
|
48f574076c | ||
|
|
c1f14d73c7 | ||
|
|
216f4dad83 | ||
|
|
a4e27d766b | ||
|
|
96df14d2ec | ||
|
|
2365f12e39 | ||
|
|
96ea9cdaf7 | ||
|
|
03f7ec0f60 | ||
|
|
a941699962 | ||
|
|
2056e812bd | ||
|
|
04348ff20e | ||
|
|
d8e378fea9 | ||
|
|
1ebb6810a1 | ||
|
|
2a694b270a | ||
|
|
a3ebeeafba | ||
|
|
422ad1be32 | ||
|
|
97f1735cf5 | ||
|
|
939ad5ddbe | ||
|
|
24d92b979d | ||
|
|
4c92ff1843 | ||
|
|
280db5c6ba | ||
|
|
7fbcb2d005 | ||
|
|
53aeb2c3d7 | ||
|
|
ff200bfcf3 | ||
|
|
fee3151fd2 | ||
|
|
99a85159ae | ||
|
|
2a981a3f56 | ||
|
|
0028275d7b | ||
|
|
ee8bfddfc9 | ||
|
|
194acb1f2c | ||
|
|
43a2a70ae7 | ||
|
|
73344ae9aa | ||
|
|
c479f6122f | ||
|
|
eca0a3025b | ||
|
|
4720c5cb3d | ||
|
|
cd55ab28ab | ||
|
|
d402cfdf16 | ||
|
|
22502182d0 | ||
|
|
05e1fd5e77 | ||
|
|
943d7923f9 | ||
|
|
568ecbfb28 | ||
|
|
f5ddd7f43b | ||
|
|
88abbce7e7 | ||
|
|
16e9036568 | ||
|
|
fa7945c627 | ||
|
|
daca43f0dd | ||
|
|
16bc11e670 | ||
|
|
6f7e94cdba | ||
|
|
61efa15a14 | ||
|
|
8c0ea56bb8 | ||
|
|
549053710b | ||
|
|
6010d39325 | ||
|
|
be5c39a1cf | ||
|
|
b8fda6808b | ||
|
|
e29b9c1261 | ||
|
|
539e27812b | ||
|
|
7008afd40e | ||
|
|
77a41756db | ||
|
|
b15045d60e | ||
|
|
03084f7517 | ||
|
|
60baca27e4 | ||
|
|
86990db236 | ||
|
|
cb376bcd80 | ||
|
|
f2b8edd1e2 | ||
|
|
c4f8afcfde | ||
|
|
1a1a216d5a | ||
|
|
9f80a82c1a | ||
|
|
c573c80bd3 | ||
|
|
3cd6817e21 | ||
|
|
d4a69658a1 | ||
|
|
8e06fe4971 | ||
|
|
aaeeec8f1c | ||
|
|
66d5e24606 | ||
|
|
e8907a073f | ||
|
|
9656ac0254 | ||
|
|
75624617ce | ||
|
|
1a8f6578b3 | ||
|
|
4f0548b018 | ||
|
|
5119e82b93 | ||
|
|
3be5856c82 | ||
|
|
a319143901 | ||
|
|
17c88d60c7 | ||
|
|
7601511fdf | ||
|
|
f507b5eee4 | ||
|
|
93821165be | ||
|
|
aaa0b858e4 | ||
|
|
5fa1938691 | ||
|
|
56ee3d4820 | ||
|
|
c2d9a1ed6f | ||
|
|
fcf9ab2798 | ||
|
|
35e445bd04 | ||
|
|
88ce3c31b7 | ||
|
|
16320a0f81 | ||
|
|
8c72fb3539 | ||
|
|
8ffe389daa | ||
|
|
189a4516a1 | ||
|
|
2576855ded | ||
|
|
7d4d48a35e | ||
|
|
cc6f759190 | ||
|
|
c23fc86a23 | ||
|
|
d2324bdda1 | ||
|
|
6f0ae9d49a | ||
|
|
0389af5724 | ||
|
|
1766e25f45 | ||
|
|
323001238a | ||
|
|
91f062f873 | ||
|
|
650a0cfbff | ||
|
|
e6b8b3d1d3 | ||
|
|
a170023f23 | ||
|
|
4be4c0cddc | ||
|
|
0de9d374df | ||
|
|
0df199198a | ||
|
|
7646e376e0 | ||
|
|
5996798a34 | ||
|
|
6fec532012 | ||
|
|
15713e0b7c | ||
|
|
a6a561af47 | ||
|
|
09c468a4b4 | ||
|
|
bcda1c2409 | ||
|
|
afcd8d9ab1 | ||
|
|
c9b1c91944 | ||
|
|
5d9434eb09 | ||
|
|
1a44b5d52a | ||
|
|
6635ca5e26 | ||
|
|
9c6c78833b | ||
|
|
9a9ab0813c | ||
|
|
0ccaaa48ce | ||
|
|
3f2fe98dd1 | ||
|
|
0d91e9c255 | ||
|
|
af926fbe1f | ||
|
|
83039ae2d4 | ||
|
|
4c53da6961 | ||
|
|
eb306f463e | ||
|
|
788835c5fd | ||
|
|
4d76606fa2 | ||
|
|
1baf7d34b3 | ||
|
|
c78159469a | ||
|
|
b72ca0289c | ||
|
|
46f670f8a2 | ||
|
|
4b44362b9f | ||
|
|
d068a29798 | ||
|
|
0836a51408 | ||
|
|
566cee8fe7 | ||
|
|
e85698e131 | ||
|
|
5f3c541c4c | ||
|
|
3c43e00d8a | ||
|
|
92d686d356 | ||
|
|
0f69e9c825 | ||
|
|
217d979458 | ||
|
|
cc289972fc | ||
|
|
c601e603c2 | ||
|
|
1002c6da1c | ||
|
|
0911337689 | ||
|
|
3bcc416e13 | ||
|
|
65837806f5 | ||
|
|
b0772dcc66 | ||
|
|
c6d65aad3b | ||
|
|
18dd20ce55 | ||
|
|
0f6d76a501 | ||
|
|
0f1320109f | ||
|
|
defa28c618 | ||
|
|
b7c95be47c | ||
|
|
a18d154e0e | ||
|
|
52195a12ee | ||
|
|
59c78d5809 | ||
|
|
be164fc8f9 | ||
|
|
5833ef1efc | ||
|
|
28f88d46f3 | ||
|
|
6ec7683991 | ||
|
|
fb2d8f79d6 | ||
|
|
8f7fa1b1bf | ||
|
|
e5889ce622 | ||
|
|
3a6f83394c | ||
|
|
acf36f3d1a | ||
|
|
63e6a8bab2 | ||
|
|
5361cc6bd1 | ||
|
|
cabac55394 | ||
|
|
db7483ef10 | ||
|
|
4b51ccbefe | ||
|
|
74c2f1257a | ||
|
|
1428a5e3ae | ||
|
|
fe021c1524 | ||
|
|
c57bf21306 | ||
|
|
1743b7d92d | ||
|
|
7f31278c4c | ||
|
|
8401e16a15 | ||
|
|
07fb5854f3 | ||
|
|
b56a99bfba | ||
|
|
b91e4e4df1 | ||
|
|
52a4d6ac31 | ||
|
|
796ab87b14 | ||
|
|
ed1fad3bd4 | ||
|
|
9c1876f542 | ||
|
|
7d111d9963 | ||
|
|
8c2ce0cf3f | ||
|
|
1b442cb16f | ||
|
|
2bf3680d87 | ||
|
|
0d4f0f0db5 | ||
|
|
e17ff8fd32 | ||
|
|
14edd12304 | ||
|
|
e6ffdb23a4 | ||
|
|
98fdedac06 | ||
|
|
255037264a | ||
|
|
d3fcbe9a02 | ||
|
|
bcdd588c6e | ||
|
|
b5007d45f7 | ||
|
|
a584cf5a4f | ||
|
|
77f7a2fa7f | ||
|
|
f2c539dc70 | ||
|
|
78d7160a99 | ||
|
|
196673bbce | ||
|
|
794d13082c | ||
|
|
5f5cf4107e | ||
|
|
6f3ec54b9f | ||
|
|
58043a6b04 | ||
|
|
a885315ef5 | ||
|
|
d7581525ac | ||
|
|
385068eb91 | ||
|
|
1085f68018 | ||
|
|
21af775ce0 | ||
|
|
bf16fee6e9 | ||
|
|
2358a2137a | ||
|
|
66baa7dc25 | ||
|
|
d63b4c1034 | ||
|
|
963e220a1c | ||
|
|
2f146e4d4c | ||
|
|
f796eede5a | ||
|
|
c89453be95 | ||
|
|
c3f5f5ca36 | ||
|
|
911d12f7c4 | ||
|
|
34d3c45d35 | ||
|
|
17614312e0 | ||
|
|
977779ae8d | ||
|
|
a2e35a0757 | ||
|
|
a4a2b6403b | ||
|
|
8ce8e289c9 | ||
|
|
03be97e437 | ||
|
|
2c5cf5a82a | ||
|
|
0a2d1965df | ||
|
|
c8a5f1e335 | ||
|
|
5e00cf9620 | ||
|
|
ce6370e25c | ||
|
|
3f8c1e4b34 | ||
|
|
25cda200be | ||
|
|
a1bc83a2ba | ||
|
|
bc3949db9e | ||
|
|
6cfa885207 | ||
|
|
899588e0b5 | ||
|
|
49af52a68d | ||
|
|
ec908af19c | ||
|
|
e61ac4682e | ||
|
|
4d10dce61d | ||
|
|
c569830dfc | ||
|
|
2d9fd87029 | ||
|
|
2670bfb8ba | ||
|
|
cc9190ab37 | ||
|
|
980570de71 | ||
|
|
ef92b54db3 | ||
|
|
0130124cea | ||
|
|
e2a7e867f9 | ||
|
|
32ce0ce5d9 | ||
|
|
28082ff5f5 | ||
|
|
46ccc4332c | ||
|
|
3a1217e667 | ||
|
|
39fd0c1278 | ||
|
|
4e6bd54dd1 | ||
|
|
5c9f46a6b0 | ||
|
|
7d53866157 | ||
|
|
9a2e948c42 | ||
|
|
223e971c7e | ||
|
|
df814223ff | ||
|
|
82b326e684 | ||
|
|
6aa581d2f0 | ||
|
|
8c0b2c684a | ||
|
|
62324781bd | ||
|
|
7ae0b2dc09 | ||
|
|
058122b804 | ||
|
|
69f63c529d | ||
|
|
e17a6b29b6 | ||
|
|
b12c2a13c0 | ||
|
|
236c835abc | ||
|
|
b41a5afe04 | ||
|
|
ad338bfa44 | ||
|
|
a899522679 | ||
|
|
b9b58c781e | ||
|
|
aa1eec4642 | ||
|
|
0c8d9469ea | ||
|
|
079e1bdffc | ||
|
|
b4337d1b54 | ||
|
|
e6a11c5e12 | ||
|
|
dbe287ff5e | ||
|
|
61dc1a7c62 | ||
|
|
dc1e0c0195 | ||
|
|
041531458b | ||
|
|
1374bb81fd | ||
|
|
f41ac103d3 | ||
|
|
f6301714db | ||
|
|
7dc39b1ee9 | ||
|
|
696a7ce407 | ||
|
|
d28d788623 | ||
|
|
99122ee7bb | ||
|
|
19ee7ec794 | ||
|
|
cd9ec0d20f | ||
|
|
e77883e980 | ||
|
|
0994c92550 | ||
|
|
465c7208cc | ||
|
|
4f9f181f07 | ||
|
|
b7e7a4bf26 | ||
|
|
c7df65309b | ||
|
|
26900262f3 | ||
|
|
9b5ce36368 | ||
|
|
f69b52b1aa | ||
|
|
1e1d908c12 | ||
|
|
6c69d675da | ||
|
|
feabd6f739 | ||
|
|
1ea590c364 | ||
|
|
b21779e685 | ||
|
|
12a4e7c3a2 | ||
|
|
799a76de74 | ||
|
|
b1fee8ff63 | ||
|
|
9cc223d419 | ||
|
|
20edd64301 | ||
|
|
9aee518352 | ||
|
|
6ca515ea70 | ||
|
|
51b933c5f0 | ||
|
|
3f13d33543 | ||
|
|
85a12429ee | ||
|
|
3e0e3f5459 | ||
|
|
801869a5d5 | ||
|
|
54f4b85beb | ||
|
|
fa074145a4 | ||
|
|
b2d6550179 | ||
|
|
62dd1f5177 | ||
|
|
dc7c12d474 | ||
|
|
a6dda5f91c | ||
|
|
c1f7795dd6 | ||
|
|
4989e6e419 | ||
|
|
d4963bcd32 | ||
|
|
d725255784 | ||
|
|
5f4159a0d7 | ||
|
|
0a2a5e6604 | ||
|
|
acd05f2aa5 | ||
|
|
bb7718a64a | ||
|
|
e59fc725ab | ||
|
|
4fcd0fc144 | ||
|
|
373be22d7e | ||
|
|
b647a7c5b7 | ||
|
|
46ba9e080d | ||
|
|
e1b8317ae8 | ||
|
|
ea67864e08 | ||
|
|
6b286e0d94 | ||
|
|
d10ea5ea06 | ||
|
|
2af57c3cfc | ||
|
|
0c8b1a4f74 | ||
|
|
9d16292fe4 | ||
|
|
e2b9590c0f | ||
|
|
24fb640a55 | ||
|
|
e6a05cb66d | ||
|
|
12f9b09845 | ||
|
|
102b98813f | ||
|
|
1f55e5d34d | ||
|
|
5618e1bbc9 | ||
|
|
450ffaa6f0 | ||
|
|
dc15832030 | ||
|
|
0797e89a90 | ||
|
|
9f1543f81e | ||
|
|
a7c780a732 | ||
|
|
1bd6893084 | ||
|
|
ae21130b13 | ||
|
|
e06ed85747 | ||
|
|
83fd72c97e | ||
|
|
ace40f298d | ||
|
|
1133cc0bbc | ||
|
|
6960039aee | ||
|
|
bf5eeb831b | ||
|
|
e5b84fad09 | ||
|
|
cfb39171a7 | ||
|
|
2f6e1ac336 | ||
|
|
9e8d9d658a | ||
|
|
6ecfac6954 | ||
|
|
368775c2ed | ||
|
|
1e9a094edd | ||
|
|
ceb4dcf3b2 | ||
|
|
d2ef80fe3a | ||
|
|
79ae5aed67 | ||
|
|
56e86cd944 | ||
|
|
19a311ad62 | ||
|
|
b36e53cccd | ||
|
|
f3a5a0a0ec | ||
|
|
001d45efad | ||
|
|
56c455bca4 | ||
|
|
4bf3cb2cc0 | ||
|
|
c78528d54b | ||
|
|
f994664934 | ||
|
|
44e290da66 | ||
|
|
8aed101585 | ||
|
|
54ba1bebf2 | ||
|
|
e44c58282e | ||
|
|
c02b1041d9 | ||
|
|
0d20e07436 | ||
|
|
b7f956c967 | ||
|
|
786f52a81c | ||
|
|
23209baaf5 | ||
|
|
9d2503f9c0 | ||
|
|
1c31213aef | ||
|
|
fdb75ba5fe | ||
|
|
8f888b29bd | ||
|
|
298808f276 | ||
|
|
a231874e1e | ||
|
|
2101f4ae3f | ||
|
|
4a06f9684f | ||
|
|
5f31c09410 | ||
|
|
9a85c5264a | ||
|
|
fd475e4b2f | ||
|
|
5dc1d116c9 | ||
|
|
c566d3f475 | ||
|
|
68a724cf7b | ||
|
|
779ec50e73 | ||
|
|
aad3e275d1 | ||
|
|
1649948e78 | ||
|
|
6d3e010ae7 | ||
|
|
7dddac081e | ||
|
|
588dd33241 | ||
|
|
f0b6b9508d | ||
|
|
14ccb24be5 | ||
|
|
025ec85144 | ||
|
|
bd97886d8e | ||
|
|
0b1ddad62b | ||
|
|
540853bde8 | ||
|
|
c757f7d848 | ||
|
|
052f3a3871 | ||
|
|
2ae83e871b | ||
|
|
1cc08c0a51 | ||
|
|
16be89f9cc | ||
|
|
3ddc446ba2 | ||
|
|
b72c5f104e | ||
|
|
7e6eb7e02a | ||
|
|
712b08e8ed | ||
|
|
fbf156d22d | ||
|
|
965a0e87e5 | ||
|
|
2b55ca1ce6 | ||
|
|
534c01896c | ||
|
|
c25197ac40 | ||
|
|
becae65257 | ||
|
|
ba9f2c3ae2 | ||
|
|
0387525b77 | ||
|
|
5311185333 | ||
|
|
2fc2a27ac1 | ||
|
|
db938afd66 | ||
|
|
89ddc47616 | ||
|
|
90b7849af1 | ||
|
|
3176e872b3 | ||
|
|
16206d5f67 | ||
|
|
0f33749790 | ||
|
|
5e7e4c0cc0 | ||
|
|
25503ad763 | ||
|
|
8f513fceca | ||
|
|
91af4ed70d | ||
|
|
685e926494 | ||
|
|
a2afd393ed | ||
|
|
4e9098bccf | ||
|
|
33aa327ef5 | ||
|
|
9067ff5eee | ||
|
|
efeede4192 | ||
|
|
6a8749873f | ||
|
|
b1b8308555 | ||
|
|
9b574a5a76 | ||
|
|
0567f1f038 | ||
|
|
4be5de1163 | ||
|
|
9db1c9467c | ||
|
|
3444b42d44 | ||
|
|
6595ae26ea | ||
|
|
41d8a3ac09 | ||
|
|
175001a8d9 | ||
|
|
7cf9e00283 | ||
|
|
8a3eb3f066 | ||
|
|
7e1a0d204b | ||
|
|
cbca2e35b5 | ||
|
|
fc9bdf024f | ||
|
|
3f97e6cd3a | ||
|
|
4fa150c494 | ||
|
|
e8b2508036 | ||
|
|
ac399e41ac | ||
|
|
95dd908834 | ||
|
|
9c7e54d9b5 | ||
|
|
3c03024881 | ||
|
|
36dfc0a56a | ||
|
|
55bf6cdb15 | ||
|
|
0abc220013 | ||
|
|
c28900990a | ||
|
|
5108193d7b | ||
|
|
79a24f5dd9 | ||
|
|
83c759572c | ||
|
|
1a07fb000b | ||
|
|
4aab15999d | ||
|
|
441982674f | ||
|
|
8256c6e070 | ||
|
|
ae87a44b94 | ||
|
|
87d1692e27 | ||
|
|
1d2f008656 | ||
|
|
b064d8a9ff | ||
|
|
528af200b6 | ||
|
|
c6827a7dac | ||
|
|
55ecb082ee | ||
|
|
5f2cf461e6 | ||
|
|
b313386988 | ||
|
|
3933280d29 | ||
|
|
2b6073900f | ||
|
|
d1ba43a69f | ||
|
|
a0779edec4 | ||
|
|
d70fefe72f | ||
|
|
b52db072f1 | ||
|
|
ab0b98db61 | ||
|
|
4245d98653 | ||
|
|
93b4866f5b | ||
|
|
25df164219 | ||
|
|
ba03c082e9 | ||
|
|
bcfa333322 | ||
|
|
c4aeadd57d | ||
|
|
e6b4454e48 | ||
|
|
3226d21609 | ||
|
|
3d20c2dce6 | ||
|
|
cd83d70e7b | ||
|
|
a0ce5ea9ab | ||
|
|
3c600c103f | ||
|
|
841ac75c3e | ||
|
|
80a96817aa | ||
|
|
ecc05e0a1a | ||
|
|
359730af54 | ||
|
|
e9cb19c80e | ||
|
|
049e064e28 | ||
|
|
0463928a1e | ||
|
|
02d34c8c4c | ||
|
|
46acf32c41 | ||
|
|
cab0a76795 | ||
|
|
0c76cebbfc | ||
|
|
5029b85b25 | ||
|
|
0b71d9b828 | ||
|
|
464d7c4ec6 | ||
|
|
ed21b631ae | ||
|
|
950e2d9954 | ||
|
|
71c054a789 | ||
|
|
d2f456e5b1 | ||
|
|
30a44b26d3 | ||
|
|
7dff758f8b | ||
|
|
bd3ececdd8 | ||
|
|
77416b0ac2 | ||
|
|
fce9efd341 | ||
|
|
928fda1d70 | ||
|
|
2d9d654507 | ||
|
|
7398e57174 | ||
|
|
503ec82f4d | ||
|
|
22bd9fb530 | ||
|
|
e007b6b031 | ||
|
|
c487cd888f | ||
|
|
fd403a85c8 | ||
|
|
a06a8c36a4 | ||
|
|
0967ee9cb9 | ||
|
|
d66d34f9b9 | ||
|
|
264a98d106 | ||
|
|
7c11d2d9bb | ||
|
|
b58d7b406f | ||
|
|
5ed9e4c83b | ||
|
|
e7da2a669e | ||
|
|
d66377d4b6 | ||
|
|
77a324fa46 | ||
|
|
38b5cad4e3 | ||
|
|
29014643a9 | ||
|
|
0872f6babe | ||
|
|
b6a9cf9ffa | ||
|
|
5645cad577 | ||
|
|
85ba33c08f | ||
|
|
ff64f64e1d | ||
|
|
bdd3425028 | ||
|
|
70e02cddd3 | ||
|
|
d1c0a17cc2 | ||
|
|
35c5cbbc21 | ||
|
|
2ff31bdd2b | ||
|
|
2fa3d34af1 | ||
|
|
fa3452ec68 | ||
|
|
7451f2f212 | ||
|
|
e9ab75a386 | ||
|
|
d83949bc88 | ||
|
|
50f42a80c9 | ||
|
|
00bd76fc3d | ||
|
|
93ea6b581e | ||
|
|
8e52a5c7f3 | ||
|
|
0aa35e574a | ||
|
|
5a81f2441f | ||
|
|
2b75aff32e | ||
|
|
f4474d57ec | ||
|
|
d0310c8aee | ||
|
|
8471c9e92e | ||
|
|
f5a4c9d971 | ||
|
|
a0dd8918eb | ||
|
|
baa9b1cac0 | ||
|
|
38443d2195 | ||
|
|
208d71561a | ||
|
|
25fbc7b435 | ||
|
|
6bd95d885d | ||
|
|
c171097dea | ||
|
|
6bcdb178a5 | ||
|
|
5e10cc4cad | ||
|
|
95e6c875f0 | ||
|
|
6eb2829ee8 | ||
|
|
6ad9ddcdea | ||
|
|
e082b7be72 | ||
|
|
da01d8dedb | ||
|
|
ca6f6511f2 | ||
|
|
ee8440408c | ||
|
|
9cd695a1db | ||
|
|
4b45906f46 | ||
|
|
d448eb54f9 | ||
|
|
65739fe754 | ||
|
|
0344c962f8 | ||
|
|
46d1e6bb55 | ||
|
|
04606b9339 | ||
|
|
7bb083e69e | ||
|
|
3a831fa95c | ||
|
|
5b9cacc2d7 | ||
|
|
10a84f3e3d | ||
|
|
c42715ed6a | ||
|
|
177d51ddab | ||
|
|
6c882e1ece | ||
|
|
f09c5c4bf9 | ||
|
|
08a9a2eca9 | ||
|
|
19f1785cde | ||
|
|
109de15c1f | ||
|
|
8b64e7b4e1 | ||
|
|
a5d66e71d0 | ||
|
|
3de2654223 | ||
|
|
d49bd50908 | ||
|
|
4130c68db1 | ||
|
|
ad3dac81a2 | ||
|
|
0cf6848646 | ||
|
|
e9d562f987 | ||
|
|
bc0f501dd3 | ||
|
|
a591001e7b | ||
|
|
eaa9229d72 | ||
|
|
1d5cde1c6b | ||
|
|
de03c41111 | ||
|
|
19340da8d4 | ||
|
|
5e99531b4d | ||
|
|
bef3d47c16 | ||
|
|
b8f7b474b4 | ||
|
|
1fb291d0e1 | ||
|
|
bc3dc6b765 | ||
|
|
ee7c36c022 | ||
|
|
857791dbb9 | ||
|
|
3c3267ea7d | ||
|
|
d654664fb2 | ||
|
|
1a37044d3c | ||
|
|
00a8c378d4 | ||
|
|
7549341081 | ||
|
|
5db8473f12 | ||
|
|
00b89f10bd | ||
|
|
281df33f40 | ||
|
|
e6ae681f07 | ||
|
|
7e681dc98f | ||
|
|
412c8f9e67 | ||
|
|
2795da840c | ||
|
|
175c7886ea | ||
|
|
4a4b2cf538 | ||
|
|
2c2188c09d | ||
|
|
1f07c24a2e | ||
|
|
e038625881 | ||
|
|
cdb1d6b462 | ||
|
|
1b4ccd0d51 | ||
|
|
8babaac8c3 | ||
|
|
d1624d6929 | ||
|
|
e4472b5aec | ||
|
|
9439ba75d3 | ||
|
|
9254c563ca | ||
|
|
35594e09df | ||
|
|
96ff3be5e6 | ||
|
|
3d5d76ba74 | ||
|
|
8c1e155f44 | ||
|
|
dba0d2791c | ||
|
|
f310e82fc8 | ||
|
|
1240e55bb6 | ||
|
|
75039c573c | ||
|
|
4b5179a544 | ||
|
|
8efccddcf4 | ||
|
|
97843e3874 | ||
|
|
5dd2704051 | ||
|
|
de7b7fd440 | ||
|
|
1037d3ad26 | ||
|
|
c4368a9416 | ||
|
|
fdc1eb526b | ||
|
|
99a91e3172 | ||
|
|
272cfa320e | ||
|
|
f5285d1f5a | ||
|
|
ede6104900 | ||
|
|
5aec60fbeb | ||
|
|
e1a865c406 | ||
|
|
5e03b6a0db | ||
|
|
b85924bf70 | ||
|
|
19707aac55 | ||
|
|
9ad873fc06 | ||
|
|
8a9810ed32 | ||
|
|
68a6d8c50b | ||
|
|
600605400c | ||
|
|
97aa4dabc8 | ||
|
|
a6f487240d | ||
|
|
da135416bb | ||
|
|
13eb881e5e | ||
|
|
82c84d163b | ||
|
|
a526183928 | ||
|
|
60222ae7c3 | ||
|
|
2052a1a4bd | ||
|
|
183be9cac9 | ||
|
|
69b53b9aaa | ||
|
|
02b9fcd332 | ||
|
|
231d739b10 | ||
|
|
e1dfff8929 | ||
|
|
db1716ae93 | ||
|
|
4cdc74c957 | ||
|
|
2c17ec3df8 | ||
|
|
e464b10fc3 | ||
|
|
03ba399176 | ||
|
|
751d66a397 | ||
|
|
3ec71bf5a2 | ||
|
|
f19b0724a3 | ||
|
|
a7e0a69f97 | ||
|
|
e532e20491 | ||
|
|
3e1cfa8e99 | ||
|
|
a100df9cae | ||
|
|
56284b1e15 | ||
|
|
f267e400fa | ||
|
|
8bac5899cc | ||
|
|
f4016644a9 | ||
|
|
d9bc6d04f7 | ||
|
|
743fc4a3c3 | ||
|
|
392256e542 | ||
|
|
905e16cb99 | ||
|
|
9d4e8eeb12 | ||
|
|
8099dd9558 | ||
|
|
a3a6b91c5f | ||
|
|
d9bb3448bf | ||
|
|
d508a0c72c | ||
|
|
bc31146c1f | ||
|
|
1ad7d5e366 | ||
|
|
456038e3de | ||
|
|
9aa26970be | ||
|
|
20c39fa843 | ||
|
|
f5a2f1da25 | ||
|
|
27b250ac8e | ||
|
|
b14375ec63 | ||
|
|
6858cda366 | ||
|
|
8a703d21ae | ||
|
|
1dabe43ff4 | ||
|
|
900aef10da | ||
|
|
ded576f423 | ||
|
|
136aae725f | ||
|
|
a60c3f8939 | ||
|
|
99dc31ff1a | ||
|
|
7673848325 | ||
|
|
0f8a5ffc23 | ||
|
|
fddb019baf | ||
|
|
72bf7d4af0 | ||
|
|
581e0938a9 | ||
|
|
1064e017c6 | ||
|
|
79b07f0ce2 | ||
|
|
cd471a989a | ||
|
|
0ea44072a3 | ||
|
|
6ba1abac6c | ||
|
|
0110d2f9f8 | ||
|
|
baa0f60dc8 | ||
|
|
69aa70086a | ||
|
|
13d3f785bd | ||
|
|
39c068974d | ||
|
|
0d4d1a63d4 | ||
|
|
833cd962a1 | ||
|
|
8103f43b65 | ||
|
|
1c8a672a8d | ||
|
|
4749e66c67 | ||
|
|
25ea41972a | ||
|
|
7d66188910 | ||
|
|
979c99eaea | ||
|
|
cf7f87c2ad | ||
|
|
bd0c1edaa6 | ||
|
|
c7ef021b4b | ||
|
|
00c80a15c0 | ||
|
|
8f47b68a95 | ||
|
|
d9139fc286 | ||
|
|
e693f75670 | ||
|
|
759f6c0b39 | ||
|
|
3e0d73c01d | ||
|
|
5cf21ec187 | ||
|
|
62e1d1c952 | ||
|
|
6ae58cc22e | ||
|
|
874ef1ac54 | ||
|
|
5f65460944 | ||
|
|
41b2745dad | ||
|
|
30f9f9ef87 | ||
|
|
4807e71b7d | ||
|
|
09c647fd1b | ||
|
|
d0fea96e69 | ||
|
|
b8883101d3 | ||
|
|
508c88f659 | ||
|
|
40d217beb1 | ||
|
|
e36caef006 | ||
|
|
9b864380a5 | ||
|
|
0e1d0400d8 | ||
|
|
afdd51ff15 | ||
|
|
488c3588d9 | ||
|
|
4f02b191d1 | ||
|
|
8acef2711b | ||
|
|
c6111b3792 | ||
|
|
c4d36aeff7 | ||
|
|
f50596e355 | ||
|
|
abf81b5bb7 | ||
|
|
8579b8a968 | ||
|
|
8df2c357d9 | ||
|
|
4c381611a1 | ||
|
|
7dfd6ab1ad | ||
|
|
0c7d48dede | ||
|
|
4639a66e53 | ||
|
|
65cc2f0515 | ||
|
|
4eb7f98449 | ||
|
|
2d8059a9a5 | ||
|
|
a3d22b6db9 | ||
|
|
3f31424ee2 | ||
|
|
e0119452a3 | ||
|
|
60cae325bc | ||
|
|
16c46114dc | ||
|
|
862175b21c | ||
|
|
e7e3d77c53 | ||
|
|
af9aeee752 | ||
|
|
ad3d43b8be | ||
|
|
210a5c4f01 | ||
|
|
d8822f2a8e | ||
|
|
b7a72b1e5a | ||
|
|
2f106dc96b | ||
|
|
f619286ca3 | ||
|
|
271f7fbbb6 | ||
|
|
318235db33 | ||
|
|
8ab079ccc2 | ||
|
|
a4d2104c3c | ||
|
|
44672e437a | ||
|
|
fb3d6f68a8 | ||
|
|
d7c9015d8b | ||
|
|
54f640f3e1 | ||
|
|
e2906025c8 | ||
|
|
9a8e9815c9 | ||
|
|
8c3e864989 | ||
|
|
22570b7260 | ||
|
|
fb49182c29 | ||
|
|
b9b648e0ed | ||
|
|
494775a25d | ||
|
|
1214f9e23b | ||
|
|
a54cda22ab | ||
|
|
f4a4abd180 | ||
|
|
c9559b5c0d | ||
|
|
af5b354685 | ||
|
|
3c1c2c4aad | ||
|
|
767ed255ca | ||
|
|
aa0023b3c1 | ||
|
|
3bdc143474 | ||
|
|
8b50cc0ece | ||
|
|
a24c94e92a | ||
|
|
a00442bee6 | ||
|
|
f857b63986 | ||
|
|
cbd72da9a1 | ||
|
|
7506a93179 | ||
|
|
53e1623ab3 | ||
|
|
0cb0bdabec | ||
|
|
ed8d5f04bb | ||
|
|
33153010c5 | ||
|
|
2c500b62fd | ||
|
|
30f26a2b9d | ||
|
|
ca39c71ac3 | ||
|
|
2bbe4422d2 | ||
|
|
5d3535126e | ||
|
|
d2addbc1ed | ||
|
|
110ca3131a | ||
|
|
fd7d3c57d7 | ||
|
|
179561e4be | ||
|
|
903e0077aa | ||
|
|
3fadad1bf3 | ||
|
|
acb5d45a88 | ||
|
|
6fd4dd99da | ||
|
|
1bcf13b28b | ||
|
|
c7210908df | ||
|
|
ad7cded2f4 | ||
|
|
7d847d8796 | ||
|
|
ab9cc37ca0 | ||
|
|
65095c448d | ||
|
|
76e188e368 | ||
|
|
0613a16c11 | ||
|
|
aced5b3b6c | ||
|
|
97d8bb16e6 | ||
|
|
3e14f0d8a5 | ||
|
|
f7c0d48152 | ||
|
|
2a4733857f | ||
|
|
3c1efeff55 | ||
|
|
532f801fbd | ||
|
|
cbced219ec | ||
|
|
66ca8272ca | ||
|
|
f945653ba9 | ||
|
|
fdc27c9f0e | ||
|
|
3aa0ebbbd6 | ||
|
|
aa16412850 | ||
|
|
e2bdf1d734 | ||
|
|
4aa79763be | ||
|
|
057db65657 | ||
|
|
c42296acf1 | ||
|
|
d6def22ad5 | ||
|
|
cdd72bad77 | ||
|
|
123752a032 | ||
|
|
ec5e438a7c | ||
|
|
c0b6b9a282 | ||
|
|
1fb3d71f77 | ||
|
|
43d595b7f3 | ||
|
|
fa8bccbae2 | ||
|
|
56e7cd4be2 | ||
|
|
af9662f971 | ||
|
|
af4e262d47 | ||
|
|
96218a1078 | ||
|
|
50c9c3358a | ||
|
|
6f025619de | ||
|
|
7e31340045 | ||
|
|
cddb411495 | ||
|
|
92572203e7 | ||
|
|
57259481c8 | ||
|
|
c7b0e04498 | ||
|
|
47fa56fd0a | ||
|
|
fd09d8b861 | ||
|
|
d48d399fb3 | ||
|
|
34468eccc4 | ||
|
|
81bfb84b32 | ||
|
|
11bca9a98a | ||
|
|
2868370f9e | ||
|
|
9f6c947a87 | ||
|
|
1a2dc1e822 | ||
|
|
9bdf214f48 | ||
|
|
7469139dda | ||
|
|
51c7a13cee | ||
|
|
c06e8c89ff | ||
|
|
a809da68a3 | ||
|
|
084206bace | ||
|
|
288449b9bc | ||
|
|
11e66510e4 | ||
|
|
38f4f50e93 | ||
|
|
d36afb7cdb | ||
|
|
f9897f8ccd | ||
|
|
143d0b69b7 | ||
|
|
ac97c122d4 | ||
|
|
7751f4fb3b | ||
|
|
3cd0b87685 | ||
|
|
2867f03861 | ||
|
|
8248598601 | ||
|
|
4ef3f9d11c | ||
|
|
c3817913ee | ||
|
|
6214c1b4b6 | ||
|
|
2499b36801 | ||
|
|
d196639aed | ||
|
|
2c33da36cc | ||
|
|
708c99c052 | ||
|
|
fbdfecc143 | ||
|
|
d3495405d9 | ||
|
|
aad2a24a22 | ||
|
|
27fa9c3c12 | ||
|
|
92db6820d8 | ||
|
|
851cbd49f4 | ||
|
|
8288f5713b | ||
|
|
951ef0c6d5 | ||
|
|
9653ae98a6 | ||
|
|
d837887af6 | ||
|
|
2a504224de | ||
|
|
d0bf247419 | ||
|
|
9237d30e34 | ||
|
|
ef3fa23b2e | ||
|
|
cb7269f334 | ||
|
|
0ca7c4cb38 | ||
|
|
43913838b4 | ||
|
|
845aa7a710 | ||
|
|
fe58614b23 | ||
|
|
2fd095d036 | ||
|
|
09150a7927 | ||
|
|
667c8b0e27 | ||
|
|
2a0d0e798b | ||
|
|
8b6947eda5 | ||
|
|
88e635e0b9 | ||
|
|
3753b47475 | ||
|
|
be06f1d428 | ||
|
|
e4dc6cf432 | ||
|
|
204f9a3ec7 | ||
|
|
f68dc02d6b | ||
|
|
2ca3bf7a7e | ||
|
|
43b045e84c | ||
|
|
852a320586 | ||
|
|
631f977236 | ||
|
|
046ec307c3 | ||
|
|
50083f0d22 | ||
|
|
c4fba5139c | ||
|
|
81b3e3811b | ||
|
|
26eb983cf0 | ||
|
|
e0491c2ee8 | ||
|
|
fce7908fe6 | ||
|
|
2a4bf9f615 | ||
|
|
45f7c17932 | ||
|
|
f2a1fadda9 | ||
|
|
98396f00ff | ||
|
|
e7d5cfff30 | ||
|
|
c308be39de | ||
|
|
65135bc319 | ||
|
|
944297df28 | ||
|
|
f725e419e8 | ||
|
|
0fca352114 | ||
|
|
9a3461e2b6 | ||
|
|
0b9ee38db6 | ||
|
|
a224aba577 | ||
|
|
9f770fec36 | ||
|
|
c39a669671 | ||
|
|
e6dfd4ff27 | ||
|
|
e99f3c58f7 | ||
|
|
2a3b6c11eb | ||
|
|
e26d6a2b27 | ||
|
|
dce7288658 | ||
|
|
d1968c4465 | ||
|
|
863fbffda4 | ||
|
|
629f1e6f0f | ||
|
|
7a3c656adf | ||
|
|
2a96d433ec | ||
|
|
796160cb77 | ||
|
|
5c82a36072 | ||
|
|
b011012d8f | ||
|
|
8026bdd45a | ||
|
|
5ff6da11b1 | ||
|
|
de3f2951b3 | ||
|
|
d00788ceeb | ||
|
|
e0df95a1d8 | ||
|
|
6d22898936 | ||
|
|
15a9dfbaea | ||
|
|
c6facaf662 | ||
|
|
60e443b90b | ||
|
|
d39335829d | ||
|
|
5d4f3f36e3 | ||
|
|
752b5b3d44 | ||
|
|
70e8dc3761 | ||
|
|
0ee80be995 | ||
|
|
3712c89a66 | ||
|
|
8e33f0a535 | ||
|
|
fd801864e3 | ||
|
|
99f7e7e2a5 | ||
|
|
6c999e6fb5 | ||
|
|
4aa4fe56e1 | ||
|
|
09b97a3313 | ||
|
|
d2f4e4e325 | ||
|
|
dba0f35ee1 | ||
|
|
2d2b72d4eb | ||
|
|
b39ad3135d | ||
|
|
13f97ccf45 | ||
|
|
43bbcd35aa | ||
|
|
220f49b157 | ||
|
|
918ca4ca7c | ||
|
|
7d7dc830ef | ||
|
|
f939000ad9 | ||
|
|
4b34bc583d | ||
|
|
91fce2f0e6 | ||
|
|
5487b64fa6 | ||
|
|
b27107385e | ||
|
|
3d00dd6537 | ||
|
|
e85bc70bef | ||
|
|
b0e98718f5 | ||
|
|
3d4a4cb617 | ||
|
|
86777defa8 | ||
|
|
52b455cfeb | ||
|
|
add182b495 | ||
|
|
3d948fd3d7 | ||
|
|
e04e24c1c2 | ||
|
|
68059ccda9 | ||
|
|
bc2b941866 | ||
|
|
9b81eec944 | ||
|
|
00bf701600 | ||
|
|
5339c1774c | ||
|
|
e41d8c2f62 | ||
|
|
73740477fb | ||
|
|
f86a9d654d | ||
|
|
6f52da834b | ||
|
|
4041d1eb26 | ||
|
|
81f81e6b70 | ||
|
|
a16daf109b | ||
|
|
b6708a4b87 | ||
|
|
bda352bf73 | ||
|
|
ca261a7971 | ||
|
|
0819716332 | ||
|
|
a14cea6363 | ||
|
|
2cac7bb838 | ||
|
|
65378f80ea | ||
|
|
40f3779eb1 | ||
|
|
d88f962565 | ||
|
|
9c0bd8c60a | ||
|
|
9e64d10223 | ||
|
|
94c8a8fbde | ||
|
|
16647622f5 | ||
|
|
9028512a5f | ||
|
|
3086d65657 | ||
|
|
d4144a7475 | ||
|
|
6638ca9333 | ||
|
|
b924ef5fff | ||
|
|
df56f55f84 | ||
|
|
31595c2416 | ||
|
|
795ee8c20f | ||
|
|
efbd48b122 | ||
|
|
9b4089c244 | ||
|
|
8b5a85ae1d | ||
|
|
ecabef2dc7 | ||
|
|
4a6fc6cede | ||
|
|
287d4e35f3 | ||
|
|
a803be9171 | ||
|
|
ece3654139 | ||
|
|
bf5392dafe | ||
|
|
7bc35044c7 | ||
|
|
f9b872ab78 | ||
|
|
ffddefc177 | ||
|
|
2a59c832c1 | ||
|
|
ea5f424dec | ||
|
|
46514074a4 | ||
|
|
1816af4fb2 | ||
|
|
b1662a31f4 | ||
|
|
5974abad75 | ||
|
|
344541dd89 | ||
|
|
c17b3b8517 | ||
|
|
b26503f51c | ||
|
|
2b22ec42c7 | ||
|
|
dfdeeb3815 | ||
|
|
4bed7854b5 | ||
|
|
aa64e7ad3c | ||
|
|
8667bbb823 | ||
|
|
1fef49aaa4 | ||
|
|
e30edb096a | ||
|
|
cdb466956d | ||
|
|
199600af73 | ||
|
|
edb874e659 | ||
|
|
fe0843be88 | ||
|
|
ff07018720 | ||
|
|
402eccf06d | ||
|
|
0641d314a6 | ||
|
|
2928afa51f | ||
|
|
757bcf1310 | ||
|
|
c9aba4ea0c | ||
|
|
2cee80acf0 | ||
|
|
d9a2ff278c | ||
|
|
8a539420c2 | ||
|
|
371497968b | ||
|
|
388d7a944a | ||
|
|
afe724ecda | ||
|
|
0d636893f1 | ||
|
|
4ac9417d8d | ||
|
|
75110320ab | ||
|
|
8691ec4899 | ||
|
|
b6e2214903 | ||
|
|
7ec50e55c9 | ||
|
|
ad8be7d474 | ||
|
|
07926cffca | ||
|
|
00b2d7d513 | ||
|
|
f74d7ea119 | ||
|
|
2bca6360b6 | ||
|
|
841b3c87db | ||
|
|
2ab79f4938 | ||
|
|
2182a85875 | ||
|
|
72d8d78d36 | ||
|
|
dad61d032e | ||
|
|
1bbb241baa | ||
|
|
3e6c38e3be | ||
|
|
9272e80fa6 | ||
|
|
333dd73a18 | ||
|
|
8e84bbd781 | ||
|
|
44af3dab50 | ||
|
|
22128767e6 | ||
|
|
f6b78a027c | ||
|
|
a46c815e4e | ||
|
|
186d440168 | ||
|
|
a9e365ad7d | ||
|
|
a104d8a80b | ||
|
|
a5029d1eed | ||
|
|
848e45e333 | ||
|
|
7972593586 | ||
|
|
79968c6374 | ||
|
|
1699aef609 | ||
|
|
2d2d6c3cc0 | ||
|
|
bfccab9b9f | ||
|
|
17ccbae084 | ||
|
|
0875e66aab | ||
|
|
4dfae3484f | ||
|
|
372123c178 | ||
|
|
13596bde90 | ||
|
|
3b7b6a660e | ||
|
|
daa1ae3a45 | ||
|
|
44ee67ff71 | ||
|
|
144ae3af9d | ||
|
|
eec0b04a33 | ||
|
|
58b06f32a2 | ||
|
|
5b58db39ff | ||
|
|
1bc5cf5ee4 | ||
|
|
f4c7ebcbca | ||
|
|
feb3d1b478 | ||
|
|
7c954c1ea7 | ||
|
|
e9f4d0eec2 | ||
|
|
4f9c78799c | ||
|
|
0f9ed40bd9 | ||
|
|
4bb88b35ec | ||
|
|
04145e22a2 | ||
|
|
cca7e398fd | ||
|
|
3d04fe2a87 | ||
|
|
c459034ae9 | ||
|
|
442bd47535 | ||
|
|
5cea3e227c | ||
|
|
db0a22e991 | ||
|
|
dc3119303a | ||
|
|
d2b55ad1a2 | ||
|
|
d7051f5207 | ||
|
|
db1ee3aa88 | ||
|
|
a1e0bd134e | ||
|
|
7a1e0eb618 | ||
|
|
65b59bd78a | ||
|
|
dcae6efaa2 | ||
|
|
71cc7a96c2 | ||
|
|
8da0d649e4 | ||
|
|
08c7656e47 | ||
|
|
bd253e1bdd | ||
|
|
d10f149161 | ||
|
|
3a2a943fe9 | ||
|
|
f34971774b | ||
|
|
f8a9a21428 | ||
|
|
0c49e5d56e | ||
|
|
e84755eb35 | ||
|
|
b348a02b85 | ||
|
|
439636c579 | ||
|
|
162b1c5e03 | ||
|
|
dc56b951df | ||
|
|
4d801cd696 | ||
|
|
7c55c335cc | ||
|
|
2ddb83206b | ||
|
|
ab734f09b6 | ||
|
|
dd2bdf3e31 | ||
|
|
a909bb3eca | ||
|
|
aaebeceded | ||
|
|
3de435d7b8 | ||
|
|
01408209d8 | ||
|
|
e8b62c620d | ||
|
|
2eb7137e04 | ||
|
|
caa12ec587 | ||
|
|
0f71fbce8d | ||
|
|
4e2972a5dc | ||
|
|
78e5417ff2 | ||
|
|
77852cf572 | ||
|
|
fa36537f82 | ||
|
|
4cde76c9c3 | ||
|
|
e02512032b | ||
|
|
b092166bc6 | ||
|
|
e58db4f8b0 | ||
|
|
dad222b8f4 | ||
|
|
e80977c812 | ||
|
|
2b3bc710fc | ||
|
|
a45540fd79 | ||
|
|
7f8110601e | ||
|
|
37b09f6785 | ||
|
|
2a606bae4c | ||
|
|
3b2811bfc4 | ||
|
|
27275a02ac | ||
|
|
34d209b30b | ||
|
|
94f52d49dc | ||
|
|
0720671e0a | ||
|
|
0ee09320e0 | ||
|
|
78fcb2143f | ||
|
|
755b14de5d | ||
|
|
3455cb35e4 | ||
|
|
c1571a3209 | ||
|
|
67569486d1 | ||
|
|
d64051fedc | ||
|
|
c897d5b294 | ||
|
|
863a944179 | ||
|
|
3db9c2c796 | ||
|
|
12dad32890 | ||
|
|
689d2a1afb | ||
|
|
ff0d137fb3 | ||
|
|
8da20975f9 | ||
|
|
eb393985b7 | ||
|
|
7a412df9a5 | ||
|
|
b1b57cc740 | ||
|
|
bdb6581990 | ||
|
|
618073e2b4 | ||
|
|
fa601e5ba3 | ||
|
|
bae37e3e4a | ||
|
|
907eeeda8a | ||
|
|
fe6ccd16da | ||
|
|
10ec00126c | ||
|
|
2d6211c455 | ||
|
|
e302cc9c16 | ||
|
|
3f2b54cfc4 | ||
|
|
acbf38fd3c | ||
|
|
1e8bea15e5 | ||
|
|
aaf0177318 | ||
|
|
9afc017532 | ||
|
|
5da38b22c0 | ||
|
|
ce61f62644 | ||
|
|
2c525f2471 | ||
|
|
5bbcb7148c | ||
|
|
8bca2d1048 | ||
|
|
d6c3b6e84c | ||
|
|
e453759637 | ||
|
|
a21c87d11c | ||
|
|
478fde5fef | ||
|
|
bffc0ec87a | ||
|
|
1b9b03b68f | ||
|
|
a59445ccff | ||
|
|
c2ec73302d | ||
|
|
284691253f | ||
|
|
124d4c9fad | ||
|
|
5fbe4cc225 | ||
|
|
df6466cfbd | ||
|
|
2326337d32 | ||
|
|
06921f35f3 | ||
|
|
44d3801760 | ||
|
|
1832f78684 | ||
|
|
e7601cde8a | ||
|
|
36f6a009b8 | ||
|
|
1e1752266f | ||
|
|
aafcc55006 | ||
|
|
c731d1fea5 | ||
|
|
aa892e4d37 | ||
|
|
8ca3e5f6ba | ||
|
|
21007da392 | ||
|
|
9eeac27966 | ||
|
|
e6ff7e1e4a | ||
|
|
d1f9f9a3aa | ||
|
|
2415a22757 | ||
|
|
887d4d2a41 | ||
|
|
1c8e625045 | ||
|
|
36e931e0d7 | ||
|
|
31d4077638 | ||
|
|
c098b4ac70 | ||
|
|
32446a5197 | ||
|
|
40c1b29f36 | ||
|
|
bc933e9981 | ||
|
|
ba34e911e1 | ||
|
|
8aac5d6af2 | ||
|
|
56bdfd1df2 | ||
|
|
dbffb8995b | ||
|
|
ebfae904ab | ||
|
|
827abb57e9 | ||
|
|
9aee43f7d8 | ||
|
|
34bf153653 | ||
|
|
2782ef67de | ||
|
|
9d15f9b00d | ||
|
|
3e72711e23 | ||
|
|
f4bb8776d0 | ||
|
|
95ffb4565f | ||
|
|
f3a415f623 | ||
|
|
936d4aca1a | ||
|
|
216ae0a328 | ||
|
|
9672bc322f | ||
|
|
b68be1e1fb | ||
|
|
f2a7275700 | ||
|
|
177d0a513f | ||
|
|
dfc02843b6 | ||
|
|
11c8803b92 | ||
|
|
c9a4f293a1 | ||
|
|
61579ad20f | ||
|
|
9678daa46a | ||
|
|
23ecfd412d | ||
|
|
3ff148811b | ||
|
|
6f1347fc8b | ||
|
|
1703201084 | ||
|
|
7921029e33 | ||
|
|
b7159f80b2 | ||
|
|
9c874bf9b5 | ||
|
|
9ab5ef3b5b | ||
|
|
f0b5a8db8c | ||
|
|
4814d14db5 | ||
|
|
77e8190b6c | ||
|
|
f4b2a4ab00 | ||
|
|
a909eb6b23 | ||
|
|
3dd57e1f59 | ||
|
|
1b67b2d33e | ||
|
|
9bc6dc7113 | ||
|
|
f407f7f406 | ||
|
|
094168a58f | ||
|
|
474ecc4b47 | ||
|
|
0afc21c9d8 | ||
|
|
63e43bff99 | ||
|
|
8c46d9181f | ||
|
|
cc92ebf471 | ||
|
|
02b7116d42 | ||
|
|
aa3373a107 | ||
|
|
7aabc6b125 | ||
|
|
466e4b7a1e | ||
|
|
76a425226f | ||
|
|
2b707bff27 | ||
|
|
9055323b67 | ||
|
|
67804cfc8c | ||
|
|
2344932b45 | ||
|
|
35ebdd35bc | ||
|
|
ac81003669 | ||
|
|
c999987baf | ||
|
|
529a59d309 | ||
|
|
52f6417813 | ||
|
|
c96cf1b303 | ||
|
|
660bc389e6 | ||
|
|
bfc26e8299 | ||
|
|
47106c0756 | ||
|
|
49fa914db5 | ||
|
|
93eabc642b | ||
|
|
2d273f8237 | ||
|
|
a53f0f0a17 | ||
|
|
1bd98dcf4f | ||
|
|
eebed206c9 | ||
|
|
fe74600a5f | ||
|
|
08e2d7cdb3 | ||
|
|
503f0a29a7 | ||
|
|
ee285fa5da | ||
|
|
8c562bd38d | ||
|
|
15adc23277 | ||
|
|
a2ec695ec9 | ||
|
|
55b270587b | ||
|
|
5297136bc0 | ||
|
|
61bb6428fd | ||
|
|
ccd2d34160 | ||
|
|
ea6eed10c7 | ||
|
|
7a86758edb | ||
|
|
90d66ea4a9 | ||
|
|
5b21c39bb2 | ||
|
|
744e80d579 | ||
|
|
3842fe175c | ||
|
|
900667a998 | ||
|
|
147e098827 | ||
|
|
5819d03c68 | ||
|
|
90f5bf796d | ||
|
|
2b63980758 | ||
|
|
65d33c553c | ||
|
|
2593036053 | ||
|
|
a6effb4d23 | ||
|
|
17215002a1 | ||
|
|
0e469ed221 | ||
|
|
093eb51f8c | ||
|
|
5f1866fd6b | ||
|
|
d8c8a4631d | ||
|
|
6b12f17f44 | ||
|
|
eb0c82d91f | ||
|
|
7adfa5dea7 | ||
|
|
17758126fa | ||
|
|
b440f585bc | ||
|
|
63a13ccb18 | ||
|
|
72877379ec | ||
|
|
8449958425 | ||
|
|
9037641592 | ||
|
|
c0078ab45a | ||
|
|
3a41e4dd1a | ||
|
|
3297a303bf | ||
|
|
f1580f95d4 | ||
|
|
1e150bcf61 | ||
|
|
ca371e3ba9 | ||
|
|
61dda40b44 | ||
|
|
5ad753b90c | ||
|
|
0a1beea13a | ||
|
|
00e722f02c | ||
|
|
ff22862b9d | ||
|
|
b2264ad57e | ||
|
|
b0227d4051 | ||
|
|
28b643e531 | ||
|
|
82f942c3a3 | ||
|
|
e4a727f86c | ||
|
|
b624ca6dcd | ||
|
|
ba4c268172 | ||
|
|
00175eac33 | ||
|
|
396dde1347 | ||
|
|
042a59117d | ||
|
|
b8717208c7 | ||
|
|
c3a5fe7185 | ||
|
|
c8b6a79225 | ||
|
|
92e66fc167 | ||
|
|
64ffc1fc73 | ||
|
|
304ff6a6f9 | ||
|
|
fc39f2d9d2 | ||
|
|
0d806978e6 | ||
|
|
62c43ce2be | ||
|
|
88eaeb5d1c | ||
|
|
60c0c2dd56 | ||
|
|
6c147aa1c5 | ||
|
|
2a9b23bfab | ||
|
|
4fb4617d20 | ||
|
|
ede0f6aa32 | ||
|
|
4e7271a88f | ||
|
|
6d49110a33 | ||
|
|
b540aa34d0 | ||
|
|
15fa38c72f | ||
|
|
e7de5e9f6c | ||
|
|
5c10534b88 | ||
|
|
b3e5d49a3e | ||
|
|
6806196404 | ||
|
|
2e38208d74 | ||
|
|
cde79052dd | ||
|
|
e763770f3e | ||
|
|
26d49c1dc3 | ||
|
|
bb4e2f6a24 | ||
|
|
344cc1b5c3 | ||
|
|
21f9b6d8bb | ||
|
|
024d0d09ee | ||
|
|
e4b2847d31 | ||
|
|
ee07694783 | ||
|
|
8741503db1 | ||
|
|
eec409dba7 | ||
|
|
95ca4f55d5 | ||
|
|
231665d67b | ||
|
|
4c05558273 | ||
|
|
35c3b36549 | ||
|
|
03872bfacd | ||
|
|
5e9bcbec9a | ||
|
|
aa07fe7fa6 | ||
|
|
1d99b425ca | ||
|
|
7a6a59178a | ||
|
|
4e44fccdcf | ||
|
|
703c77ec89 | ||
|
|
a06af3fa85 | ||
|
|
686a303cb5 | ||
|
|
b95df43384 | ||
|
|
5659e295b3 | ||
|
|
5b195092e1 | ||
|
|
85bb37ab7c | ||
|
|
c5f3eee3be | ||
|
|
1cfdf386ff | ||
|
|
6d8fe72174 | ||
|
|
98253b1d0d | ||
|
|
ad93cea544 | ||
|
|
1739b5a0e6 | ||
|
|
9ef8e24049 | ||
|
|
7fbbaf01a9 | ||
|
|
5a6f312182 | ||
|
|
2b441ef9af | ||
|
|
7ba18df6cf | ||
|
|
196de5db89 | ||
|
|
25a3510501 | ||
|
|
4a78f59e7b | ||
|
|
1f7032088d | ||
|
|
4ceb9fd767 | ||
|
|
a964426fbc | ||
|
|
2f80c453bb | ||
|
|
cf06c3fbc5 | ||
|
|
efc3206ae0 | ||
|
|
497ffc6387 | ||
|
|
5a3ca7e700 | ||
|
|
9ac3e643d8 | ||
|
|
7ca2660a29 | ||
|
|
e278893b64 | ||
|
|
6b8b426342 | ||
|
|
03f7f8cb9c | ||
|
|
2faf9623ce | ||
|
|
eb8649bf9b | ||
|
|
6377c51f9c | ||
|
|
db8de490a0 | ||
|
|
acb38b726f | ||
|
|
f44128774c | ||
|
|
e428bff961 | ||
|
|
d162f7c137 | ||
|
|
933e0f40bb | ||
|
|
3ad9f9e730 | ||
|
|
a390bd4ce0 | ||
|
|
dc0f0123e9 | ||
|
|
f3946ae314 | ||
|
|
2f9946327a | ||
|
|
0402481be4 | ||
|
|
35feae3b0c | ||
|
|
a053d10839 | ||
|
|
16549bb276 | ||
|
|
f3e1dc7a4f | ||
|
|
b12af8c410 | ||
|
|
f5b4fd23da | ||
|
|
ee43250015 | ||
|
|
9f0f5c60ad | ||
|
|
09de332028 | ||
|
|
3d5f5b6a28 | ||
|
|
eb7b3295d1 | ||
|
|
5131b95c2f | ||
|
|
ba543e3895 | ||
|
|
ef5d981ab1 | ||
|
|
d5efab4993 | ||
|
|
919e9eee63 | ||
|
|
e255468bdf | ||
|
|
39c0a71065 | ||
|
|
7b2d4b6ae6 | ||
|
|
4f07db8bcb | ||
|
|
959d378f2a | ||
|
|
506de55475 | ||
|
|
045578989c | ||
|
|
d16ff1f519 | ||
|
|
2c7ed01f0c | ||
|
|
34d5382d66 | ||
|
|
dbbf3a4a10 | ||
|
|
f25fd09bbb | ||
|
|
7be0217bc0 | ||
|
|
e4816c5ba9 | ||
|
|
584567cacc | ||
|
|
b202e066fd | ||
|
|
c7de58d865 | ||
|
|
74c77926a8 | ||
|
|
198e253e9d | ||
|
|
f26e213dcd | ||
|
|
9f318d1249 | ||
|
|
deacc202ff | ||
|
|
25570367b3 | ||
|
|
4c884da222 | ||
|
|
f72e496f96 | ||
|
|
41047aece0 | ||
|
|
54f5ea9d6e | ||
|
|
d678c07ddf | ||
|
|
5c3f74b424 | ||
|
|
1550d709e0 | ||
|
|
a23c9244d4 | ||
|
|
3c7038dfe1 | ||
|
|
f8472f4709 | ||
|
|
698f00596d | ||
|
|
5a8cf94361 | ||
|
|
3218c160be | ||
|
|
fa31d0940c | ||
|
|
e7e52b11ce | ||
|
|
bdef0e0b1a | ||
|
|
543f2d58fc | ||
|
|
0a76b45eca | ||
|
|
6d6a00f1f5 | ||
|
|
3b8889a2a1 | ||
|
|
a7fd37ffdf | ||
|
|
919f08eb38 | ||
|
|
6cc5d71ffe | ||
|
|
6fddefe252 | ||
|
|
15ea11d5db | ||
|
|
fe8005327a | ||
|
|
0697de4691 | ||
|
|
afc6f556d1 | ||
|
|
6566ea7d6b | ||
|
|
e14da859b6 | ||
|
|
863addcd5a | ||
|
|
bb6f842b37 | ||
|
|
8f225ae88d | ||
|
|
9cea986819 | ||
|
|
0248d979fe | ||
|
|
0caefe20ef | ||
|
|
a7ec90506f | ||
|
|
c58a621fc7 | ||
|
|
b64fc3ac49 | ||
|
|
027256d0b1 | ||
|
|
425c794f89 | ||
|
|
acac5ec6ea | ||
|
|
13bd566eb7 | ||
|
|
a52920cec0 | ||
|
|
9cbb8174bb | ||
|
|
23ac0429be | ||
|
|
7ed26afe75 | ||
|
|
60bbb5cae0 | ||
|
|
da85910028 | ||
|
|
f3a37b2ef1 | ||
|
|
2f50bc1b3c | ||
|
|
848f8fbe54 | ||
|
|
4f06ccd17d | ||
|
|
3a9cb85d7a | ||
|
|
8716dd05d4 | ||
|
|
dd4d549dc1 | ||
|
|
486dba8d8a | ||
|
|
e677e37876 | ||
|
|
5ec6066fdd | ||
|
|
894c1bd02e | ||
|
|
8919c8c139 | ||
|
|
685f1772fc | ||
|
|
fe8998ab5c | ||
|
|
4988cd26b5 | ||
|
|
1b15bb7a56 | ||
|
|
8122bc5aef | ||
|
|
bd9a19e23b | ||
|
|
92a56d034f | ||
|
|
5de2c7a8c1 | ||
|
|
7c5ef0613d | ||
|
|
1ee1122d40 | ||
|
|
09bd9c94a3 | ||
|
|
ca4a40b8e0 | ||
|
|
cb73ba948d | ||
|
|
e957147249 | ||
|
|
010726a875 | ||
|
|
6c1a76af6e | ||
|
|
19146211d7 | ||
|
|
9f0083309e | ||
|
|
dd93b29397 | ||
|
|
c5ea2b4ab5 | ||
|
|
e71948d611 | ||
|
|
5a2d75551d | ||
|
|
9f2d064d7c | ||
|
|
2d2188e77b | ||
|
|
feae76fbc0 | ||
|
|
80f7abb565 | ||
|
|
9f8fc7b2bb | ||
|
|
9cfda0c070 | ||
|
|
a30dad4f5e | ||
|
|
15d9f222ed | ||
|
|
ef7d6e8a0c | ||
|
|
71012fe83a | ||
|
|
228d92244a | ||
|
|
248a64f0b2 | ||
|
|
68c5deea5a | ||
|
|
ab93db2259 | ||
|
|
f14ac74316 | ||
|
|
0c70ff5658 | ||
|
|
ba671a8473 | ||
|
|
66bbb5c76f | ||
|
|
a4392d4a7f | ||
|
|
86505b1c54 | ||
|
|
924fef1f32 | ||
|
|
7cc2d22ab5 | ||
|
|
abcdbf0039 | ||
|
|
4bcc14fc67 | ||
|
|
72f815d535 | ||
|
|
9c84f60ba0 | ||
|
|
7ca9ead36b | ||
|
|
e67987404b | ||
|
|
90b5a5856b | ||
|
|
a151a44caf | ||
|
|
478a423bcf | ||
|
|
93d8636fb0 | ||
|
|
2288ee8060 | ||
|
|
6beaf4d9f3 | ||
|
|
d1d1c83e56 | ||
|
|
cbad05e0de | ||
|
|
e01d213636 | ||
|
|
e1e7840b2c | ||
|
|
2754d9e2bb | ||
|
|
12b2e0a2b3 | ||
|
|
aacac613af | ||
|
|
ba9e912cf6 | ||
|
|
d867fe64e3 | ||
|
|
de247f7d33 | ||
|
|
1ba28bef1f | ||
|
|
c0858d8c1a | ||
|
|
863493766d | ||
|
|
a70445e122 | ||
|
|
f23e34fa3c | ||
|
|
3d1d54e2ce | ||
|
|
c87a062dba | ||
|
|
0d52097213 | ||
|
|
6444f0c5cd | ||
|
|
1e74ee2d54 | ||
|
|
ba9e96b829 | ||
|
|
bd041bcbb0 | ||
|
|
8e06e37375 | ||
|
|
faad041868 | ||
|
|
3048bb9d90 | ||
|
|
9088e4a16a | ||
|
|
b08d5b1975 | ||
|
|
b53b1381b7 | ||
|
|
c44ee44cc3 | ||
|
|
8f970dec0e | ||
|
|
2fee05242e | ||
|
|
f0443d3398 | ||
|
|
5744acc2ca | ||
|
|
84e23bff10 | ||
|
|
d62bc26b62 | ||
|
|
718f7a5f7e | ||
|
|
e95ad297ed | ||
|
|
dff2a19950 | ||
|
|
aa317c89ea | ||
|
|
72f2c4b272 | ||
|
|
c7304317d4 | ||
|
|
3673b1303a | ||
|
|
b27b002a3f | ||
|
|
8481bc6e93 | ||
|
|
63a50b1ccf | ||
|
|
63aa3466e9 | ||
|
|
d7b0768ab8 | ||
|
|
4db3828fa6 | ||
|
|
3bbb05f59b | ||
|
|
ab1e8305a1 | ||
|
|
8b4f6f1778 | ||
|
|
8c94341c18 | ||
|
|
79ee999f1b | ||
|
|
83cc2511e3 | ||
|
|
dcf060198b | ||
|
|
1753bea692 | ||
|
|
b95a3c4b28 | ||
|
|
b918f9650a | ||
|
|
7463493259 | ||
|
|
c3459c9e86 | ||
|
|
eb4e402aae | ||
|
|
fe8720341d | ||
|
|
c6ef1c02b9 | ||
|
|
7c613386db | ||
|
|
a13c5a6bfb | ||
|
|
c711a80411 | ||
|
|
7e8dc73f2f | ||
|
|
dbbed64146 | ||
|
|
a93e0016ff | ||
|
|
9b18e47671 | ||
|
|
aecddc2cda | ||
|
|
b89f1f5869 | ||
|
|
a4012b594b | ||
|
|
ab1f70dcd7 | ||
|
|
eaefce3792 | ||
|
|
558934cee5 | ||
|
|
269a100081 | ||
|
|
af4c3cb2cf | ||
|
|
6958d0b55d | ||
|
|
5e7e479c6c | ||
|
|
dfbbb08124 | ||
|
|
7755c2827c | ||
|
|
ac41946533 | ||
|
|
43b230685f | ||
|
|
cb73fa1d3b | ||
|
|
0dc7fee713 | ||
|
|
58d636abdb | ||
|
|
be0d0e2995 | ||
|
|
5d611d2e24 | ||
|
|
6ff9c4d8f9 | ||
|
|
1e7f0d833e | ||
|
|
41002a77d4 | ||
|
|
1c37abc0dd | ||
|
|
ad395f0603 | ||
|
|
e3878b619f | ||
|
|
3641b123f3 | ||
|
|
f29ccc9c20 | ||
|
|
ecb4a208fb | ||
|
|
d9f73c36c3 | ||
|
|
b915c24704 | ||
|
|
559b0cf729 | ||
|
|
76df93fdf4 | ||
|
|
2145ba4ca7 | ||
|
|
1aa8e8cd9f | ||
|
|
b051ddec2a | ||
|
|
55bf22081e | ||
|
|
4825009e42 | ||
|
|
01c4916aa6 | ||
|
|
1a545ed518 | ||
|
|
b4f363ef53 | ||
|
|
ad5c6945cf | ||
|
|
da1eb19a73 | ||
|
|
af3bc53332 | ||
|
|
86911bd67d | ||
|
|
6b0bde6c31 | ||
|
|
9231a4ba57 | ||
|
|
0b2c139eaa | ||
|
|
2b769bc162 | ||
|
|
5d3d377c03 | ||
|
|
8770c82832 | ||
|
|
4960583637 | ||
|
|
4e6eed9189 | ||
|
|
166433f780 | ||
|
|
b832caccd4 | ||
|
|
907798707c | ||
|
|
9c43acfd3a | ||
|
|
d1b8f60776 | ||
|
|
62a8132c02 | ||
|
|
25bf567cd7 | ||
|
|
5bc3dfa1cd | ||
|
|
7eddf1975e | ||
|
|
d3475f5fe2 | ||
|
|
ce74a30990 | ||
|
|
7b35c28c7d | ||
|
|
fad1def7b9 | ||
|
|
dcc9aaaa24 | ||
|
|
20ac0e3e48 | ||
|
|
e3c95265a4 | ||
|
|
46d7c30c17 | ||
|
|
1fdf208a28 | ||
|
|
f0bf2233d2 | ||
|
|
48edbc8687 | ||
|
|
b9a9e3a596 | ||
|
|
ad2c53c6d2 | ||
|
|
eff3dfd50b | ||
|
|
11cb4ea214 | ||
|
|
5594e3df25 | ||
|
|
5d002ff6ca | ||
|
|
4674a9f6fb | ||
|
|
85bc696c38 | ||
|
|
54bf225692 | ||
|
|
bb43b8e4c1 | ||
|
|
605a4e1317 | ||
|
|
751766a46f | ||
|
|
e8c608a4d9 | ||
|
|
837e716306 | ||
|
|
061a557839 | ||
|
|
338b4ba739 | ||
|
|
41710bfc7e | ||
|
|
0e87d464a2 | ||
|
|
2fb8c260b3 | ||
|
|
ed1e84fc0a | ||
|
|
1ca64788eb | ||
|
|
eb3505af02 | ||
|
|
47f1d17ad3 | ||
|
|
d9893d014c | ||
|
|
3785cf07ba | ||
|
|
3f4b6f2b1c | ||
|
|
a0e884836e | ||
|
|
ac317321fc | ||
|
|
ca9e7c2c2d | ||
|
|
0d27a89915 | ||
|
|
4030060db8 | ||
|
|
509c515575 | ||
|
|
8e6b92bdd7 | ||
|
|
2b8b8f1ffd | ||
|
|
f1eb7638d1 | ||
|
|
c71c357fa6 | ||
|
|
10134097c3 | ||
|
|
2f4395da22 | ||
|
|
afa14d36a8 | ||
|
|
758c29d3fa | ||
|
|
349f3e2c7b | ||
|
|
e262c013bd | ||
|
|
ba08948307 | ||
|
|
81addc77b4 | ||
|
|
0155c9115a | ||
|
|
b1de6ca390 | ||
|
|
49573e0aa2 | ||
|
|
e95b39d534 | ||
|
|
ccbaaa1e14 | ||
|
|
9fa5010eac | ||
|
|
777e1ee2c5 | ||
|
|
45d4c9dece | ||
|
|
da89f9c150 | ||
|
|
fe79b6d118 | ||
|
|
a5b0ad04d3 | ||
|
|
19c095a817 | ||
|
|
f7fdb65037 | ||
|
|
cea76226b1 | ||
|
|
2aa8d9642c | ||
|
|
d22ced77c0 | ||
|
|
0cb8c82125 | ||
|
|
f150f9aec4 | ||
|
|
22a89ff7a6 | ||
|
|
f0d2c9f94b | ||
|
|
49ef571ecf | ||
|
|
75ff04f87a | ||
|
|
3fca142e5f | ||
|
|
a28aee058f | ||
|
|
ad5d73738c | ||
|
|
55075516c9 | ||
|
|
ff87bf7584 | ||
|
|
252df2d22c | ||
|
|
4e2ff875dc | ||
|
|
3fafbfe1ed | ||
|
|
ef3e2c7764 | ||
|
|
b5427d9651 | ||
|
|
2d5b42693d | ||
|
|
c2eacc8b10 | ||
|
|
8acf9a2802 | ||
|
|
566b0476d7 | ||
|
|
8dd5f7585e | ||
|
|
45366ae9dc | ||
|
|
044385ab6e | ||
|
|
f337b94537 | ||
|
|
c749ae0cac | ||
|
|
637288359e | ||
|
|
d618cd92cc | ||
|
|
86663ff333 | ||
|
|
93ba75b602 | ||
|
|
1f72648b0e | ||
|
|
1cdd8b1c58 | ||
|
|
d804780c25 | ||
|
|
6200bf3329 | ||
|
|
895da9a7aa | ||
|
|
f9eaaa9da5 | ||
|
|
6680d8b792 | ||
|
|
0b32df94a5 | ||
|
|
913b95336b | ||
|
|
c44587a70c | ||
|
|
938fa9a1e2 | ||
|
|
206eab3b33 | ||
|
|
bb4ab7e333 | ||
|
|
f470d1cc06 | ||
|
|
3d5493c3f1 | ||
|
|
389a96483a | ||
|
|
bff59e09dc | ||
|
|
1e96a2d357 | ||
|
|
4a5d1b6708 | ||
|
|
b7fd0fdd96 | ||
|
|
1d88f02b10 | ||
|
|
a0643b86eb | ||
|
|
53270fac88 | ||
|
|
25db23e3c8 | ||
|
|
a54062bd5e | ||
|
|
c3283e1c6e | ||
|
|
25e2adbfe9 | ||
|
|
fec7ef61d3 | ||
|
|
2269b99b4f | ||
|
|
84f96a2fd5 | ||
|
|
50ec17c4af | ||
|
|
170f2a144a | ||
|
|
28fe3e7e89 | ||
|
|
2be6a94d70 | ||
|
|
e77f9d95d3 | ||
|
|
87a38bdf8d | ||
|
|
03bb58006b | ||
|
|
230b1f927f | ||
|
|
4ac8edfe27 | ||
|
|
ab824d1230 | ||
|
|
e67bb7ca62 | ||
|
|
da9e535c7a | ||
|
|
dbbc7296f5 | ||
|
|
ce1b11e3a0 | ||
|
|
b57b0db5bf | ||
|
|
03b32d92b7 | ||
|
|
604732b650 | ||
|
|
ec47dfb9b8 | ||
|
|
1c2fcc2a55 | ||
|
|
83ff3de9ae | ||
|
|
818c3bcadc | ||
|
|
cd845ae111 | ||
|
|
c6785abd1f | ||
|
|
ee4732a676 | ||
|
|
eacd6eeed2 | ||
|
|
4aaf111c58 | ||
|
|
991352d201 | ||
|
|
d22573086f | ||
|
|
1148584526 | ||
|
|
5005369f71 | ||
|
|
33601f1a51 | ||
|
|
b97c088e87 | ||
|
|
e93a1bdf6d | ||
|
|
7f12f0671c | ||
|
|
39fb5972d4 | ||
|
|
063e1d7606 | ||
|
|
57aee184ca | ||
|
|
4ae2850aa6 | ||
|
|
f586797f7d | ||
|
|
0d8c8ca033 | ||
|
|
5ea90ba6bd | ||
|
|
fd8067be94 | ||
|
|
ad34b45782 | ||
|
|
d0f96da2c0 | ||
|
|
da57989cf6 | ||
|
|
f086b7b67e | ||
|
|
471fd688b9 | ||
|
|
02adaac368 | ||
|
|
1bbef4be74 | ||
|
|
918f8cca36 | ||
|
|
22b39f0337 | ||
|
|
e282462e1f | ||
|
|
e4843201b0 | ||
|
|
753f6d4a3e | ||
|
|
aba2dbddc2 | ||
|
|
510dff4c39 | ||
|
|
e260006182 | ||
|
|
7d481db248 | ||
|
|
4f52f60b3c | ||
|
|
5afc25623e | ||
|
|
3ce1c1d39f | ||
|
|
21a3edfc60 | ||
|
|
026ab797eb | ||
|
|
79945c0c45 | ||
|
|
f8c1da7f3c | ||
|
|
a1bb48770c | ||
|
|
d05b77b36c | ||
|
|
ce53bd239e | ||
|
|
39287314d3 | ||
|
|
231db4a3e6 | ||
|
|
c30d252f94 | ||
|
|
6d46249b7b | ||
|
|
1b63e6d478 | ||
|
|
28defbfb4a | ||
|
|
75b98662be | ||
|
|
1df682140c | ||
|
|
7273c7d688 | ||
|
|
ef1595672c | ||
|
|
98c959291f | ||
|
|
2135c87f94 | ||
|
|
e1106e0f91 | ||
|
|
7b0113ac77 | ||
|
|
6f0c88580f | ||
|
|
18064d1626 | ||
|
|
3029e5c530 | ||
|
|
be77b47ab5 | ||
|
|
77958eab46 | ||
|
|
8f41accf41 | ||
|
|
e19d5efced | ||
|
|
69c3e2114a | ||
|
|
6dcfe1c3f8 | ||
|
|
d076d54f67 | ||
|
|
aba7e9e7f9 | ||
|
|
4ac7152f94 | ||
|
|
d348ea3384 | ||
|
|
b4709b9e8c | ||
|
|
21e1af2ae7 | ||
|
|
226a09b04a | ||
|
|
587f37a597 | ||
|
|
97f488a5c7 | ||
|
|
45e0d42c51 | ||
|
|
bddc4a0a04 | ||
|
|
a9338f1c0e | ||
|
|
4ad00200a2 | ||
|
|
6b38f7e0d2 | ||
|
|
4872c9b4c9 | ||
|
|
d8ca0a8d47 | ||
|
|
2222a898a1 | ||
|
|
9e685a2734 | ||
|
|
c86e839091 | ||
|
|
d722a09581 | ||
|
|
5967667e9e | ||
|
|
d044c58558 | ||
|
|
200217d8ea | ||
|
|
02bb2c3e83 | ||
|
|
64c754e2c5 | ||
|
|
ad65121496 | ||
|
|
3235b88253 | ||
|
|
5e3ab6da5a | ||
|
|
6f9c9f8518 | ||
|
|
65f2b16132 | ||
|
|
05a761b628 | ||
|
|
14f5240d8f | ||
|
|
baadec5ef4 | ||
|
|
d20229d9b9 | ||
|
|
e06af02573 | ||
|
|
5cd34920b7 | ||
|
|
e436caf0bb | ||
|
|
f0d41a5ac2 | ||
|
|
068529586d | ||
|
|
45cdb10c46 | ||
|
|
2170d958d5 | ||
|
|
9d78691936 | ||
|
|
1508c50a45 | ||
|
|
dd0a72579f | ||
|
|
e7bc269e97 | ||
|
|
e2557059e5 | ||
|
|
0c4e26fd24 | ||
|
|
3002674bac | ||
|
|
e1f7643c92 | ||
|
|
d70eb14ce0 | ||
|
|
31c19cbda4 | ||
|
|
6d6ed16ab9 | ||
|
|
5a0f8b1f1f | ||
|
|
666308d8f6 | ||
|
|
789eb8a590 | ||
|
|
4cad48da16 | ||
|
|
e6566a1e3a | ||
|
|
fb4b152a73 | ||
|
|
4f090d90c0 | ||
|
|
891134eba9 | ||
|
|
36d562927f | ||
|
|
928a81885c | ||
|
|
647e30619f | ||
|
|
a4156cded3 | ||
|
|
4a99853021 | ||
|
|
176411aada | ||
|
|
4b4a0f7492 | ||
|
|
fe4efb0a5e | ||
|
|
1006caf8e9 | ||
|
|
780a0381ba | ||
|
|
e8ec7867b2 | ||
|
|
2423b21c71 | ||
|
|
08bf8a8f1a | ||
|
|
1c12606e70 | ||
|
|
059280d1a5 | ||
|
|
836b1de0d5 | ||
|
|
12cecaa030 | ||
|
|
50ae0ce739 | ||
|
|
cd4758227d | ||
|
|
2e643424ac | ||
|
|
9da6c88d25 | ||
|
|
04aaaa3821 | ||
|
|
da3bd559a9 | ||
|
|
727ba4906c | ||
|
|
71623b674e | ||
|
|
6a511aef0a | ||
|
|
627d04fe6b | ||
|
|
165cab7a29 | ||
|
|
5b59e46e2b | ||
|
|
73b77964ef | ||
|
|
8ce8b2af46 | ||
|
|
d1e49a196d | ||
|
|
8c8d1f6e14 | ||
|
|
48244b9aca | ||
|
|
eb42fb4f49 | ||
|
|
b37834c584 | ||
|
|
d197d115dc | ||
|
|
3a1c37248a | ||
|
|
f7fa9eb21b | ||
|
|
4839d6d513 | ||
|
|
e1621584fa | ||
|
|
97566ce4e3 | ||
|
|
900dcf4ced | ||
|
|
06a0f3480e | ||
|
|
473311269d | ||
|
|
0c4cbc800b | ||
|
|
b8f05c89bd | ||
|
|
e91a576179 | ||
|
|
72c661f1dd | ||
|
|
2277cc771a | ||
|
|
f8c30d0229 | ||
|
|
53b5ffa103 | ||
|
|
b384b76f66 | ||
|
|
b406d2da9e | ||
|
|
dd97b53554 | ||
|
|
0f7e84bb62 | ||
|
|
81add96b1e | ||
|
|
020e66b9da | ||
|
|
d2a63a88a0 | ||
|
|
e5a9f6c163 | ||
|
|
560955f50d | ||
|
|
8410f684fb | ||
|
|
ff44e211ed | ||
|
|
73442ba5ba | ||
|
|
b78662e506 | ||
|
|
8a7bc6f7bc | ||
|
|
66f2097627 | ||
|
|
a67d15be58 | ||
|
|
2e7cee0faa | ||
|
|
50eac7bdf0 | ||
|
|
846da5fb3f | ||
|
|
3e53cd189c | ||
|
|
9331dc755e | ||
|
|
bf8220fd5e | ||
|
|
6a70f34c73 | ||
|
|
c50ea91a3f | ||
|
|
388285675b | ||
|
|
0481d44c69 | ||
|
|
3d0905a90f | ||
|
|
091055edec | ||
|
|
4f0ff5bfb1 | ||
|
|
c941bff929 | ||
|
|
0bbff5b738 | ||
|
|
e66bd490a4 | ||
|
|
e9e9626c2c | ||
|
|
a152c6346d | ||
|
|
96a6dcb152 | ||
|
|
8c701bb139 | ||
|
|
ebf27e6523 | ||
|
|
c379b46a26 | ||
|
|
762bafa47b | ||
|
|
0ed8ed3f8d | ||
|
|
6446660113 | ||
|
|
d0a37d59a5 | ||
|
|
58dd924343 | ||
|
|
a73cfd5f7b | ||
|
|
a1288a5826 | ||
|
|
80d96590c5 | ||
|
|
e8c83798da | ||
|
|
6ad332b801 | ||
|
|
f1b163a32c | ||
|
|
7a3dff5a65 | ||
|
|
4d7be08585 | ||
|
|
a6fdca730d | ||
|
|
4949dd4888 | ||
|
|
2f2a300e83 | ||
|
|
a4a9cfd650 | ||
|
|
bb228c27de | ||
|
|
7152e0f6b8 | ||
|
|
72cfdbc0fa | ||
|
|
f472e6ff48 | ||
|
|
1708d2e69e | ||
|
|
e3cdfd12ea | ||
|
|
cd25c6846e | ||
|
|
efcd43a367 | ||
|
|
90b4b48c7e | ||
|
|
9eb234d321 | ||
|
|
fea70ec832 | ||
|
|
3e333f49fe | ||
|
|
12013508bf | ||
|
|
871a93e4aa | ||
|
|
85e4151bca | ||
|
|
278247faa9 | ||
|
|
e2808dcd96 | ||
|
|
adec2c06bf | ||
|
|
6c8243f6d2 | ||
|
|
afbb99ecf7 | ||
|
|
abce7c7210 | ||
|
|
ec617ae6e5 | ||
|
|
d6786f75cb | ||
|
|
584f5f3734 | ||
|
|
a04c67bcd6 | ||
|
|
8325c6ccdf | ||
|
|
30235f8809 | ||
|
|
9b63fc011e | ||
|
|
cab6c7871c | ||
|
|
04bd25d468 | ||
|
|
cd2c751f82 | ||
|
|
65df3c63bf | ||
|
|
aa012f7a58 | ||
|
|
f6a8c8d078 | ||
|
|
7f71fed963 | ||
|
|
44cbc785fc | ||
|
|
916e27489f | ||
|
|
650e463a49 | ||
|
|
52152ad96d | ||
|
|
f3288092e8 | ||
|
|
18234b8741 | ||
|
|
26b7bee16f | ||
|
|
921e393dcd | ||
|
|
0ec1b98f27 | ||
|
|
a8574fdef2 | ||
|
|
dd8ce1e9d2 | ||
|
|
ca3444c34c | ||
|
|
5c96ecd77d | ||
|
|
fa7a74cfa8 | ||
|
|
b37716ab6a | ||
|
|
5dc060c1a2 | ||
|
|
05d5c404e2 | ||
|
|
cce64e6728 | ||
|
|
006ac7b1b0 | ||
|
|
5465cdf4a4 | ||
|
|
f2a1c8ee60 | ||
|
|
a78fcdb7bf | ||
|
|
ad87266a58 | ||
|
|
d326e28c92 | ||
|
|
c1c177addc | ||
|
|
e8167ceea7 | ||
|
|
ac301537ef | ||
|
|
03034c0081 | ||
|
|
fa872a6b48 | ||
|
|
a23ab00686 | ||
|
|
eeba12144c | ||
|
|
ce00c50720 | ||
|
|
7d2ea42c38 | ||
|
|
e0d7ce439d | ||
|
|
ccfe7f8548 | ||
|
|
c470ac7b00 | ||
|
|
6cf772da6a | ||
|
|
5892385e5c | ||
|
|
1ce3a000a1 | ||
|
|
8585599b4b | ||
|
|
2bac00ea5f | ||
|
|
3396c71c3c | ||
|
|
f821f6bd80 | ||
|
|
7a3012cc1b | ||
|
|
ba31b990a2 | ||
|
|
fc062976a1 | ||
|
|
20e63151a5 | ||
|
|
e63e775fea | ||
|
|
031fb31248 | ||
|
|
6d10799301 | ||
|
|
d6551de8d4 | ||
|
|
6b53f7ee19 | ||
|
|
f54745fe4c | ||
|
|
da51389927 | ||
|
|
a06c16c99a | ||
|
|
3db03a3f51 | ||
|
|
5e966d000a | ||
|
|
1c7431293d | ||
|
|
9c8bc1218d | ||
|
|
860da8bf87 | ||
|
|
326ac31a23 | ||
|
|
a2c78cfc69 | ||
|
|
4fed7a1476 | ||
|
|
8c1e863523 | ||
|
|
27da08ee68 | ||
|
|
0a6877d091 | ||
|
|
7f7b6d641d | ||
|
|
7c301defbd | ||
|
|
2482dd7f77 | ||
|
|
fb7775e382 | ||
|
|
f96edbf987 | ||
|
|
3db0badc35 | ||
|
|
3097547491 | ||
|
|
6307f96fb3 | ||
|
|
8a2543d7b7 | ||
|
|
fa7069a273 | ||
|
|
1a63cd94aa | ||
|
|
7c216c6df8 | ||
|
|
e7724914a9 | ||
|
|
19e47a1922 | ||
|
|
d62e4dbc5e | ||
|
|
c2e4ed9624 | ||
|
|
d457f39b1e | ||
|
|
6d556755ee | ||
|
|
3119fc259c | ||
|
|
1940413eb3 | ||
|
|
237f742100 | ||
|
|
764cd17316 | ||
|
|
c70cfe64c4 | ||
|
|
693fba3b64 | ||
|
|
8fcf5f60e4 | ||
|
|
c00f8e3847 | ||
|
|
7af638f921 | ||
|
|
580c1f3af3 | ||
|
|
d10228cdf7 | ||
|
|
1dd3564d15 | ||
|
|
e3fd81995b | ||
|
|
d4e1b63c19 | ||
|
|
3973d9ce12 | ||
|
|
43d6f6b16a | ||
|
|
2f7839fa42 | ||
|
|
49c3d75f9a | ||
|
|
dc7232fa53 | ||
|
|
51ef646678 | ||
|
|
515c313073 | ||
|
|
197493afd4 | ||
|
|
2ea1deafd0 | ||
|
|
b06e339dbb | ||
|
|
68c0f8a310 | ||
|
|
5182dc6cc9 | ||
|
|
68f6df61e5 | ||
|
|
078337de3c | ||
|
|
9e82687cbe | ||
|
|
660f90e13f | ||
|
|
2eec42df39 | ||
|
|
34b92a30de | ||
|
|
bab99af565 | ||
|
|
2e8e38ec35 | ||
|
|
d6ca95a0c9 | ||
|
|
285c74c394 | ||
|
|
7780c07838 | ||
|
|
5a8d5e5dd9 | ||
|
|
9bcb0ffdef | ||
|
|
1945d0f02a | ||
|
|
4870edb33d | ||
|
|
3abb162969 | ||
|
|
4242478f39 | ||
|
|
4fa2ffe292 | ||
|
|
301df2a856 | ||
|
|
f3b7f4140b | ||
|
|
878b873c69 | ||
|
|
2ca8cf36b7 | ||
|
|
2224b98c9c | ||
|
|
a7031da364 | ||
|
|
cebfdacc5a | ||
|
|
39f89f4a60 | ||
|
|
46b70c1db8 | ||
|
|
5537503172 | ||
|
|
81cc550eb9 | ||
|
|
0a6de0d378 | ||
|
|
25d1de0278 | ||
|
|
39eb8b8a6b | ||
|
|
c050fca177 | ||
|
|
19309823aa | ||
|
|
90bcdb0dda | ||
|
|
17ec30e45c | ||
|
|
07f763be49 | ||
|
|
69119f47c4 | ||
|
|
b0b792e735 | ||
|
|
8aab74ad36 | ||
|
|
f418d1239f | ||
|
|
5b51320dc5 | ||
|
|
d2e81da9e2 | ||
|
|
a61054e1f7 | ||
|
|
749f5d6a32 | ||
|
|
f09bd821ac | ||
|
|
6d5c00b8eb | ||
|
|
532bffdb01 | ||
|
|
c6c7145167 | ||
|
|
b5717cd288 | ||
|
|
d4d7597efb | ||
|
|
2952706b53 | ||
|
|
9b0ccdef34 | ||
|
|
41dd5f6897 | ||
|
|
f9c60d5e9d | ||
|
|
c2ca04c1db | ||
|
|
5fbb99e3d0 | ||
|
|
ba34313f9f | ||
|
|
aa6699435a | ||
|
|
e857e99df8 | ||
|
|
6d537c419e | ||
|
|
4894e24dc8 | ||
|
|
bbbddedb8f | ||
|
|
163dfb3150 | ||
|
|
4f3d20e024 | ||
|
|
b7ba1baf48 | ||
|
|
00efa86fb6 | ||
|
|
43b3640836 | ||
|
|
708eb2a217 | ||
|
|
590a5c3ff3 | ||
|
|
28b528dc9e | ||
|
|
a50f6e5d50 | ||
|
|
1534edd3f3 | ||
|
|
892c159d8f | ||
|
|
0cb4750e3c | ||
|
|
ee4d53a9e4 | ||
|
|
ad150c3ab1 | ||
|
|
7eafebfeb9 | ||
|
|
3d59c6c0b7 | ||
|
|
34efc6b7a4 | ||
|
|
7582640fd5 | ||
|
|
ad265aa9d0 | ||
|
|
1f7e6ea3fe | ||
|
|
a0a5f4f93e | ||
|
|
59e6272ba4 | ||
|
|
323fc8c552 | ||
|
|
cbb10aa80f | ||
|
|
abe4c7c92a | ||
|
|
326b4c467b | ||
|
|
7e51a87111 | ||
|
|
5fdb36239a | ||
|
|
9f99cad9ab | ||
|
|
7c7d4700f1 | ||
|
|
8e5c8430f1 | ||
|
|
92ecd3c0fb | ||
|
|
90eac0709d | ||
|
|
791660ef8d | ||
|
|
1c06cfd29f | ||
|
|
f0379aa428 | ||
|
|
9a0b9428da | ||
|
|
b20abfc11a | ||
|
|
d983dd81ec | ||
|
|
bcf9e66dbc | ||
|
|
890a10b216 | ||
|
|
28adb2dad3 | ||
|
|
c795018f29 | ||
|
|
c1a663b577 | ||
|
|
2b450f26ba | ||
|
|
1ddff5bbf9 | ||
|
|
3a4c8bc8f1 | ||
|
|
fe752174a9 | ||
|
|
494ed221b6 | ||
|
|
14f971d71f | ||
|
|
ddee5d3896 | ||
|
|
447e346b1e | ||
|
|
553d741f03 | ||
|
|
6bd728b3c2 | ||
|
|
a99085891a | ||
|
|
68d3724fad | ||
|
|
fe39ec8697 | ||
|
|
c896118747 | ||
|
|
b89140c311 | ||
|
|
a869c39a2c | ||
|
|
0b27f005e0 | ||
|
|
92a20c76e6 | ||
|
|
42ccea806c | ||
|
|
805f36d134 | ||
|
|
e2c0a3e43b | ||
|
|
3572e7c634 | ||
|
|
0479f833fc | ||
|
|
252aeb43e1 | ||
|
|
24fe24b37d | ||
|
|
32603d7eff | ||
|
|
53bfc70c9e | ||
|
|
c4068cd404 | ||
|
|
0aa17f64c1 | ||
|
|
38cfc5c47c | ||
|
|
91c8f085ef | ||
|
|
5da49989f8 | ||
|
|
260131966d | ||
|
|
6862f66c23 | ||
|
|
2f2a7ace81 | ||
|
|
132719f752 | ||
|
|
64b1aae567 | ||
|
|
a8625e15f0 | ||
|
|
e63d6e490a | ||
|
|
7f60de0c51 | ||
|
|
3a46a2c0a4 | ||
|
|
fbff101165 | ||
|
|
526d2c727d | ||
|
|
6c232da679 | ||
|
|
1241c951d6 | ||
|
|
73e79130d1 | ||
|
|
1a1902350b | ||
|
|
eec65826cf | ||
|
|
fc17c0a618 | ||
|
|
2620992003 | ||
|
|
5a2069b55c | ||
|
|
14adcb2d81 | ||
|
|
13660edef2 | ||
|
|
98034286ac | ||
|
|
2a37a28d72 | ||
|
|
7bb154f768 | ||
|
|
eb96aa261f | ||
|
|
232d359cbb | ||
|
|
2d5d9d5d04 | ||
|
|
7ecca39025 | ||
|
|
bc0190c19f | ||
|
|
9a162b81f0 | ||
|
|
a67a8fabff | ||
|
|
989d381aab | ||
|
|
1d65d82cb5 | ||
|
|
4be4d875f3 | ||
|
|
1ab707713f | ||
|
|
cc46d363c5 | ||
|
|
fa082cbdd0 | ||
|
|
016d40ea0f | ||
|
|
fe6d065bb4 | ||
|
|
b4e8bea4b5 | ||
|
|
555d5abac9 | ||
|
|
3137dc4a70 | ||
|
|
4bba4bf66c | ||
|
|
7b3a33a313 | ||
|
|
ee52290de7 | ||
|
|
8f0899a190 | ||
|
|
f6cfd082c7 | ||
|
|
9d81be4b35 | ||
|
|
a62778d6b0 | ||
|
|
ea612a2dce | ||
|
|
026521b097 | ||
|
|
9dc5259593 | ||
|
|
ea8a566d98 | ||
|
|
8c6f9e899f | ||
|
|
552f675466 | ||
|
|
f9a50333d2 | ||
|
|
de4735092a | ||
|
|
1c4df1832b | ||
|
|
1ad1fe6005 | ||
|
|
f05a4830c5 | ||
|
|
9e1b068a4b | ||
|
|
54bff91762 | ||
|
|
63630690a8 | ||
|
|
dbc613e0d0 | ||
|
|
ee354ee6c8 | ||
|
|
df707df21b | ||
|
|
2436acbd23 | ||
|
|
b41835f19b | ||
|
|
42b2430fe1 | ||
|
|
c8f67788e0 | ||
|
|
bbdff112a3 | ||
|
|
02468b1ca1 | ||
|
|
c41f413978 | ||
|
|
e38dd37667 | ||
|
|
f2cf2b625c | ||
|
|
eb05777d88 | ||
|
|
db4a68454a | ||
|
|
6b0b8ea7d5 | ||
|
|
c925c32233 | ||
|
|
514558afc0 | ||
|
|
b9f602b9a2 | ||
|
|
1a99bcc860 | ||
|
|
6b8aa36c98 | ||
|
|
86ddda5c0e | ||
|
|
58b7f4a096 | ||
|
|
4069aab4f7 | ||
|
|
5595ba643e | ||
|
|
77c556901c | ||
|
|
4928959213 | ||
|
|
a200bb1084 | ||
|
|
92a1ca5917 | ||
|
|
97648d257f | ||
|
|
5937b4b6f7 | ||
|
|
787d40129b | ||
|
|
91ad7e150e | ||
|
|
28bde2cef0 | ||
|
|
a9b54a1bfa | ||
|
|
80f0e99f00 | ||
|
|
102ea7c0bb | ||
|
|
85671a69bf | ||
|
|
a3fa257473 | ||
|
|
c4e994c97d | ||
|
|
0b41e20d54 | ||
|
|
cfabce6e70 | ||
|
|
b948c5457d | ||
|
|
3bdf78e8af | ||
|
|
436595df98 | ||
|
|
d3561a63b1 | ||
|
|
1a12a9b397 | ||
|
|
57644e0256 | ||
|
|
7323d4c639 | ||
|
|
e23225689f | ||
|
|
e6ad2eb14f | ||
|
|
d4a22edeb3 | ||
|
|
8f4e2d941f | ||
|
|
1a8da6caec | ||
|
|
dc335b9025 | ||
|
|
93afbc7d2f | ||
|
|
82e2c5bd22 | ||
|
|
53bcafb39f | ||
|
|
59f8397659 | ||
|
|
061732adf0 | ||
|
|
5c2ca28706 | ||
|
|
a8ea86cfe5 | ||
|
|
7451a73def | ||
|
|
889e705f35 | ||
|
|
14d4979c54 | ||
|
|
095bc178f3 | ||
|
|
308738025c | ||
|
|
97366bf55c | ||
|
|
87cadca3d8 | ||
|
|
9803f92e9c | ||
|
|
cbfa021095 | ||
|
|
03746884a4 | ||
|
|
6ed710adbd | ||
|
|
44b4cda200 | ||
|
|
69a4f3bf42 | ||
|
|
5334cb5acc | ||
|
|
6ca24264e4 | ||
|
|
37a631278f | ||
|
|
5c42687759 | ||
|
|
b636e9744f | ||
|
|
b873930802 | ||
|
|
bc53c81616 | ||
|
|
09c485e712 | ||
|
|
d247470da2 | ||
|
|
90bfea77e0 | ||
|
|
cf0576253f | ||
|
|
4aca2f0b59 | ||
|
|
9d711f65f7 | ||
|
|
0eab08a7cf | ||
|
|
b9c4757d21 | ||
|
|
1fcd881395 | ||
|
|
cd0564ddfa | ||
|
|
dd435b51ab | ||
|
|
ff60cc6b71 | ||
|
|
80743ddc7b | ||
|
|
36a8f24559 | ||
|
|
b25e19e876 | ||
|
|
e9660c3558 | ||
|
|
8c3b379b66 | ||
|
|
b2bb6f1db1 | ||
|
|
59e3783f3f | ||
|
|
d56ecd7414 | ||
|
|
ef4e39be55 | ||
|
|
d42f31ca78 | ||
|
|
084e4487ed | ||
|
|
24897aa50d | ||
|
|
3e50ef439d | ||
|
|
87602e5d72 | ||
|
|
d0c27d5229 | ||
|
|
ebf214c8fc | ||
|
|
250ea53e4b | ||
|
|
01af6ea70c | ||
|
|
7522d50d1a | ||
|
|
cc03a12b75 | ||
|
|
9eff511c5e | ||
|
|
a96ac6f0a0 | ||
|
|
213a63d97d | ||
|
|
8d4548b9c1 | ||
|
|
44f2e6ae1d | ||
|
|
0cd7d268f3 | ||
|
|
f3a9041851 | ||
|
|
776a8c64f6 | ||
|
|
524a1f9498 | ||
|
|
28cfae162a | ||
|
|
b0123448a4 | ||
|
|
2d15dca096 | ||
|
|
5f05135d1b | ||
|
|
3b6b4ff066 | ||
|
|
0c8ec7bfa6 | ||
|
|
2c05b8d6f0 | ||
|
|
45c4187d8f | ||
|
|
87029e05af | ||
|
|
363914c3f7 | ||
|
|
1316065c14 | ||
|
|
2b6a181bef | ||
|
|
bf68df9ef4 | ||
|
|
e7f6089b0e | ||
|
|
a1500b0ee3 | ||
|
|
14001052f8 | ||
|
|
95ab54c79d | ||
|
|
5e84f767f0 | ||
|
|
c47855085b | ||
|
|
1442b1bd0a | ||
|
|
763293a050 | ||
|
|
cc94632b29 | ||
|
|
5df770b9c1 | ||
|
|
4bc9afe20a | ||
|
|
522faeb24f | ||
|
|
362ff09183 | ||
|
|
ccea4d42b5 | ||
|
|
ebbe065716 | ||
|
|
3a97f21383 | ||
|
|
12ced1cddc | ||
|
|
3576f20e5a | ||
|
|
7ae6e6b4c5 | ||
|
|
a2486daee1 | ||
|
|
8bf440b89c | ||
|
|
e9cdb9c896 | ||
|
|
c4804ee50b | ||
|
|
95cb284e27 | ||
|
|
c4ccc376df | ||
|
|
6133110386 | ||
|
|
6f58434d89 | ||
|
|
3fd5d0af79 | ||
|
|
1a6855ea7d | ||
|
|
0312521ac9 | ||
|
|
67b0e0c2d6 | ||
|
|
966e3a1308 | ||
|
|
fd8f8e2708 | ||
|
|
d7fdcbb3d6 | ||
|
|
de2c2ad65c | ||
|
|
862a0ee66b | ||
|
|
c2510a01a5 | ||
|
|
dc85623060 | ||
|
|
8afbb6ca26 | ||
|
|
ed79637737 | ||
|
|
faa2c4467a | ||
|
|
c87fae463e | ||
|
|
29b4b11e78 | ||
|
|
3b24be3bcd | ||
|
|
ece8289aaf | ||
|
|
4042ff0fc4 | ||
|
|
d3d6c5e314 | ||
|
|
125e32eb56 | ||
|
|
94bf8dcd4e | ||
|
|
89b8039466 | ||
|
|
72843b33d0 | ||
|
|
03e699e013 | ||
|
|
fcf99fa8fc | ||
|
|
661fb2eb0e | ||
|
|
42496d638b | ||
|
|
c0a6a0a6d1 | ||
|
|
b7bda783c5 | ||
|
|
6893608ae2 | ||
|
|
ef913bc929 | ||
|
|
a5ed70bcfe | ||
|
|
9bf2ca6916 | ||
|
|
57729d0a23 | ||
|
|
e86b81ec10 | ||
|
|
076eefbed6 | ||
|
|
58a735dc68 | ||
|
|
948d4d43d5 | ||
|
|
ef581e94bb | ||
|
|
ad84af2b2b | ||
|
|
0e65e1254d | ||
|
|
08ec5b3fc0 | ||
|
|
8c491d5917 | ||
|
|
4219fe7822 | ||
|
|
d4eb2b2c75 | ||
|
|
8ea26fddfd | ||
|
|
98add63cdf | ||
|
|
7b90404072 | ||
|
|
de0543f684 | ||
|
|
46e3be7b5b | ||
|
|
7c675b1505 | ||
|
|
d287ea986f | ||
|
|
399328cb49 | ||
|
|
d46e50b112 | ||
|
|
0f87cedc2d | ||
|
|
d34095cf49 | ||
|
|
6039bacb1b | ||
|
|
4877f72a75 | ||
|
|
274b3a2296 | ||
|
|
93013f4205 | ||
|
|
5789987ca3 | ||
|
|
a0524ef05d | ||
|
|
0e3ae63965 | ||
|
|
3e14261ebf | ||
|
|
446de923f3 | ||
|
|
c5860fc6f4 | ||
|
|
6b714030dd | ||
|
|
8483225839 | ||
|
|
585af93828 | ||
|
|
41e266181e | ||
|
|
6b7e6166f9 | ||
|
|
2a4f347dbc | ||
|
|
bff5a28d12 | ||
|
|
5c31c130bd | ||
|
|
b9d6fff962 | ||
|
|
9ffbc45ba6 | ||
|
|
961f41d7ce | ||
|
|
928d3e5f3f | ||
|
|
42eeebc7f6 | ||
|
|
991baf9e69 | ||
|
|
6ad63a06b0 | ||
|
|
60c2fe5a2e | ||
|
|
41b5077330 | ||
|
|
d10dc4bb9b | ||
|
|
c4b487be05 | ||
|
|
c976a0fcd1 | ||
|
|
5b5034f19c | ||
|
|
dd9e829ee1 | ||
|
|
80a7523b49 | ||
|
|
4c55a2340b | ||
|
|
2f2a535113 | ||
|
|
505a300d93 | ||
|
|
4236fa603f | ||
|
|
196d7da53f | ||
|
|
6824319fe6 | ||
|
|
66d00954a5 | ||
|
|
76eb3193ab | ||
|
|
66f5438dc9 | ||
|
|
45164b6761 | ||
|
|
ceefddd332 | ||
|
|
a043230371 | ||
|
|
c2f49fa478 | ||
|
|
fe17a20f84 | ||
|
|
773b108eeb | ||
|
|
36a9cbf41f | ||
|
|
f8182333b4 | ||
|
|
c3265de625 | ||
|
|
b24bd3d8cb | ||
|
|
fa21b95274 | ||
|
|
5dccc88a7c | ||
|
|
2cadd38b6b | ||
|
|
d7cfe464a2 | ||
|
|
018e9eaf6d | ||
|
|
94ca9705ef | ||
|
|
d6f810d91a | ||
|
|
d8cf29c202 | ||
|
|
bf46539d10 | ||
|
|
2ed47cdd19 | ||
|
|
a3f79232c6 | ||
|
|
421bf85808 | ||
|
|
05a847b6b8 | ||
|
|
1e3afe0646 | ||
|
|
38788d707b | ||
|
|
44c0d32a1b | ||
|
|
36aae8c310 | ||
|
|
34ac90443f | ||
|
|
992c14e354 | ||
|
|
529fc937dc | ||
|
|
42c174e803 | ||
|
|
05b8d8c5b7 | ||
|
|
a1c937a007 | ||
|
|
8baec366f0 | ||
|
|
c64bb62ffe | ||
|
|
6020b727d8 | ||
|
|
7f04968950 | ||
|
|
ca1f43dfca | ||
|
|
9efb62f40b | ||
|
|
f1c7d3edfd | ||
|
|
7ff38eeb2e | ||
|
|
e4ce595ebb | ||
|
|
8accf3898a | ||
|
|
690a1622aa | ||
|
|
aaef798566 | ||
|
|
0753fcd6e5 | ||
|
|
a14029744c | ||
|
|
7e46d0b142 | ||
|
|
726e6c087d | ||
|
|
ff0eaf8399 | ||
|
|
7fb7575f78 | ||
|
|
44642af227 | ||
|
|
e7d052100c | ||
|
|
fc2170e488 | ||
|
|
0cda2282dd | ||
|
|
566baab307 | ||
|
|
6753b6d61e | ||
|
|
35817876fe | ||
|
|
7d753d779e | ||
|
|
f6f908a541 | ||
|
|
b0c1986a46 | ||
|
|
9671eaa850 | ||
|
|
062b42918c | ||
|
|
2fa28e790d | ||
|
|
76eab3faa0 | ||
|
|
70ea774f23 | ||
|
|
e15d302985 | ||
|
|
b2196f215a | ||
|
|
8afd75ca47 | ||
|
|
0676535caf | ||
|
|
dd741a58ae | ||
|
|
26304546c4 | ||
|
|
838fb33892 | ||
|
|
7f802b623d | ||
|
|
c2426bc732 | ||
|
|
08d0cdfd31 | ||
|
|
1fd44b1567 | ||
|
|
a2a9f15307 | ||
|
|
291c27c940 | ||
|
|
f86c11f07d | ||
|
|
dbd0f032ce | ||
|
|
6a2e6b744f | ||
|
|
4de8db523f | ||
|
|
cf5ac0f363 | ||
|
|
185ebd7b79 | ||
|
|
38153e0f6e | ||
|
|
f36f3ae1fa | ||
|
|
94d6320376 | ||
|
|
f3a0ab6552 | ||
|
|
568b744374 | ||
|
|
00e687506e | ||
|
|
1c2c5bdd05 | ||
|
|
30acb41561 | ||
|
|
3715a89655 | ||
|
|
ef090d425e | ||
|
|
e1bb06d8ab | ||
|
|
d1793e3b5a | ||
|
|
1bdf664f4d | ||
|
|
05b8901d69 | ||
|
|
1c0d617742 | ||
|
|
b161dfe573 | ||
|
|
c6d019da5f | ||
|
|
b773d63b92 | ||
|
|
66b6787fbe | ||
|
|
f2a498e3c4 | ||
|
|
1a2bccd71c | ||
|
|
8417275368 | ||
|
|
1646352f3c | ||
|
|
c98cf045d6 | ||
|
|
933b9636e5 | ||
|
|
d10bce3dc8 | ||
|
|
814c7e68e0 | ||
|
|
c5c58ccd78 | ||
|
|
1468bcd7b4 | ||
|
|
8b533e19bb | ||
|
|
a55a080b9c | ||
|
|
df32a534fc | ||
|
|
e583a25a8b | ||
|
|
4430b06c71 | ||
|
|
6051ff63e0 | ||
|
|
da2376effd | ||
|
|
0c4ae3dea5 | ||
|
|
e457c9a414 | ||
|
|
997f9233bc | ||
|
|
49781da8f0 | ||
|
|
7f9de007d0 | ||
|
|
c506386997 | ||
|
|
3144f7de72 | ||
|
|
c84a190ac7 | ||
|
|
a26a597453 | ||
|
|
20a689ef44 | ||
|
|
62928ddbcd | ||
|
|
04ef26473a | ||
|
|
7897f5b94b | ||
|
|
9302e3edf4 | ||
|
|
ab93a700ce | ||
|
|
2fc1dd77d2 | ||
|
|
e45c523dc7 | ||
|
|
b3846d6c27 | ||
|
|
dec115cff3 | ||
|
|
fe84ec5e8b | ||
|
|
b39aa43537 | ||
|
|
2216fd2bc1 | ||
|
|
83d9ee1fd1 | ||
|
|
4424cf5b65 | ||
|
|
00a83a44b4 | ||
|
|
83952ef0af | ||
|
|
3dbd2d31bd | ||
|
|
f755ea3894 | ||
|
|
50c4aa061f | ||
|
|
6657966334 | ||
|
|
512aa8942a | ||
|
|
b371331297 | ||
|
|
489b4f307c | ||
|
|
b157d4ebb2 | ||
|
|
9845729709 | ||
|
|
dbfc02cba0 | ||
|
|
d1a1e882bf | ||
|
|
799778af69 | ||
|
|
d45f5a51e4 | ||
|
|
e479abc4ab | ||
|
|
37706c2930 | ||
|
|
bb856fe4c5 | ||
|
|
f4c0a243e7 | ||
|
|
ba9ea1831c | ||
|
|
c7126663df | ||
|
|
aa1339d9c0 | ||
|
|
f87aaf1fbf | ||
|
|
685dabc2d6 | ||
|
|
4cafdb7670 | ||
|
|
a8889971db | ||
|
|
1fbaae837c | ||
|
|
e8c294b701 | ||
|
|
9c30211da9 | ||
|
|
58d3b5b4a0 | ||
|
|
442572c1f4 | ||
|
|
011e3b325d | ||
|
|
a473641e3f | ||
|
|
6f4f252907 | ||
|
|
0d2bbead9d | ||
|
|
16475f6613 | ||
|
|
0bdacd3e77 | ||
|
|
57a50f981b | ||
|
|
115d7133a0 | ||
|
|
eb94603c51 | ||
|
|
7d4a6aa179 | ||
|
|
354de30874 | ||
|
|
c462093555 | ||
|
|
364772f508 | ||
|
|
ae0100a9ab | ||
|
|
756e2b3e9b | ||
|
|
57d02f5c57 | ||
|
|
73b999a662 | ||
|
|
4401f697e5 | ||
|
|
f360b5c1e3 | ||
|
|
07fdaaba45 | ||
|
|
7fa62c9904 | ||
|
|
3e2714810a | ||
|
|
68866f53b0 | ||
|
|
ad8e9a4741 | ||
|
|
3c5d8f446b | ||
|
|
2e425e3cb6 | ||
|
|
1b00bc1929 | ||
|
|
6b28e033de | ||
|
|
eec8870ac1 | ||
|
|
d151759f8a | ||
|
|
807d39abe3 | ||
|
|
7b81136bb3 | ||
|
|
75d7e5abe0 | ||
|
|
4d47c31ebe | ||
|
|
9e723b6b1d | ||
|
|
7aff00496a | ||
|
|
0efdeab1db | ||
|
|
b01d0c88fe | ||
|
|
502b552b68 | ||
|
|
8c90e5314d | ||
|
|
af960f1982 | ||
|
|
8b4291edcb | ||
|
|
45a47936e0 | ||
|
|
7c09d5eb8d | ||
|
|
88f0bc70c4 | ||
|
|
b14cfaf308 | ||
|
|
8dd8d68b83 | ||
|
|
c55d7343ca | ||
|
|
4dea318b5b | ||
|
|
795a22a320 | ||
|
|
b4b2ddad3b | ||
|
|
6ff67ae869 | ||
|
|
33879219ff | ||
|
|
4956bdc4da | ||
|
|
b165775811 | ||
|
|
90746cdd0e | ||
|
|
f93a2b71a1 | ||
|
|
2dd6353e24 | ||
|
|
208abd8cc5 | ||
|
|
4cda09beff | ||
|
|
9a2d36fc6c | ||
|
|
ab6663c785 | ||
|
|
54851ef7a6 | ||
|
|
f8f9b36acd | ||
|
|
6774fa6e07 | ||
|
|
7baf6f781e | ||
|
|
2349a03882 | ||
|
|
3904550d5d | ||
|
|
be3ee91e90 | ||
|
|
d4f87ce29f | ||
|
|
1216d7d912 | ||
|
|
f3b247e4c8 | ||
|
|
7c75d9db98 | ||
|
|
b2fb888363 | ||
|
|
a4d729d36b | ||
|
|
83200f3080 | ||
|
|
a14c614c10 | ||
|
|
a68c4c1e3c | ||
|
|
82f90f9030 | ||
|
|
b707cfe986 | ||
|
|
d37fc8f3a6 | ||
|
|
9f5f724147 | ||
|
|
e2bbc94616 | ||
|
|
928b49a916 | ||
|
|
56c2fd6c5b | ||
|
|
267f877255 | ||
|
|
36e216d24a | ||
|
|
73d231b1bb | ||
|
|
cabb7c73cd | ||
|
|
3a37ed97f4 | ||
|
|
0f14c93fa4 | ||
|
|
f321ee5a61 | ||
|
|
e9eae3fb61 | ||
|
|
17de036d85 | ||
|
|
a91e0de06c | ||
|
|
bbc34904c1 | ||
|
|
f1049a66e2 | ||
|
|
5a497b9f30 | ||
|
|
b4ad0a30af | ||
|
|
1816738b3c | ||
|
|
4b0b036d3b | ||
|
|
0a0618baac | ||
|
|
e03f36eeeb | ||
|
|
6b1ef95d3f | ||
|
|
147bc45658 | ||
|
|
00555dc7bb | ||
|
|
d1a4002b22 | ||
|
|
8ddad1a53d | ||
|
|
96e66b1a81 | ||
|
|
19429abd07 | ||
|
|
243a8135a6 | ||
|
|
3167aa4081 | ||
|
|
10a4926648 | ||
|
|
67f50770f5 | ||
|
|
93daa98608 | ||
|
|
63675f0a47 | ||
|
|
f8765be817 | ||
|
|
f0c7839f25 | ||
|
|
6a39de0ae5 | ||
|
|
402ebb277f | ||
|
|
4e68ca8233 | ||
|
|
95b3e2f140 | ||
|
|
f412ae442b | ||
|
|
01313c1241 | ||
|
|
99afea05b9 | ||
|
|
b99b83812b | ||
|
|
0b48448270 | ||
|
|
2a56a3d9ea | ||
|
|
1883bdaf1d | ||
|
|
82cd23e40b | ||
|
|
d56e167c54 | ||
|
|
3e5765831f | ||
|
|
b9c6162cd5 | ||
|
|
68510f1282 | ||
|
|
4b58b25c19 | ||
|
|
516a2f0efc | ||
|
|
fbd9bcb00e | ||
|
|
682db00ba9 | ||
|
|
434e80dc7b | ||
|
|
5c93a113f3 | ||
|
|
6b4b7bef23 | ||
|
|
8d5c893929 | ||
|
|
b943fbb002 | ||
|
|
9a89db575a | ||
|
|
0fcfe16dc5 | ||
|
|
990f9ed4de | ||
|
|
0f4b0966ef | ||
|
|
ecfd593076 | ||
|
|
3c6b75fb2b | ||
|
|
d1f06b09cd | ||
|
|
3a94ad709c | ||
|
|
7ea8037ee1 | ||
|
|
064bfcc9d2 | ||
|
|
a0028ea8ef | ||
|
|
d174ffeb00 | ||
|
|
5a93bedf72 | ||
|
|
4a0dba08b9 | ||
|
|
b685747643 | ||
|
|
76a97b9718 | ||
|
|
ac1cc56fbb | ||
|
|
f604cbae70 | ||
|
|
91ae5291cc | ||
|
|
5770c6bd04 | ||
|
|
7492f628aa | ||
|
|
2f788aa214 | ||
|
|
cee22df073 | ||
|
|
e219d6a94f | ||
|
|
41e72064e0 | ||
|
|
f302f1a830 | ||
|
|
c0fc726955 | ||
|
|
041d9863c2 | ||
|
|
3c5ca63b6f | ||
|
|
53a41c953d | ||
|
|
c39f2b2c91 | ||
|
|
603b0ae501 | ||
|
|
9938a4e952 | ||
|
|
8997e4369d | ||
|
|
5a6d6ccbd4 | ||
|
|
426fbda799 | ||
|
|
16e91746d9 | ||
|
|
b9a9a23b1e | ||
|
|
8059380fb0 | ||
|
|
039d9db5a3 | ||
|
|
b9f41e34ef | ||
|
|
ca7288ae38 | ||
|
|
a789008f17 | ||
|
|
53142222fe | ||
|
|
f1bec6f05c | ||
|
|
506177e1bd | ||
|
|
91151f1f56 | ||
|
|
daec7c16d3 | ||
|
|
6e446934d4 | ||
|
|
9ab71305d1 | ||
|
|
ae1aac26a7 | ||
|
|
8eb2160890 | ||
|
|
a440bdf15e | ||
|
|
8004ea9726 | ||
|
|
5436c95788 | ||
|
|
467565589c | ||
|
|
8f45bf7b9e | ||
|
|
09939cf6bc | ||
|
|
e8053ac931 | ||
|
|
fff785178d | ||
|
|
af24f8394e | ||
|
|
62b9e4bb56 | ||
|
|
441f1cc282 | ||
|
|
f92110c54c | ||
|
|
1cb6d5cb6d | ||
|
|
3817798905 | ||
|
|
13a14ecda8 | ||
|
|
2b458666ba | ||
|
|
06a8d684a6 | ||
|
|
18d42b411b | ||
|
|
cbd878bbd5 | ||
|
|
49eeed8420 | ||
|
|
5f36d91afd | ||
|
|
a08ce38bcf | ||
|
|
5d204fc3aa | ||
|
|
84ead30e58 | ||
|
|
b11e1afc91 | ||
|
|
c3aa02f003 | ||
|
|
d142830109 | ||
|
|
22e41bab3f | ||
|
|
b0078a2379 | ||
|
|
50109bb307 | ||
|
|
aa1c8d1fa4 | ||
|
|
1de20c1232 | ||
|
|
8fe093de1d | ||
|
|
f004361ef2 | ||
|
|
d6db38a318 | ||
|
|
c88a5291b7 | ||
|
|
0d614cf103 | ||
|
|
29d6cfae80 | ||
|
|
c48a6e73e8 | ||
|
|
956c11388c | ||
|
|
5e8eb926f2 | ||
|
|
1e4f8f27fd | ||
|
|
0ea041e8cb | ||
|
|
e048deb64c | ||
|
|
8ece08e1a3 | ||
|
|
bdfb2b9a0d | ||
|
|
3fd37462bb | ||
|
|
1164e931c5 | ||
|
|
0e8afdb050 | ||
|
|
23119a6f12 | ||
|
|
8001f226b9 | ||
|
|
1c0fa46dfa | ||
|
|
f7455d48cc | ||
|
|
a86d78216c | ||
|
|
47c0b0326d | ||
|
|
0ca979b453 | ||
|
|
c87631c2e6 | ||
|
|
987aa2dd85 | ||
|
|
91b40d1e84 | ||
|
|
bc17f95c80 | ||
|
|
0069ca9ce8 | ||
|
|
fe750240c8 | ||
|
|
1795d3ea27 | ||
|
|
b933ee8e78 | ||
|
|
a3dcf1e004 | ||
|
|
b2411d949e | ||
|
|
19101f7f4a | ||
|
|
a2e4a1eb26 | ||
|
|
742d80aac4 | ||
|
|
473f1d71ff | ||
|
|
8f40bd4675 | ||
|
|
7add262721 | ||
|
|
4a218f1b79 | ||
|
|
419c03daa2 | ||
|
|
019f1e9fc7 | ||
|
|
53604782e5 | ||
|
|
689e8c0ee3 | ||
|
|
0173929538 | ||
|
|
f570757701 | ||
|
|
5473e870eb | ||
|
|
a41b7baf81 | ||
|
|
fcddb5c06c | ||
|
|
5d3544185c | ||
|
|
5dce9501a6 | ||
|
|
b313068cab | ||
|
|
08e8cc1915 | ||
|
|
52f3572d5b | ||
|
|
a804117c83 | ||
|
|
2b14e4a617 | ||
|
|
ad57435953 | ||
|
|
7702d38699 | ||
|
|
90914b38f1 | ||
|
|
8bfd900be5 | ||
|
|
40e8eaf5fd | ||
|
|
d3a606e9d9 | ||
|
|
2fb3d5fd1f | ||
|
|
ba795d86f0 | ||
|
|
e8107b68c8 | ||
|
|
94e69d5e30 | ||
|
|
d1391f1db7 | ||
|
|
b9174b828e | ||
|
|
a6cf6c00ea | ||
|
|
f6097ce6d0 | ||
|
|
1474f755cf | ||
|
|
dcdbd5ab20 | ||
|
|
cbc02bbc4c | ||
|
|
b5796c6b96 | ||
|
|
d80952a2bc | ||
|
|
2e8544f48d | ||
|
|
f26d436ee6 | ||
|
|
6052a86df1 | ||
|
|
9854e3746f | ||
|
|
7a50299cb0 | ||
|
|
7dba426db4 | ||
|
|
fcf0ceeac6 | ||
|
|
e253d8f6db | ||
|
|
8fb544523c | ||
|
|
3ae44ef2f3 | ||
|
|
730d47f7ad | ||
|
|
ea0ab938c4 | ||
|
|
9763ea768d | ||
|
|
8e3406ad20 | ||
|
|
aaf0dc825d | ||
|
|
8729d1e4c2 | ||
|
|
db6eec653b | ||
|
|
c654549d35 | ||
|
|
645897503d | ||
|
|
fe8f2a4603 | ||
|
|
0a4330ee3c | ||
|
|
d157744fb2 | ||
|
|
82320d6e55 | ||
|
|
7db1864766 | ||
|
|
a55a07940c | ||
|
|
37c01a0a4d | ||
|
|
2003be8dc5 | ||
|
|
bfac015d61 | ||
|
|
cd7258a7cd | ||
|
|
c3215af5f6 | ||
|
|
ba0f4d77a0 | ||
|
|
eb681c827d | ||
|
|
e82c53803f | ||
|
|
781d570ec1 | ||
|
|
fef9530ca5 | ||
|
|
ab1dd11705 | ||
|
|
7bf5be9c17 | ||
|
|
ac11ba32ee | ||
|
|
a20ad03f7b | ||
|
|
292f219900 | ||
|
|
55e550f08f | ||
|
|
32943a74b2 | ||
|
|
89291e4010 | ||
|
|
a8a66843db | ||
|
|
32b34c4b80 | ||
|
|
45d0d731eb | ||
|
|
125f62b71e | ||
|
|
eb6ba2a703 | ||
|
|
e559168bd7 | ||
|
|
959d05e6f8 | ||
|
|
e60183313b | ||
|
|
7c0a0c495d | ||
|
|
39eb1e4753 | ||
|
|
079682f313 | ||
|
|
e8513b3241 | ||
|
|
8bac2087cf | ||
|
|
ce1bf11d4b | ||
|
|
eb8138bfbd | ||
|
|
5180eb93e5 | ||
|
|
27fa4d310a | ||
|
|
adc22ec80b | ||
|
|
4bc9f2422b | ||
|
|
d695d2ccc0 | ||
|
|
5fa9dd7cd5 | ||
|
|
b352ae03a9 | ||
|
|
c93da867e0 | ||
|
|
556811ec64 | ||
|
|
403ece66e3 | ||
|
|
9a35dbc4ab | ||
|
|
6f70a53da6 | ||
|
|
93ee9e30d8 | ||
|
|
a84c319d62 | ||
|
|
467b419947 | ||
|
|
ee158fb0aa | ||
|
|
280c9dfcf3 | ||
|
|
e4c59dd164 | ||
|
|
f705b2aec4 | ||
|
|
dce20c3e6a | ||
|
|
e0a2353c56 | ||
|
|
c0ffed7788 | ||
|
|
21b48d24e4 | ||
|
|
e13c9102b8 | ||
|
|
14d8894b40 | ||
|
|
b607a22076 | ||
|
|
b8dafbdf5e | ||
|
|
3b03ff626a | ||
|
|
9614611969 | ||
|
|
f178b78816 | ||
|
|
381488a9bd | ||
|
|
0cbc78656e | ||
|
|
e180d8e594 | ||
|
|
cbb5da5285 | ||
|
|
03877c3752 | ||
|
|
54a3209cf5 | ||
|
|
9eb554a843 | ||
|
|
7036859823 | ||
|
|
60cb3f67f2 | ||
|
|
6b59609f9b | ||
|
|
a3c5ac4730 | ||
|
|
ed1ea91a6f | ||
|
|
209d1b0946 | ||
|
|
761cb97090 | ||
|
|
dcc7b23980 | ||
|
|
b9667fd209 | ||
|
|
d23105ccb7 | ||
|
|
30499005f8 | ||
|
|
f2cd057e89 | ||
|
|
2b465ee65f | ||
|
|
7e092a7658 | ||
|
|
d39b56adaa | ||
|
|
152a20a416 | ||
|
|
7ff0797535 | ||
|
|
ca57c2f6b6 | ||
|
|
d75ba74bbd | ||
|
|
9ff1925538 | ||
|
|
1915408096 | ||
|
|
45801883ba | ||
|
|
382a328ead | ||
|
|
babfa41424 | ||
|
|
204ff787fa | ||
|
|
2a68cc7076 | ||
|
|
b1f807abd1 | ||
|
|
2c830a4698 | ||
|
|
87ce5068bb | ||
|
|
7c794b8d93 | ||
|
|
0a406eab94 | ||
|
|
c67ccad74d | ||
|
|
5d59adc52b | ||
|
|
770cfcaae9 | ||
|
|
04dae32509 | ||
|
|
3e0813d407 | ||
|
|
c8b83d7024 | ||
|
|
d1285255eb | ||
|
|
dfbc6e6a57 | ||
|
|
2eab5d03fd | ||
|
|
fe634e5326 | ||
|
|
bac44d7ffb | ||
|
|
51b59bc8f0 | ||
|
|
2d10e31931 | ||
|
|
4cf7b3cebd | ||
|
|
e11834d1c9 | ||
|
|
8f22ff3032 | ||
|
|
8e94551881 | ||
|
|
6e1470c9d3 | ||
|
|
9416bf9079 | ||
|
|
24f83eef7c | ||
|
|
b7c0576eb5 | ||
|
|
5a48750e16 | ||
|
|
ae93f6345c | ||
|
|
9bba616426 | ||
|
|
1fe50f272b | ||
|
|
93023acc6c | ||
|
|
daf659c64e | ||
|
|
de2a855572 | ||
|
|
df401f57a2 | ||
|
|
6e178653a5 | ||
|
|
9cf1a0c77c | ||
|
|
ebdbe88bc0 | ||
|
|
74ec1d3377 | ||
|
|
1e4f288a7c | ||
|
|
6a21a6f148 | ||
|
|
661b99ec17 | ||
|
|
ecd143fcc2 | ||
|
|
bd9389b956 | ||
|
|
1a09cef0ef | ||
|
|
aa3a6d5916 | ||
|
|
bded1d1115 | ||
|
|
fa4f03525e | ||
|
|
4ee89e62fc | ||
|
|
ee65dea8af | ||
|
|
27609327ee | ||
|
|
958cd0de64 | ||
|
|
1d7601edfb | ||
|
|
8a0fdcfea9 | ||
|
|
75a1ad8bdb | ||
|
|
5bac7f0ca6 | ||
|
|
08fea5705a | ||
|
|
8e5b5d00e1 | ||
|
|
97e8482348 | ||
|
|
0cc73e279e | ||
|
|
54232c6542 | ||
|
|
ee2856f9bc | ||
|
|
737cea0b38 | ||
|
|
a8eeea0b18 | ||
|
|
a2bc88f6db | ||
|
|
5ce8ae79f0 | ||
|
|
d98e9a63d0 | ||
|
|
8e30adbca0 | ||
|
|
9adfd08848 | ||
|
|
2e3419ccbb | ||
|
|
5b6b6dc1b7 | ||
|
|
d0271a90b5 | ||
|
|
20ffe2b2a0 | ||
|
|
94c80e2507 | ||
|
|
efa344be98 | ||
|
|
2ba9a009fe | ||
|
|
c59ffa09e0 | ||
|
|
72f5e028d0 | ||
|
|
80b361dbb0 | ||
|
|
58254adb11 | ||
|
|
7f60e8a307 | ||
|
|
c31be5af4d | ||
|
|
292c01fda2 | ||
|
|
91f7d43e84 | ||
|
|
ce71e65aee | ||
|
|
1119701071 | ||
|
|
42122c270a | ||
|
|
1348621d9e | ||
|
|
8c5ea61376 | ||
|
|
c410f4055f | ||
|
|
1e86635572 | ||
|
|
62ede05c09 | ||
|
|
a067eb02a5 | ||
|
|
154876a17b | ||
|
|
f8c70993c0 | ||
|
|
03a2828fcf | ||
|
|
2fc0056ada | ||
|
|
9a33116526 | ||
|
|
29fcd7c946 | ||
|
|
189f122dd7 | ||
|
|
69c708be44 | ||
|
|
14e56fcd81 | ||
|
|
db67412511 | ||
|
|
76800dc8e7 | ||
|
|
7d282cd0bd | ||
|
|
49b8d1d88c | ||
|
|
4d93dd9d91 | ||
|
|
be1a513c59 | ||
|
|
20900b133e | ||
|
|
279fc2ad37 | ||
|
|
0ef99b90d9 | ||
|
|
1bd8f6a0e2 | ||
|
|
f70c142e10 | ||
|
|
b3fbf047b2 | ||
|
|
0cd8da2cd9 | ||
|
|
7fa0f2763e | ||
|
|
f381b13c91 | ||
|
|
6b9382d865 | ||
|
|
2c335dbc7a | ||
|
|
b3463b20a3 | ||
|
|
15bdf048cc | ||
|
|
992ca93533 | ||
|
|
b4ed3324c0 | ||
|
|
98fd6019cf | ||
|
|
6ccae48f7c | ||
|
|
6933e0ef54 | ||
|
|
a9ecdca08a | ||
|
|
af5bedd45f | ||
|
|
7097a31968 | ||
|
|
4122920dc6 | ||
|
|
9aed11e3dc | ||
|
|
9ea4905f68 | ||
|
|
c6cfcc3c30 | ||
|
|
4bc5e55113 | ||
|
|
566a252577 | ||
|
|
27c766cb04 | ||
|
|
41dd6d0205 | ||
|
|
db071ca35c | ||
|
|
e3af9d8bd3 | ||
|
|
73955f0519 | ||
|
|
5df21e3683 | ||
|
|
a6e1a40c05 | ||
|
|
e330520341 | ||
|
|
d13ed04b17 | ||
|
|
75a23c6c7e | ||
|
|
eaca5d83b0 | ||
|
|
9c1b5e8fb1 | ||
|
|
0c31dbb5d9 | ||
|
|
8a0b11e9e1 | ||
|
|
7ca2787cc8 | ||
|
|
cfbf907418 | ||
|
|
dd02c4cd9b | ||
|
|
93ee5bdba6 | ||
|
|
f2aa6f4e2b | ||
|
|
bc8a583184 | ||
|
|
502ff24568 | ||
|
|
47692d113c | ||
|
|
19c2805d0d | ||
|
|
df078dc004 | ||
|
|
e570225e97 | ||
|
|
8fffa05513 | ||
|
|
0d4120ce2c | ||
|
|
20de432725 | ||
|
|
325bb0115e | ||
|
|
cc3b41ec96 | ||
|
|
225b90eefd | ||
|
|
3931a0b04d | ||
|
|
70c0558443 | ||
|
|
f2bfe623fc | ||
|
|
80dcb565eb | ||
|
|
6d42b6697b | ||
|
|
bcbb2e8649 | ||
|
|
ba92935f64 | ||
|
|
402c262de5 | ||
|
|
03c4092862 | ||
|
|
a225bb29df | ||
|
|
f3a76d84f1 | ||
|
|
7a09feebc3 | ||
|
|
32ddca532a | ||
|
|
df875db989 | ||
|
|
1d138accb9 | ||
|
|
7e6019aef1 | ||
|
|
e20b417b84 | ||
|
|
df56b69060 | ||
|
|
b6d0a32d0e | ||
|
|
a82956d1d6 | ||
|
|
9c0760e3c1 | ||
|
|
4e71e9e2e8 | ||
|
|
521450c7ad | ||
|
|
aa57e91e85 | ||
|
|
4023c26cf1 | ||
|
|
a0f558ee3c | ||
|
|
4f0d03b4b9 | ||
|
|
88d7abcc23 | ||
|
|
409316018d | ||
|
|
d25b9da9f6 | ||
|
|
b48ceac56c | ||
|
|
34413d8d7c | ||
|
|
b7ccca4c47 | ||
|
|
e887b2516f | ||
|
|
be0f6dcaaf | ||
|
|
937bb9f768 | ||
|
|
a11fbf6e2f | ||
|
|
9aa914c756 | ||
|
|
e20d2ba9c1 | ||
|
|
c1be28684a | ||
|
|
fd07f5e142 | ||
|
|
99ca15cae0 | ||
|
|
3651467c71 | ||
|
|
c27ec6f57b | ||
|
|
485d04851c | ||
|
|
83728219db | ||
|
|
5d0bf4cc84 | ||
|
|
446f8f13aa | ||
|
|
96bb9c2018 | ||
|
|
a9b74261b6 | ||
|
|
89c3c08590 | ||
|
|
83309b6391 | ||
|
|
23dd428d65 | ||
|
|
b305495a75 | ||
|
|
727662257c | ||
|
|
b2f88f8fe3 | ||
|
|
44ac571037 | ||
|
|
5bff48a15a | ||
|
|
e4751a798a | ||
|
|
6fc12caa6d | ||
|
|
d00d4d647d | ||
|
|
5ff73de195 | ||
|
|
901de5fbce | ||
|
|
5847a56c40 | ||
|
|
0da0140026 | ||
|
|
207b1db6af | ||
|
|
85f605f20d | ||
|
|
5cf07f5c21 | ||
|
|
340b52da84 | ||
|
|
3de678e164 | ||
|
|
0af71ee6be | ||
|
|
d8c0d87c90 | ||
|
|
9b2c24ad68 | ||
|
|
b4bb6a6101 | ||
|
|
8890e593e6 | ||
|
|
ec0a2e7cca | ||
|
|
f8471a5f45 | ||
|
|
f34cbf9b45 | ||
|
|
a23a705121 | ||
|
|
822ec75814 | ||
|
|
0209b7c083 | ||
|
|
70a8fd59b1 | ||
|
|
223242b512 | ||
|
|
42ac80d3da | ||
|
|
4c11cd0671 | ||
|
|
4c5c6749a0 | ||
|
|
dd038bf753 | ||
|
|
577512f2ca | ||
|
|
565c635e9b | ||
|
|
0b1ab90fb8 | ||
|
|
93b4d9efc3 | ||
|
|
82bc7198e6 | ||
|
|
03ed29953e | ||
|
|
a36c4c6f5f | ||
|
|
3daa6f2c30 | ||
|
|
53ee21caa9 | ||
|
|
31528b6267 | ||
|
|
ab5b81bee1 | ||
|
|
9f6bb989e3 | ||
|
|
3655090997 | ||
|
|
3cd08251ca | ||
|
|
1673ae2c99 | ||
|
|
bf48ef9bab | ||
|
|
1093b3eeab | ||
|
|
d5da7611fa | ||
|
|
9893ae81af | ||
|
|
7bfa276e96 | ||
|
|
02c5621c61 | ||
|
|
9ad2c0887e | ||
|
|
0c7e2fbec6 | ||
|
|
cfee9cab36 | ||
|
|
679a0a0fa1 | ||
|
|
d5dcbf6f3b | ||
|
|
69b9ce6b68 | ||
|
|
c81e87bf37 | ||
|
|
97533c966d | ||
|
|
d6b495f2a7 | ||
|
|
c7e9fe8154 | ||
|
|
fb62a5ed4f | ||
|
|
345121975a | ||
|
|
a5dfe24e49 | ||
|
|
273d9f4f7d | ||
|
|
500c5eea56 | ||
|
|
83a39f5b49 | ||
|
|
2fb675f13c | ||
|
|
eebd1f5492 | ||
|
|
00ead22395 | ||
|
|
2b4bd57c7f | ||
|
|
86dd1519b4 | ||
|
|
a507fc80b6 | ||
|
|
69c3920a1a | ||
|
|
bbe4f5a3d1 | ||
|
|
49a9ec2cb3 | ||
|
|
5d2390deba | ||
|
|
02c347fe6b | ||
|
|
3c056973a1 | ||
|
|
d17f35a488 | ||
|
|
1b8ad61779 | ||
|
|
ede801d099 | ||
|
|
9649b2d346 | ||
|
|
53e52194b5 | ||
|
|
0e8419ac37 | ||
|
|
da08ba5d50 | ||
|
|
30fa6d24d0 | ||
|
|
f776c50d43 | ||
|
|
7b85f6c50d | ||
|
|
21cbf417c8 | ||
|
|
ca680c16e3 | ||
|
|
bf13d91264 | ||
|
|
8aa6580d89 | ||
|
|
11fa71ba6c | ||
|
|
58afce2382 | ||
|
|
24cfb52b5a | ||
|
|
d499803221 | ||
|
|
894783f572 | ||
|
|
93ed89df5f | ||
|
|
1a2e50ca08 | ||
|
|
76703f79fa | ||
|
|
4679188069 | ||
|
|
4c3aa081a0 | ||
|
|
ab9b0538bc | ||
|
|
24edd2972d | ||
|
|
a8b7fa524f | ||
|
|
b827b99b2f | ||
|
|
88add854ff | ||
|
|
704bbbfcaa | ||
|
|
e217e789de | ||
|
|
d4d56e1846 | ||
|
|
8883df2fd6 | ||
|
|
d496c42dc9 | ||
|
|
8433a75a6b | ||
|
|
76b3ba2832 | ||
|
|
05f982dcfb | ||
|
|
cc24b9aaf0 | ||
|
|
e6695d9ba7 | ||
|
|
9fb2bc8468 | ||
|
|
6ccf06c6da | ||
|
|
49e3fd6862 | ||
|
|
9c1a956e47 | ||
|
|
86b089f957 | ||
|
|
3f212a60a5 | ||
|
|
5c61917007 | ||
|
|
8736f61fbd | ||
|
|
04e94824a0 | ||
|
|
ec93c9f55f | ||
|
|
6c71889552 | ||
|
|
4bbb4172aa | ||
|
|
9ccf4c037d | ||
|
|
1f356391f1 | ||
|
|
3c603ec4ae | ||
|
|
d36bea8554 | ||
|
|
16101b8b3f | ||
|
|
455d911f61 | ||
|
|
2fb750f2e3 | ||
|
|
7c781bcd1a | ||
|
|
a234166fc4 | ||
|
|
ecb7e7db74 | ||
|
|
99ceb7df33 | ||
|
|
2e0775d506 | ||
|
|
ac28cd7efa | ||
|
|
a5ec5c1a1d | ||
|
|
7952029752 | ||
|
|
2e083352d5 | ||
|
|
d848b9815a | ||
|
|
48734b6d05 | ||
|
|
8838f666cb | ||
|
|
d8d14a3fc9 | ||
|
|
6e027ad830 | ||
|
|
9d78167297 | ||
|
|
c13329b328 | ||
|
|
b8a2bf2675 | ||
|
|
98be65a1eb | ||
|
|
742b28833a | ||
|
|
77374ac6e2 | ||
|
|
c4be7d48a0 | ||
|
|
0752ce6701 | ||
|
|
8d5422c9bb | ||
|
|
04b5d1679f | ||
|
|
15055c11f9 | ||
|
|
c859fb8f7c | ||
|
|
dd1850aed0 | ||
|
|
079db14d45 | ||
|
|
9f17bee51d | ||
|
|
e904842504 | ||
|
|
4f815521ae | ||
|
|
78df530b90 | ||
|
|
e147c14186 | ||
|
|
06453fb15e | ||
|
|
af5fd2019d | ||
|
|
744ec4dba1 | ||
|
|
38bfbffb1b | ||
|
|
63398f30dd | ||
|
|
961dcf614a | ||
|
|
5b572d8d59 | ||
|
|
8d29710393 | ||
|
|
e839ea8596 | ||
|
|
57e9b94aaa | ||
|
|
9de9b6ebd6 | ||
|
|
44310c6de5 | ||
|
|
139c3b508a | ||
|
|
8207dd33b7 | ||
|
|
d99e1135c8 | ||
|
|
db3b07735b | ||
|
|
0a2149f322 | ||
|
|
da85d2eecc | ||
|
|
cc5802ec05 | ||
|
|
67b13ad9ff | ||
|
|
8dc47c6750 | ||
|
|
39498beffd | ||
|
|
5c305acb97 | ||
|
|
61053653df | ||
|
|
62423f5949 | ||
|
|
55c697e9f4 | ||
|
|
bb47484667 | ||
|
|
c4d2639ed8 | ||
|
|
8f1249ab67 | ||
|
|
35ffeb5ff4 | ||
|
|
25326b40db | ||
|
|
25e18174dd | ||
|
|
a072d719b3 | ||
|
|
d0d0488301 | ||
|
|
0d1ebd73de | ||
|
|
d3ca003346 | ||
|
|
9cbedb16d0 | ||
|
|
9f1c819242 | ||
|
|
a02624c9ed | ||
|
|
933e24d412 | ||
|
|
fe2843f9d6 | ||
|
|
afdc61a253 | ||
|
|
367e764ca3 | ||
|
|
9841f778a9 | ||
|
|
bf4042ce98 | ||
|
|
2e6d5e9bd0 | ||
|
|
0ce848a611 | ||
|
|
57230b4029 | ||
|
|
3111138ca3 | ||
|
|
0f4d01c25c | ||
|
|
f8b872096e | ||
|
|
e18c439a73 | ||
|
|
545732fed8 | ||
|
|
4b6f124b7e | ||
|
|
119fb05cc2 | ||
|
|
e08df2840c | ||
|
|
1ce00f455c | ||
|
|
9cddb05f54 | ||
|
|
93b3a44fb5 | ||
|
|
acb3d4dcfc | ||
|
|
797edae4d4 | ||
|
|
e5abc475f1 | ||
|
|
593485c652 | ||
|
|
6da044cbb5 | ||
|
|
ed38dbf67a | ||
|
|
499af94840 | ||
|
|
2f91a7f603 | ||
|
|
e517ff6534 | ||
|
|
1039dc59ea | ||
|
|
a7501609e8 | ||
|
|
8235bb136b | ||
|
|
bd06f2cec3 | ||
|
|
48c8c89a3f | ||
|
|
8167968efb | ||
|
|
4e81a34146 | ||
|
|
9fec34968b | ||
|
|
a3334bb21c | ||
|
|
d318e6a62e | ||
|
|
ff3a4a770f | ||
|
|
305efe4181 | ||
|
|
c1be7c734f | ||
|
|
303f0f3fcd | ||
|
|
ca87b45fe4 | ||
|
|
31d99b3664 | ||
|
|
3312df42d2 | ||
|
|
68cd12ac29 | ||
|
|
451c7d957d | ||
|
|
15a7b0414c | ||
|
|
52ff158f34 | ||
|
|
479e15469c | ||
|
|
16fef227e8 | ||
|
|
55c338d7af | ||
|
|
4cbfe5d3d1 | ||
|
|
ad60a18fb9 | ||
|
|
5aba6e6d1b | ||
|
|
31de732e3b | ||
|
|
1caec7cb16 | ||
|
|
0cd26d6f3b | ||
|
|
2bfa772472 | ||
|
|
133c3d66be | ||
|
|
266a15ccd3 | ||
|
|
4ff522764c | ||
|
|
4ab594b144 | ||
|
|
3f5e359ef4 | ||
|
|
a344a8f566 | ||
|
|
8acd67b3fa | ||
|
|
323c3b4225 | ||
|
|
ae74a18624 | ||
|
|
85a43cfa66 | ||
|
|
4fdc274a42 | ||
|
|
2d18a07364 | ||
|
|
6cb971ee7b | ||
|
|
cb132338df | ||
|
|
87360b4f7d | ||
|
|
8e0fcd3922 | ||
|
|
9294622519 | ||
|
|
b78a51da0e | ||
|
|
975524a125 | ||
|
|
817e1ce2a7 | ||
|
|
62900cd85b | ||
|
|
174e410b93 | ||
|
|
a5af621947 | ||
|
|
b53ef8de8f | ||
|
|
9a3cdeb7e6 | ||
|
|
c9b6371977 | ||
|
|
7f6ddd0f2e | ||
|
|
94b9c3771d | ||
|
|
86956db27f | ||
|
|
5383db467e | ||
|
|
1cbb5a3d8f | ||
|
|
6513711943 | ||
|
|
f85a213fb1 | ||
|
|
041cec2d97 | ||
|
|
25b58d5e22 | ||
|
|
dd006f8a79 | ||
|
|
1ee847c21a | ||
|
|
1af9a9cee0 | ||
|
|
6a2950aef0 | ||
|
|
a15d4fc306 | ||
|
|
9b174bf5c9 | ||
|
|
6e316e269f | ||
|
|
f0f5342cd4 | ||
|
|
21c4931197 | ||
|
|
24762db8f5 | ||
|
|
492b42e6e9 | ||
|
|
d6b5824c9c | ||
|
|
c204861dec | ||
|
|
7b0ed5d9bd | ||
|
|
5f5b5378c9 | ||
|
|
cfcecca751 | ||
|
|
2878e1e258 | ||
|
|
4596f73ee0 | ||
|
|
caf3e1c035 | ||
|
|
dacc9b2f1c | ||
|
|
de14c02227 | ||
|
|
e665123ebe | ||
|
|
db8af31e2b | ||
|
|
0fd5b2aa32 | ||
|
|
1f58be423d | ||
|
|
14b818efc8 | ||
|
|
19ed13c753 | ||
|
|
317b8baa4f | ||
|
|
d4602a0991 | ||
|
|
3daeadcb07 | ||
|
|
19729962a3 | ||
|
|
bfaab30733 | ||
|
|
c46d3dafc6 | ||
|
|
70c86979e8 | ||
|
|
d402ba6fa2 | ||
|
|
458ccb3681 | ||
|
|
3db8935e20 | ||
|
|
b8ed74c1ec | ||
|
|
fcec996925 | ||
|
|
7cb28e88e2 | ||
|
|
aea4001d73 | ||
|
|
eb0a894ede | ||
|
|
6b08534ffc | ||
|
|
1390378341 | ||
|
|
7146954de2 | ||
|
|
75b9be2d5a | ||
|
|
99aaaccf03 | ||
|
|
7e217511bf | ||
|
|
8c67bbe3a8 | ||
|
|
cc250386df | ||
|
|
3b7c733246 | ||
|
|
7e5567341f | ||
|
|
4f7223e89f | ||
|
|
88b69bb669 | ||
|
|
7a797b2c11 | ||
|
|
832f2fc00f | ||
|
|
d113055899 | ||
|
|
53e75ff0d0 | ||
|
|
3921af434a | ||
|
|
5e6a2fa256 | ||
|
|
86ab9f33de | ||
|
|
d844b0acd0 | ||
|
|
d733c87567 | ||
|
|
589d3e71a3 | ||
|
|
db354b228a | ||
|
|
1fa5852f8f | ||
|
|
ebf0e4d787 | ||
|
|
9677788317 | ||
|
|
78a55935ac | ||
|
|
2aa84019c7 | ||
|
|
6d942dc0a6 | ||
|
|
d408ee1783 | ||
|
|
672ad82849 | ||
|
|
896717f5d4 | ||
|
|
eba2825286 | ||
|
|
a4a06947a5 | ||
|
|
e54e86375b | ||
|
|
453e12cd1f | ||
|
|
de5c821530 | ||
|
|
1ac028e166 | ||
|
|
2778e4aafc | ||
|
|
3f80472e0a | ||
|
|
ec30af9117 | ||
|
|
3b5b5ce254 | ||
|
|
694cd07f1d | ||
|
|
5e71f293e5 | ||
|
|
d4ec542107 | ||
|
|
ffdc764d85 | ||
|
|
2ae1da113e | ||
|
|
5b4f02dfe0 | ||
|
|
e47b976691 | ||
|
|
be4c75a7e9 | ||
|
|
7b9a8acc22 | ||
|
|
03e2dabea9 | ||
|
|
2411a08b09 | ||
|
|
062d6a8398 | ||
|
|
ad4a4ee567 | ||
|
|
ab76468971 | ||
|
|
bc6d952361 | ||
|
|
f85c592818 | ||
|
|
c9c9beddeb | ||
|
|
d3fa938f1f | ||
|
|
9683f88e6a | ||
|
|
2e5c7f598f | ||
|
|
88234cbac0 | ||
|
|
5b208c6277 | ||
|
|
4fffd23dd3 | ||
|
|
b187895e1d | ||
|
|
6e7d0286e3 | ||
|
|
f2bb7947ee | ||
|
|
dc791a641d | ||
|
|
a93e04c6f8 | ||
|
|
d46e13ae52 | ||
|
|
0707720b11 | ||
|
|
74ad10c355 | ||
|
|
f131705ba4 | ||
|
|
6a70584459 | ||
|
|
4c8d4f8a85 | ||
|
|
3ebb3faf32 | ||
|
|
65bbdf56cd | ||
|
|
3e3d51842b | ||
|
|
b041218a2a | ||
|
|
29d2386f13 | ||
|
|
1bd43e094a | ||
|
|
48fc0c04bc | ||
|
|
d2890dfb91 | ||
|
|
e8de437d5c | ||
|
|
51e79c5a3d | ||
|
|
d11cac48f1 | ||
|
|
ed63674b88 | ||
|
|
8e22eadc76 | ||
|
|
9228e223fa | ||
|
|
43fb7f707f | ||
|
|
f88599197e | ||
|
|
4f027c1562 | ||
|
|
704f362804 | ||
|
|
e2535df505 | ||
|
|
f207089604 | ||
|
|
7b7b0ebcca | ||
|
|
8289943a58 | ||
|
|
56d6784d8d | ||
|
|
1d26678934 | ||
|
|
9125499dd0 | ||
|
|
f3f9210dae | ||
|
|
9ca63de9e8 | ||
|
|
813c750c12 | ||
|
|
3fc1d2dfaa | ||
|
|
855f39743a | ||
|
|
3c431da6aa | ||
|
|
66ed7f6a59 | ||
|
|
8ca2f6aa92 | ||
|
|
fa2fbe944f | ||
|
|
33a6851abe | ||
|
|
763cdc3499 | ||
|
|
0f5c28ac46 | ||
|
|
941236948f | ||
|
|
660c536275 | ||
|
|
abe74f869f | ||
|
|
52b74144ee | ||
|
|
1b79114d2d | ||
|
|
ab634853df | ||
|
|
d2e64317ba | ||
|
|
7730b13e5a | ||
|
|
ed5339953e | ||
|
|
b2f07b1d8c | ||
|
|
eff5c7d0d0 | ||
|
|
e00b8f1f73 | ||
|
|
fe6b541233 | ||
|
|
167a1102e0 | ||
|
|
d61208b394 | ||
|
|
4cf023d94c | ||
|
|
b5d793dee6 | ||
|
|
4caddec9ba | ||
|
|
3b4aedd566 | ||
|
|
bc50062964 | ||
|
|
c69f6f4186 | ||
|
|
8c5db539b3 | ||
|
|
fa8b310cfd | ||
|
|
6d5f402380 | ||
|
|
cc7929bdcc | ||
|
|
a82b7f09c8 | ||
|
|
75bfbc94dd | ||
|
|
6c66bd5c7c | ||
|
|
cd69ed20c3 | ||
|
|
a8a2236da9 | ||
|
|
293b717b04 | ||
|
|
078b1de12e | ||
|
|
d84d0b8c5c | ||
|
|
cb6a3cf4e7 | ||
|
|
59e42c1c69 | ||
|
|
a5f715963e | ||
|
|
d49733a5c9 | ||
|
|
052be3296c | ||
|
|
6bb410d603 | ||
|
|
2d4b92fc2b | ||
|
|
ee26469cd9 | ||
|
|
853c9888d9 | ||
|
|
85190f3677 | ||
|
|
efd90c349d | ||
|
|
5aa0a0d099 | ||
|
|
80eb988511 | ||
|
|
a8525a131a | ||
|
|
6a598d8fb8 | ||
|
|
1d5a1b895b | ||
|
|
e6fdb3418d | ||
|
|
5240f8ad7e | ||
|
|
91b616dd6f | ||
|
|
1c1843297c | ||
|
|
aa4d43f31e | ||
|
|
ac86b51e37 | ||
|
|
27a91fc30e | ||
|
|
ece6521d26 | ||
|
|
792938d410 | ||
|
|
9b3d5a8be5 | ||
|
|
8658163aac | ||
|
|
6326aec089 | ||
|
|
f9f6cdc93d | ||
|
|
5b3deec186 | ||
|
|
f3f031f94c | ||
|
|
be7aa8f53a | ||
|
|
7563839756 | ||
|
|
ffcbffc28b | ||
|
|
d998e79549 | ||
|
|
1aa69e334d | ||
|
|
1c00e715a3 | ||
|
|
59c9c4511c | ||
|
|
f763d76110 | ||
|
|
5b55874d4d | ||
|
|
c9f3de5f6b | ||
|
|
c2bb9c01a6 | ||
|
|
0a527f16f5 | ||
|
|
8f23c0c38b | ||
|
|
c1060f0d48 | ||
|
|
15e8d0de7b | ||
|
|
e7ad3633c7 | ||
|
|
a0d93e7744 | ||
|
|
124da7720f | ||
|
|
d668d2448b | ||
|
|
21ab2f135b | ||
|
|
1e38ceb1cd | ||
|
|
2a49e164c8 | ||
|
|
22c88af1ab | ||
|
|
5d80d18f31 | ||
|
|
37e1626478 | ||
|
|
6cddfaf263 | ||
|
|
ac2a8ef4a2 | ||
|
|
b671375abc | ||
|
|
db6c41a219 | ||
|
|
1d38df0a31 | ||
|
|
b1edb1f3ae | ||
|
|
c53c1dc669 | ||
|
|
580a19e097 | ||
|
|
ef40879b5f | ||
|
|
35a45f9d47 | ||
|
|
2685e3405f | ||
|
|
9c4c99bf96 | ||
|
|
9d9eb48258 | ||
|
|
c9f90924a9 | ||
|
|
e5b0303481 | ||
|
|
b1722cbe28 | ||
|
|
7877b676e3 | ||
|
|
c55df4a30b | ||
|
|
24cb90806d | ||
|
|
da5db205ca | ||
|
|
f2d945734e | ||
|
|
f5ead55f0e | ||
|
|
f785e56dba | ||
|
|
b143039b60 | ||
|
|
6afb7442b5 | ||
|
|
b85e2ab7f7 | ||
|
|
f011bda377 | ||
|
|
34581d830d | ||
|
|
334658044e | ||
|
|
60a2c260a5 | ||
|
|
ab2dc5967d | ||
|
|
705051ceb7 | ||
|
|
d3962becf4 | ||
|
|
21d5986157 | ||
|
|
74daa16a1c | ||
|
|
a9d97d9d35 | ||
|
|
bd7d335d9a | ||
|
|
c12b6bc360 | ||
|
|
58da463ad6 | ||
|
|
36c8de9da5 | ||
|
|
f7162ab702 | ||
|
|
8ccb6e463d | ||
|
|
e4dacb2f6f | ||
|
|
dbb82b0f9c | ||
|
|
e1eebf08fb | ||
|
|
01586f473d | ||
|
|
3c631b5625 | ||
|
|
774cf88f68 | ||
|
|
0a80b0c1aa | ||
|
|
1dfe2f8670 | ||
|
|
fac42788bc | ||
|
|
464fef7c6e | ||
|
|
334656b704 | ||
|
|
ba5d9d3352 | ||
|
|
d0fbbe6932 | ||
|
|
c945d4ebbe | ||
|
|
c048ac5eff | ||
|
|
68b392817b | ||
|
|
fbfa3adc42 | ||
|
|
775d07ace4 | ||
|
|
fef01a3c39 | ||
|
|
a7eb6502a9 | ||
|
|
a457d2a138 | ||
|
|
843ecd8cc1 | ||
|
|
5b81f7c713 | ||
|
|
2ec4b10805 | ||
|
|
781d1a2b70 | ||
|
|
7ffa594d4c | ||
|
|
136d997596 | ||
|
|
2b7627f70c | ||
|
|
0620052f50 | ||
|
|
142b433533 | ||
|
|
b464cb78ac | ||
|
|
344d663e90 | ||
|
|
d48eca60cf | ||
|
|
aefc0d1ebb | ||
|
|
1be8d1b797 | ||
|
|
0fa4779d38 | ||
|
|
d07bb1ddff | ||
|
|
0666a73e10 | ||
|
|
3f56c938d8 | ||
|
|
7b2d585896 | ||
|
|
74f899fc01 | ||
|
|
e803c6b65e | ||
|
|
358b4386d3 | ||
|
|
d074cb611f | ||
|
|
54dab50015 | ||
|
|
b60679808b | ||
|
|
547d6d1fb5 | ||
|
|
382024a180 | ||
|
|
12d92a621d | ||
|
|
7f18eced0b | ||
|
|
27e161dc31 | ||
|
|
3ca4539f99 | ||
|
|
ddfa93ff5b | ||
|
|
a61ca763df | ||
|
|
749cc08f52 | ||
|
|
caeeba681f | ||
|
|
d4ea2418d8 | ||
|
|
73f55e7b7a | ||
|
|
13be30e582 | ||
|
|
60fc117c9c | ||
|
|
5cfb51c881 | ||
|
|
f3183efe04 | ||
|
|
b5341ebac6 | ||
|
|
e34b8ac7fb | ||
|
|
58485bd1d8 | ||
|
|
3d211e1cfd | ||
|
|
79c5032708 | ||
|
|
e06cc13edb | ||
|
|
1337fa8bfe | ||
|
|
c1e1a1be5a | ||
|
|
979feaecc6 | ||
|
|
6f0b9128b4 | ||
|
|
a85455ed0b | ||
|
|
227a48cea1 | ||
|
|
ddf6162528 | ||
|
|
abdbd29d5f | ||
|
|
1fee4fd2df | ||
|
|
18357512ed | ||
|
|
52cec35906 | ||
|
|
13cc3f2fe9 | ||
|
|
7cf574d0d8 | ||
|
|
57af995fd0 | ||
|
|
911ffb24fa | ||
|
|
add07c4303 | ||
|
|
4dcb68d128 | ||
|
|
98715f4374 | ||
|
|
9cc7f9fb36 | ||
|
|
d1c1deaf03 | ||
|
|
86aa905c10 | ||
|
|
09fd95ac5c | ||
|
|
5e88be0b2c | ||
|
|
fc25143418 | ||
|
|
a21175398d | ||
|
|
6c51bd0979 | ||
|
|
dc82a6026e | ||
|
|
f152dd8881 | ||
|
|
9703c5de5c | ||
|
|
3395f7158f | ||
|
|
659c3b0aa0 | ||
|
|
46f5d4b1c4 | ||
|
|
bbc09b005b | ||
|
|
1e1e77ad5e | ||
|
|
cdf5d5402b | ||
|
|
3c96041c43 | ||
|
|
6320bd8926 | ||
|
|
30b3855194 | ||
|
|
4ced1c1622 | ||
|
|
2966ad2d15 | ||
|
|
649586fff6 | ||
|
|
a9991133af | ||
|
|
f5342494f4 | ||
|
|
1fd5fdd54a | ||
|
|
88607f09e5 | ||
|
|
c7c496b029 | ||
|
|
5cc24cb7c2 | ||
|
|
a5353c22a6 | ||
|
|
b2ab5178a3 | ||
|
|
2aa2c942e8 | ||
|
|
27b3091ab6 | ||
|
|
5e27d67d55 | ||
|
|
62b73133e5 | ||
|
|
66832e9f4e | ||
|
|
53302406d3 | ||
|
|
f25545b2db | ||
|
|
bc0ce40dc2 | ||
|
|
652dc250fd | ||
|
|
0da79865b8 | ||
|
|
a8ed200a20 | ||
|
|
7504d89f9b | ||
|
|
3f3f258cd6 | ||
|
|
1e95c8b313 | ||
|
|
622f783675 | ||
|
|
7ab4206269 | ||
|
|
e74fbdf6b4 | ||
|
|
be5f04f130 | ||
|
|
01ca4373a1 | ||
|
|
2d8c203195 | ||
|
|
fd88c6160d | ||
|
|
082876d92d | ||
|
|
39aaad5ad8 | ||
|
|
c7a17093cb | ||
|
|
bac31e844a | ||
|
|
067a4d05c3 | ||
|
|
d3fb352c0e | ||
|
|
7822bbd7e8 | ||
|
|
cd3eae3dd2 | ||
|
|
dbb131d13d | ||
|
|
6364ae1a98 | ||
|
|
16b5e99e88 | ||
|
|
c280cc7c4d | ||
|
|
788072af9b | ||
|
|
cf0b880b15 | ||
|
|
39fe7a5cfa | ||
|
|
3144bcbe20 | ||
|
|
eb2856f3df | ||
|
|
9865b46905 | ||
|
|
6c40928fed | ||
|
|
40f04fbe03 | ||
|
|
109b8cedde | ||
|
|
e78a2100ec | ||
|
|
cacf4ecf26 | ||
|
|
cbbecfeb41 | ||
|
|
78d202ac30 | ||
|
|
118ed09da5 | ||
|
|
5b58b4ace5 | ||
|
|
68b5ffc1dc | ||
|
|
ce53d7bd9e | ||
|
|
c7c283f3a9 | ||
|
|
909b79e69b | ||
|
|
256c97d89b | ||
|
|
ba95cd936d | ||
|
|
72e2e145c5 | ||
|
|
2c4dc08aee | ||
|
|
cdcea8045f | ||
|
|
5884794a7f | ||
|
|
a4070be518 | ||
|
|
dffa078c11 | ||
|
|
945c57c335 | ||
|
|
1db2195389 | ||
|
|
10feab02e8 | ||
|
|
9c30ed1a64 | ||
|
|
e9d1ba2539 | ||
|
|
2ff3d97b2e | ||
|
|
748f6e65bd | ||
|
|
52a1f56d14 | ||
|
|
d495451795 | ||
|
|
adf17cd839 | ||
|
|
128eb61238 | ||
|
|
b6a0eff8a8 | ||
|
|
be9d5efa4c | ||
|
|
814d0f76f3 | ||
|
|
f26270b5b4 | ||
|
|
d584888601 | ||
|
|
40a5756564 | ||
|
|
f2c654f898 | ||
|
|
112b49cb9a | ||
|
|
c79adf6997 | ||
|
|
196406da0e | ||
|
|
9d8cf9de5d | ||
|
|
fa7b76eb33 | ||
|
|
474b7fd4be | ||
|
|
81a2359012 | ||
|
|
5f3c4ed740 | ||
|
|
9fcd35d063 | ||
|
|
1e063ca54b | ||
|
|
318bf987d7 | ||
|
|
2b30820de3 | ||
|
|
8c0730c281 | ||
|
|
8be17f077a | ||
|
|
08ff95d402 | ||
|
|
2402b46cf3 | ||
|
|
ab684a9f30 | ||
|
|
03a94ecca7 | ||
|
|
652228a9d2 | ||
|
|
bbdc015e84 | ||
|
|
e186e01933 | ||
|
|
ff475104ab | ||
|
|
4a56c0ae3d | ||
|
|
878afd7df1 | ||
|
|
864789ca65 | ||
|
|
f308b7b512 | ||
|
|
ce434d56a7 | ||
|
|
1382067976 | ||
|
|
7f5a87395e | ||
|
|
a3193bee69 | ||
|
|
a3082b7c1e | ||
|
|
fc07a62337 | ||
|
|
04b7350719 | ||
|
|
58cbecbf95 | ||
|
|
fbffd2c923 | ||
|
|
bf99da4ffb | ||
|
|
545f24bc1b | ||
|
|
6e6127037b | ||
|
|
9314e30987 | ||
|
|
91401cfe26 | ||
|
|
e7fc2951b8 | ||
|
|
45a9f0b637 | ||
|
|
dba2406aba | ||
|
|
8317559090 | ||
|
|
f8a446fbeb | ||
|
|
a8e4da8058 | ||
|
|
6540ac1bab | ||
|
|
1f4577adb9 | ||
|
|
62e394b3e3 | ||
|
|
9cd90bcff2 | ||
|
|
be71e1f11c | ||
|
|
5082ce5107 | ||
|
|
a42cb13628 | ||
|
|
201ab1a140 | ||
|
|
72aef67cca | ||
|
|
d647799c6f | ||
|
|
594e1caad6 | ||
|
|
16497d91c1 | ||
|
|
dfbea797bd | ||
|
|
660e1ec44d | ||
|
|
a37bc88f40 | ||
|
|
bacea078da | ||
|
|
f59a9c5c58 | ||
|
|
6f5e1662c6 | ||
|
|
becc206ba9 | ||
|
|
d0968ea609 | ||
|
|
4ed4efc241 | ||
|
|
8f3d4fdeec | ||
|
|
0872ce27f4 | ||
|
|
50dd7ada50 | ||
|
|
2a95da6bee | ||
|
|
b6d039e888 | ||
|
|
2222b5ab0d | ||
|
|
59ff0b2f77 | ||
|
|
68b5204f29 | ||
|
|
67d4cb6367 | ||
|
|
2cc28863e9 | ||
|
|
6cd20c55d4 | ||
|
|
0f30fb98a9 | ||
|
|
0b14319675 | ||
|
|
e960c56aad | ||
|
|
3882bbebdc | ||
|
|
22a4e3eab8 | ||
|
|
b2bf18d40f | ||
|
|
5d535766bf | ||
|
|
1daf6de102 | ||
|
|
073e6d3a01 | ||
|
|
7048c56583 | ||
|
|
707a0b4103 | ||
|
|
0e4b3d435e | ||
|
|
8fdc37ab13 | ||
|
|
a54c5bef54 | ||
|
|
8c6f3d1054 | ||
|
|
59c10ea4c2 | ||
|
|
37d41313d3 | ||
|
|
e4801ca6f2 | ||
|
|
5d788e9753 | ||
|
|
2e11f01ae6 | ||
|
|
c3949b0d7f | ||
|
|
3f41624514 | ||
|
|
fd07247a48 | ||
|
|
da9bbb58fb | ||
|
|
331a2f8918 | ||
|
|
9218d5d071 | ||
|
|
a37c1379e6 | ||
|
|
a47abdba9b | ||
|
|
47f20d5e83 | ||
|
|
0e9390d5ad | ||
|
|
46b3a7e1b3 | ||
|
|
c230f4ff97 | ||
|
|
47080a1cc6 | ||
|
|
505d607b22 | ||
|
|
9dcd6b003d | ||
|
|
d1c109f59e | ||
|
|
0f1dea4f42 | ||
|
|
25a6596e77 | ||
|
|
8721631287 | ||
|
|
88d31ada75 | ||
|
|
a85a11c1d9 | ||
|
|
5aa487c5ba | ||
|
|
45837a2cfa | ||
|
|
95b0b6cb79 | ||
|
|
fe1a39ed10 | ||
|
|
b4058d150a | ||
|
|
90ea7ba92a | ||
|
|
a15fc5fbb4 | ||
|
|
c36ce28f69 | ||
|
|
dacfecf41a | ||
|
|
64647f8b76 | ||
|
|
63e7b21b35 | ||
|
|
ecc4290d3d | ||
|
|
0fb4d32d6a | ||
|
|
468d0fccd3 | ||
|
|
d703197a50 | ||
|
|
9eb031ce83 | ||
|
|
ccd0f83018 | ||
|
|
4ac1652c70 | ||
|
|
c531e691fc | ||
|
|
f2e830309e | ||
|
|
0f89a19fa0 | ||
|
|
5c88e92e96 | ||
|
|
df0b59cc94 | ||
|
|
295a01ef91 | ||
|
|
9776fb19c6 | ||
|
|
888792a949 | ||
|
|
f319d6e475 | ||
|
|
e812f3b9f7 | ||
|
|
7ce3065f32 | ||
|
|
3e21bed4f9 | ||
|
|
74d82aac56 | ||
|
|
20877b1107 | ||
|
|
78e5149495 | ||
|
|
f0d7323902 | ||
|
|
87f4f1d4f5 | ||
|
|
73866124f3 | ||
|
|
19e187cd92 | ||
|
|
cc954e077f | ||
|
|
1c43cdbbc8 | ||
|
|
c0726036b1 | ||
|
|
0921e364d7 | ||
|
|
a94fb43bb9 | ||
|
|
ad369ec299 | ||
|
|
67b265f737 | ||
|
|
9cb8754d09 | ||
|
|
a14cfa59df | ||
|
|
5bb1c653ef | ||
|
|
dfcdea894b | ||
|
|
04e496d7bd | ||
|
|
ee6df1f065 | ||
|
|
50333cb570 | ||
|
|
286345a2ef | ||
|
|
f8356dd037 | ||
|
|
946d3150ba | ||
|
|
9fc9ef9a40 | ||
|
|
779366640a | ||
|
|
0fb7e430d7 | ||
|
|
4e01ed1a95 | ||
|
|
794633f894 | ||
|
|
e04e6ccdf9 | ||
|
|
dcfd9b22fc | ||
|
|
2c1739a24e | ||
|
|
53271e1e52 | ||
|
|
c4539046be | ||
|
|
2af9a37643 | ||
|
|
d4b1890054 | ||
|
|
a2ceae23a3 | ||
|
|
c242150092 | ||
|
|
e955598923 | ||
|
|
9afebcb229 | ||
|
|
ccfa13cd5b | ||
|
|
bb70cdf6ad | ||
|
|
9f7b231c2c | ||
|
|
b38b233aa6 | ||
|
|
873d457dd2 | ||
|
|
efb25f723f | ||
|
|
d49f520dff | ||
|
|
7c4dbb6ffc | ||
|
|
7a9eca1f7d | ||
|
|
0af0bd4362 | ||
|
|
6039e6b9c7 | ||
|
|
5ca0cfa018 | ||
|
|
12144acf4d | ||
|
|
cd5043f68c | ||
|
|
bddfa3c0b6 | ||
|
|
415b9d07d8 | ||
|
|
01266182e9 | ||
|
|
595493a0ec | ||
|
|
9d630901fa | ||
|
|
ff2eb0de81 | ||
|
|
7222f63dbd | ||
|
|
3c57327274 | ||
|
|
3c63936d3a | ||
|
|
650f63c728 | ||
|
|
4e0ca71ef0 | ||
|
|
65e54ca7b0 | ||
|
|
bc7473182c | ||
|
|
0867b57c39 | ||
|
|
e61876ccbd | ||
|
|
41104f7b63 | ||
|
|
364501a2cd | ||
|
|
f4ae707bf2 | ||
|
|
bcee1b27a7 | ||
|
|
0b7b95923e | ||
|
|
e17f888944 | ||
|
|
9d49f9a356 | ||
|
|
09ba2e8c78 | ||
|
|
c3a361fb52 | ||
|
|
50cda96fa5 | ||
|
|
ed1d7cdea4 | ||
|
|
47f53940da | ||
|
|
658b7d0727 | ||
|
|
6c77cec270 | ||
|
|
d6212a6055 | ||
|
|
d773b42a2d | ||
|
|
ffed4f0031 | ||
|
|
9aba2130a1 | ||
|
|
0611768506 | ||
|
|
baa2272b0a | ||
|
|
6ea91e57e0 | ||
|
|
58dd118c89 | ||
|
|
72da72f814 | ||
|
|
84d1fffb3f | ||
|
|
8a94bc90b8 | ||
|
|
1dea4e154b | ||
|
|
e596385fc0 | ||
|
|
3fde4c7669 | ||
|
|
a3c888d7d1 | ||
|
|
1f0dfd4316 | ||
|
|
93ad48fe6c | ||
|
|
d0d0009a50 | ||
|
|
40a666e7d1 | ||
|
|
d1049f389f | ||
|
|
2a83fc7559 | ||
|
|
679a389bd3 | ||
|
|
888e6f0193 | ||
|
|
0e1ade815a | ||
|
|
e57b3a2139 | ||
|
|
bbebc4ad8d | ||
|
|
01f7162be3 | ||
|
|
bc21edf5b6 | ||
|
|
e5e4fc9d14 | ||
|
|
b71bb6dcd9 | ||
|
|
53b3fba05b | ||
|
|
faedc4381d | ||
|
|
c22cb53b5e | ||
|
|
8915e91b17 | ||
|
|
e14baf134c | ||
|
|
0c669898a4 | ||
|
|
3d863ed254 | ||
|
|
5696a65c5e | ||
|
|
94ec4dbe42 | ||
|
|
a255e4efa6 | ||
|
|
81cf484124 | ||
|
|
1f3840f4a2 | ||
|
|
9bb0eb32bd | ||
|
|
d946b06e51 | ||
|
|
40347487c9 | ||
|
|
0ba2883940 | ||
|
|
58beaa371d | ||
|
|
45c3c5b80f | ||
|
|
a39a816a63 | ||
|
|
5044b59453 | ||
|
|
1e5f4cadde | ||
|
|
b405b4bc9f | ||
|
|
415b8ed674 | ||
|
|
ac354d3b91 | ||
|
|
873477d9bd | ||
|
|
2ae788eddd | ||
|
|
e684b8149b | ||
|
|
bc03007d4d | ||
|
|
be5d08647e | ||
|
|
d92a161c46 | ||
|
|
bc347d6bb9 | ||
|
|
2d28634826 | ||
|
|
b6ffb1b00a | ||
|
|
d5c1eb04c9 | ||
|
|
649f5adb6c | ||
|
|
b1905c5815 | ||
|
|
0fcd14300a | ||
|
|
ba3db66cec | ||
|
|
f3d71aa5bb | ||
|
|
a483105e11 | ||
|
|
0d6faa74b7 | ||
|
|
8cd2b57f8a | ||
|
|
2d08d30409 | ||
|
|
785ea36046 | ||
|
|
69967aeef8 | ||
|
|
5bb7066474 | ||
|
|
3e3ff7acd6 | ||
|
|
41208950ec | ||
|
|
7b3dade184 | ||
|
|
4bc44b0c0b | ||
|
|
29ef3fde8b | ||
|
|
02acfd7d70 | ||
|
|
1835bda02e | ||
|
|
9ee468ce62 | ||
|
|
d9f5451810 | ||
|
|
f2f8300b62 | ||
|
|
66fce93d98 | ||
|
|
49b8ea1bf3 | ||
|
|
b0f76773e1 | ||
|
|
c8a9f8d312 | ||
|
|
e0fe939951 | ||
|
|
ad64f11a95 | ||
|
|
2e7bc014e1 | ||
|
|
3ea28863e4 | ||
|
|
dfa1194804 | ||
|
|
b75455dd96 | ||
|
|
6c23c34d77 | ||
|
|
9b6a0e5875 | ||
|
|
0ced4741d2 | ||
|
|
a4cf37306a | ||
|
|
535329779c | ||
|
|
57f1b950ef | ||
|
|
6c99ff12c9 | ||
|
|
1c17f7f286 | ||
|
|
b3348ae7b3 | ||
|
|
e0fa6a2709 | ||
|
|
250d6ede08 | ||
|
|
b813c1986d | ||
|
|
21599bcf44 | ||
|
|
2dd44746a6 | ||
|
|
924c858c8f | ||
|
|
244e798536 | ||
|
|
8c530f36cb | ||
|
|
683253e334 | ||
|
|
bfa7dfb37e | ||
|
|
dc61f705df | ||
|
|
34b3833c71 | ||
|
|
67ce60544e | ||
|
|
cfb9857f27 | ||
|
|
431f78f008 | ||
|
|
5ace898392 | ||
|
|
a46ccdb144 | ||
|
|
2afa9f75f5 | ||
|
|
5ca8f147f2 | ||
|
|
67553d47e0 | ||
|
|
c4ae19e2a0 | ||
|
|
2c37341a25 | ||
|
|
917f1b0acc | ||
|
|
83f35ede00 | ||
|
|
f8f32125d9 | ||
|
|
495788dff1 | ||
|
|
22df6f4190 | ||
|
|
f49fb2b8b2 | ||
|
|
cbdd44c4ae | ||
|
|
8f8c841df0 | ||
|
|
abfc00983d | ||
|
|
3a15a6063e | ||
|
|
0c3cb104e9 | ||
|
|
5a81e03497 | ||
|
|
b193069110 | ||
|
|
7f72aedae5 | ||
|
|
88348a600b | ||
|
|
d5ccc89fc4 | ||
|
|
9e50ae46d9 | ||
|
|
8ef134a702 | ||
|
|
28aea5c6b7 | ||
|
|
a658f1367e | ||
|
|
4e4fab01b1 | ||
|
|
e6be04c865 | ||
|
|
5add90489f | ||
|
|
a2735ed025 | ||
|
|
ed43635c7b | ||
|
|
50cdcca911 | ||
|
|
5b1fc35e82 | ||
|
|
afd5cd0585 | ||
|
|
6d7bcabe4c | ||
|
|
8cf3731802 |
277
.clang-format
Normal file
277
.clang-format
Normal file
@@ -0,0 +1,277 @@
|
||||
---
|
||||
Language: Cpp
|
||||
AccessModifierOffset: -2
|
||||
AlignAfterOpenBracket: Align
|
||||
AlignArrayOfStructures: None
|
||||
AlignConsecutiveAssignments:
|
||||
Enabled: false
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCompound: false
|
||||
AlignFunctionPointers: false
|
||||
PadOperators: true
|
||||
AlignConsecutiveBitFields:
|
||||
Enabled: false
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCompound: false
|
||||
AlignFunctionPointers: false
|
||||
PadOperators: true
|
||||
AlignConsecutiveDeclarations:
|
||||
Enabled: false
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCompound: false
|
||||
AlignFunctionPointers: false
|
||||
PadOperators: true
|
||||
AlignConsecutiveMacros:
|
||||
Enabled: false
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCompound: false
|
||||
AlignFunctionPointers: false
|
||||
PadOperators: true
|
||||
AlignConsecutiveShortCaseStatements:
|
||||
Enabled: false
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCaseArrows: false
|
||||
AlignCaseColons: false
|
||||
AlignConsecutiveTableGenBreakingDAGArgColons:
|
||||
Enabled: false
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCompound: false
|
||||
AlignFunctionPointers: false
|
||||
PadOperators: false
|
||||
AlignConsecutiveTableGenCondOperatorColons:
|
||||
Enabled: false
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCompound: false
|
||||
AlignFunctionPointers: false
|
||||
PadOperators: false
|
||||
AlignConsecutiveTableGenDefinitionColons:
|
||||
Enabled: false
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCompound: false
|
||||
AlignFunctionPointers: false
|
||||
PadOperators: false
|
||||
AlignEscapedNewlines: Right
|
||||
AlignOperands: Align
|
||||
AlignTrailingComments:
|
||||
Kind: Always
|
||||
OverEmptyLines: 0
|
||||
AllowAllArgumentsOnNextLine: true
|
||||
AllowAllParametersOfDeclarationOnNextLine: true
|
||||
AllowBreakBeforeNoexceptSpecifier: Never
|
||||
AllowShortBlocksOnASingleLine: Never
|
||||
AllowShortCaseExpressionOnASingleLine: true
|
||||
AllowShortCaseLabelsOnASingleLine: false
|
||||
AllowShortCompoundRequirementOnASingleLine: true
|
||||
AllowShortEnumsOnASingleLine: true
|
||||
AllowShortFunctionsOnASingleLine: All
|
||||
AllowShortIfStatementsOnASingleLine: Never
|
||||
AllowShortLambdasOnASingleLine: All
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
AlwaysBreakAfterDefinitionReturnType: None
|
||||
AlwaysBreakBeforeMultilineStrings: false
|
||||
AttributeMacros:
|
||||
- __capability
|
||||
BinPackArguments: true
|
||||
BinPackParameters: true
|
||||
BitFieldColonSpacing: Both
|
||||
BraceWrapping:
|
||||
AfterCaseLabel: false
|
||||
AfterClass: false
|
||||
AfterControlStatement: Never
|
||||
AfterEnum: false
|
||||
AfterExternBlock: false
|
||||
AfterFunction: false
|
||||
AfterNamespace: false
|
||||
AfterObjCDeclaration: false
|
||||
AfterStruct: false
|
||||
AfterUnion: false
|
||||
BeforeCatch: false
|
||||
BeforeElse: false
|
||||
BeforeLambdaBody: false
|
||||
BeforeWhile: false
|
||||
IndentBraces: false
|
||||
SplitEmptyFunction: true
|
||||
SplitEmptyRecord: true
|
||||
SplitEmptyNamespace: true
|
||||
BreakAdjacentStringLiterals: true
|
||||
BreakAfterAttributes: Leave
|
||||
BreakAfterJavaFieldAnnotations: false
|
||||
BreakAfterReturnType: None
|
||||
BreakArrays: true
|
||||
BreakBeforeBinaryOperators: None
|
||||
BreakBeforeConceptDeclarations: Always
|
||||
BreakBeforeBraces: Attach
|
||||
BreakBeforeInlineASMColon: OnlyMultiline
|
||||
BreakBeforeTernaryOperators: true
|
||||
BreakConstructorInitializers: BeforeColon
|
||||
BreakFunctionDefinitionParameters: false
|
||||
BreakInheritanceList: BeforeColon
|
||||
BreakStringLiterals: true
|
||||
BreakTemplateDeclarations: MultiLine
|
||||
ColumnLimit: 80
|
||||
CommentPragmas: '^ IWYU pragma:'
|
||||
CompactNamespaces: false
|
||||
ConstructorInitializerIndentWidth: 2
|
||||
ContinuationIndentWidth: 2
|
||||
Cpp11BracedListStyle: true
|
||||
DerivePointerAlignment: false
|
||||
DisableFormat: false
|
||||
EmptyLineAfterAccessModifier: Never
|
||||
EmptyLineBeforeAccessModifier: LogicalBlock
|
||||
ExperimentalAutoDetectBinPacking: false
|
||||
FixNamespaceComments: true
|
||||
ForEachMacros:
|
||||
- foreach
|
||||
- Q_FOREACH
|
||||
- BOOST_FOREACH
|
||||
IfMacros:
|
||||
- KJ_IF_MAYBE
|
||||
IncludeBlocks: Preserve
|
||||
IncludeCategories:
|
||||
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
||||
Priority: 2
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
- Regex: '^(<|"(gtest|isl|json)/)'
|
||||
Priority: 3
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
- Regex: '.*'
|
||||
Priority: 1
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
IncludeIsMainRegex: '$'
|
||||
IncludeIsMainSourceRegex: ''
|
||||
IndentAccessModifiers: false
|
||||
IndentCaseBlocks: false
|
||||
IndentCaseLabels: false
|
||||
IndentExternBlock: AfterExternBlock
|
||||
IndentGotoLabels: true
|
||||
IndentPPDirectives: AfterHash
|
||||
IndentRequiresClause: false
|
||||
IndentWidth: 2
|
||||
IndentWrappedFunctionNames: false
|
||||
InsertBraces: false
|
||||
InsertNewlineAtEOF: false
|
||||
InsertTrailingCommas: None
|
||||
IntegerLiteralSeparator:
|
||||
Binary: 0
|
||||
BinaryMinDigits: 0
|
||||
Decimal: 0
|
||||
DecimalMinDigits: 0
|
||||
Hex: 0
|
||||
HexMinDigits: 0
|
||||
JavaScriptQuotes: Leave
|
||||
JavaScriptWrapImports: true
|
||||
KeepEmptyLines:
|
||||
AtEndOfFile: false
|
||||
AtStartOfBlock: false
|
||||
AtStartOfFile: true
|
||||
LambdaBodyIndentation: Signature
|
||||
LineEnding: DeriveLF
|
||||
MacroBlockBegin: ''
|
||||
MacroBlockEnd: ''
|
||||
MainIncludeChar: Quote
|
||||
MaxEmptyLinesToKeep: 1
|
||||
NamespaceIndentation: None
|
||||
ObjCBinPackProtocolList: Auto
|
||||
ObjCBlockIndentWidth: 2
|
||||
ObjCBreakBeforeNestedBlockParam: true
|
||||
ObjCSpaceAfterProperty: false
|
||||
ObjCSpaceBeforeProtocolList: true
|
||||
PackConstructorInitializers: NextLine
|
||||
PenaltyBreakAssignment: 2
|
||||
PenaltyBreakBeforeFirstCallParameter: 19
|
||||
PenaltyBreakComment: 300
|
||||
PenaltyBreakFirstLessLess: 120
|
||||
PenaltyBreakOpenParenthesis: 0
|
||||
PenaltyBreakScopeResolution: 500
|
||||
PenaltyBreakString: 1000
|
||||
PenaltyBreakTemplateDeclaration: 10
|
||||
PenaltyExcessCharacter: 1000000
|
||||
PenaltyIndentedWhitespace: 0
|
||||
PenaltyReturnTypeOnItsOwnLine: 60
|
||||
PointerAlignment: Right
|
||||
PPIndentWidth: -1
|
||||
QualifierAlignment: Leave
|
||||
ReferenceAlignment: Pointer
|
||||
ReflowComments: true
|
||||
RemoveBracesLLVM: false
|
||||
RemoveParentheses: Leave
|
||||
RemoveSemicolon: false
|
||||
RequiresClausePosition: OwnLine
|
||||
RequiresExpressionIndentation: OuterScope
|
||||
SeparateDefinitionBlocks: Leave
|
||||
ShortNamespaceLines: 1
|
||||
SkipMacroDefinitionBody: false
|
||||
SortIncludes: Never
|
||||
SortJavaStaticImport: Before
|
||||
SortUsingDeclarations: LexicographicNumeric
|
||||
SpaceAfterCStyleCast: false
|
||||
SpaceAfterLogicalNot: false
|
||||
SpaceAfterTemplateKeyword: true
|
||||
SpaceAroundPointerQualifiers: Default
|
||||
SpaceBeforeAssignmentOperators: true
|
||||
SpaceBeforeCaseColon: false
|
||||
SpaceBeforeCpp11BracedList: false
|
||||
SpaceBeforeCtorInitializerColon: true
|
||||
SpaceBeforeInheritanceColon: true
|
||||
SpaceBeforeJsonColon: false
|
||||
SpaceBeforeParens: ControlStatements
|
||||
SpaceBeforeParensOptions:
|
||||
AfterControlStatements: true
|
||||
AfterForeachMacros: true
|
||||
AfterFunctionDefinitionName: false
|
||||
AfterFunctionDeclarationName: false
|
||||
AfterIfMacros: true
|
||||
AfterOverloadedOperator: false
|
||||
AfterPlacementOperator: true
|
||||
AfterRequiresInClause: false
|
||||
AfterRequiresInExpression: false
|
||||
BeforeNonEmptyParentheses: false
|
||||
SpaceBeforeRangeBasedForLoopColon: true
|
||||
SpaceBeforeSquareBrackets: false
|
||||
SpaceInEmptyBlock: false
|
||||
SpacesBeforeTrailingComments: 1
|
||||
SpacesInAngles: Never
|
||||
SpacesInContainerLiterals: true
|
||||
SpacesInLineCommentPrefix:
|
||||
Minimum: 1
|
||||
Maximum: -1
|
||||
SpacesInParens: Never
|
||||
SpacesInParensOptions:
|
||||
ExceptDoubleParentheses: false
|
||||
InCStyleCasts: false
|
||||
InConditionalStatements: false
|
||||
InEmptyParentheses: false
|
||||
Other: false
|
||||
SpacesInSquareBrackets: false
|
||||
Standard: Latest
|
||||
StatementAttributeLikeMacros:
|
||||
- Q_EMIT
|
||||
StatementMacros:
|
||||
- Q_UNUSED
|
||||
- QT_REQUIRE_VERSION
|
||||
- munit_void_test_decl
|
||||
- nghttp2_max_def
|
||||
- nghttp2_min_def
|
||||
TableGenBreakInsideDAGArg: DontBreak
|
||||
TabWidth: 8
|
||||
UseTab: Never
|
||||
VerilogBreakBetweenInstancePorts: true
|
||||
WhitespaceSensitiveMacros:
|
||||
- STRINGIZE
|
||||
- PP_STRINGIZE
|
||||
- BOOST_PP_STRINGIZE
|
||||
- NS_SWIFT_NAME
|
||||
- CF_SWIFT_NAME
|
||||
...
|
||||
|
||||
10
.github/dependabot.yml
vendored
Normal file
10
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
- package-ecosystem: "gomod"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
24
.github/workflows/android.yml
vendored
Normal file
24
.github/workflows/android.yml
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
name: android
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- Dockerfile.android
|
||||
- .github/workflows/android.yml
|
||||
branches:
|
||||
- '**'
|
||||
|
||||
permissions: read-all
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Build
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
file: Dockerfile.android
|
||||
679
.github/workflows/build.yml
vendored
Normal file
679
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,679 @@
|
||||
name: build
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
permissions: read-all
|
||||
|
||||
env:
|
||||
LIBBPF_VERSION: v1.6.2
|
||||
OPENSSL1_VERSION: 1_1_1w+quic
|
||||
OPENSSL3_VERSION: 3.6.0
|
||||
BORINGSSL_VERSION: db1a8456167249f95b854a1cd24c6b553d0f1567
|
||||
AWSLC_VERSION: v1.62.0
|
||||
NGHTTP3_VERSION: v1.12.0
|
||||
NGTCP2_VERSION: v1.17.0
|
||||
WOLFSSL_VERSION: v5.8.2-stable
|
||||
|
||||
jobs:
|
||||
build-cache:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-24.04, macos-14, macos-15]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
- name: Restore libbpf cache
|
||||
id: cache-libbpf
|
||||
uses: actions/cache@v4
|
||||
if: runner.os == 'Linux'
|
||||
with:
|
||||
path: libbpf/build
|
||||
key: ${{ matrix.os }}-libbpf-${{ env.LIBBPF_VERSION }}
|
||||
- name: Restore OpenSSL v1.1.1 cache
|
||||
id: cache-openssl1
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: openssl1/build
|
||||
key: ${{ matrix.os }}-openssl-${{ env.OPENSSL1_VERSION }}
|
||||
- name: Restore OpenSSL v3.x cache
|
||||
id: cache-openssl3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: openssl3/build
|
||||
key: ${{ matrix.os }}-openssl-${{ env.OPENSSL3_VERSION }}
|
||||
- name: Restore BoringSSL cache
|
||||
id: cache-boringssl
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
boringssl/build/libcrypto.a
|
||||
boringssl/build/libssl.a
|
||||
boringssl/include
|
||||
key: ${{ matrix.os }}-boringssl-${{ env.BORINGSSL_VERSION }}
|
||||
- name: Restore aws-lc cache
|
||||
id: cache-awslc
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
aws-lc/build/crypto/libcrypto.a
|
||||
aws-lc/build/ssl/libssl.a
|
||||
aws-lc/include
|
||||
key: ${{ matrix.os }}-awslc-${{ env.AWSLC_VERSION }}
|
||||
- name: Restore wolfSSL cache
|
||||
id: cache-wolfssl
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: wolfssl/build
|
||||
key: ${{ matrix.os }}-wolfssl-${{ env.WOLFSSL_VERSION }}
|
||||
- name: Restore nghttp3 cache
|
||||
id: cache-nghttp3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: nghttp3/build
|
||||
key: ${{ matrix.os }}-nghttp3-${{ env.NGHTTP3_VERSION }}
|
||||
- name: Restore ngtcp2 + quictls/openssl v1.1.1 cache
|
||||
id: cache-ngtcp2-openssl1
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ngtcp2-openssl1/build
|
||||
key: ${{ matrix.os }}-ngtcp2-${{ env.NGTCP2_VERSION }}-openssl-${{ env.OPENSSL1_VERSION }}
|
||||
- name: Restore ngtcp2 + quictls/openssl v3.x cache
|
||||
id: cache-ngtcp2-openssl3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ngtcp2-openssl3/build
|
||||
key: ${{ matrix.os }}-ngtcp2-${{ env.NGTCP2_VERSION }}-openssl-${{ env.OPENSSL3_VERSION }}
|
||||
- id: settings
|
||||
if: |
|
||||
(steps.cache-libbpf.outputs.cache-hit != 'true' && runner.os == 'Linux') ||
|
||||
steps.cache-openssl1.outputs.cache-hit != 'true' ||
|
||||
steps.cache-openssl3.outputs.cache-hit != 'true' ||
|
||||
steps.cache-boringssl.outputs.cache-hit != 'true' ||
|
||||
steps.cache-awslc.outputs.cache-hit != 'true' ||
|
||||
steps.cache-wolfssl.outputs.cache-hit != 'true' ||
|
||||
steps.cache-nghttp3.outputs.cache-hit != 'true' ||
|
||||
steps.cache-ngtcp2-openssl1.outputs.cache-hit != 'true' ||
|
||||
steps.cache-ngtcp2-openssl3.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
echo 'needs-build=true' >> $GITHUB_OUTPUT
|
||||
- name: Linux setup
|
||||
if: runner.os == 'Linux' && steps.settings.outputs.needs-build == 'true'
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install \
|
||||
autoconf \
|
||||
automake \
|
||||
autotools-dev \
|
||||
libtool \
|
||||
pkg-config \
|
||||
libelf-dev \
|
||||
cmake \
|
||||
cmake-data
|
||||
- name: MacOS setup
|
||||
if: runner.os == 'macOS' && steps.settings.outputs.needs-build == 'true'
|
||||
run: |
|
||||
brew install \
|
||||
autoconf \
|
||||
automake \
|
||||
libtool
|
||||
- name: Build libbpf
|
||||
if: steps.cache-libbpf.outputs.cache-hit != 'true' && runner.os == 'Linux'
|
||||
run: |
|
||||
git clone --recursive --shallow-submodules -b ${{ env.LIBBPF_VERSION }} https://github.com/libbpf/libbpf
|
||||
cd libbpf
|
||||
make -C src install PREFIX=$PWD/build
|
||||
- name: Build quictls/openssl v1.1.1
|
||||
if: steps.cache-openssl1.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
git clone --recursive --shallow-submodules --depth 1 -b OpenSSL_${{ env.OPENSSL1_VERSION }} https://github.com/quictls/openssl openssl1
|
||||
cd openssl1
|
||||
./config --prefix=$PWD/build
|
||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
|
||||
make install_sw
|
||||
- name: Build openssl/openssl v3.x
|
||||
if: steps.cache-openssl3.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
git clone --recursive --shallow-submodules --depth 1 -b openssl-${{ env.OPENSSL3_VERSION }} https://github.com/openssl/openssl openssl3
|
||||
cd openssl3
|
||||
./config enable-ktls --prefix=$PWD/build
|
||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
|
||||
make install_sw
|
||||
- name: Build BoringSSL
|
||||
if: steps.cache-boringssl.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
mkdir boringssl
|
||||
cd boringssl
|
||||
git init
|
||||
git remote add origin https://boringssl.googlesource.com/boringssl
|
||||
git fetch origin --depth 1 ${{ env.BORINGSSL_VERSION }}
|
||||
git checkout ${{ env.BORINGSSL_VERSION }}
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON ..
|
||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
|
||||
- name: Build aws-lc
|
||||
if: steps.cache-awslc.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
git clone --recursive --shallow-submodules --depth 1 -b "${AWSLC_VERSION}" https://github.com/aws/aws-lc
|
||||
cd aws-lc
|
||||
cmake -B build -DDISABLE_GO=ON
|
||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" -C build
|
||||
- name: Build wolfSSL
|
||||
if: steps.cache-wolfssl.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
git clone --depth 1 -b ${{ env.WOLFSSL_VERSION }} https://github.com/wolfSSL/wolfssl
|
||||
cd wolfssl
|
||||
autoreconf -i
|
||||
./configure --disable-dependency-tracking --prefix=$PWD/build \
|
||||
--enable-all --enable-harden --disable-ech
|
||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
|
||||
make install
|
||||
- name: Build nghttp3
|
||||
if: steps.cache-nghttp3.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
git clone --recursive --shallow-submodules --depth 1 -b ${{ env.NGHTTP3_VERSION}} https://github.com/ngtcp2/nghttp3
|
||||
cd nghttp3
|
||||
autoreconf -i
|
||||
./configure --disable-dependency-tracking --prefix=$PWD/build \
|
||||
--enable-lib-only
|
||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" check
|
||||
make install
|
||||
- name: Build ngtcp2 + quictls/openssl v1.1.1 + BoringSSL
|
||||
if: steps.cache-ngtcp2-openssl1.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
git clone --recursive --shallow-submodules --depth 1 -b ${{ env.NGTCP2_VERSION }} https://github.com/ngtcp2/ngtcp2 ngtcp2-openssl1
|
||||
cd ngtcp2-openssl1
|
||||
autoreconf -i
|
||||
./configure --prefix=$PWD/build --enable-lib-only \
|
||||
PKG_CONFIG_PATH="../openssl1/build/lib/pkgconfig:../wolfssl/build/lib/pkgconfig" \
|
||||
BORINGSSL_CFLAGS="-I$PWD/../boringssl/include/" \
|
||||
BORINGSSL_LIBS="-L$PWD/../boringssl/build -lssl -lcrypto" \
|
||||
--disable-dependency-tracking \
|
||||
--with-boringssl \
|
||||
--with-wolfssl
|
||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" check
|
||||
make install
|
||||
- name: Build ngtcp2 + quictls/openssl v3.x + aws-lc
|
||||
if: steps.cache-ngtcp2-openssl3.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
git clone --recursive --shallow-submodules --depth 1 -b ${{ env.NGTCP2_VERSION }} https://github.com/ngtcp2/ngtcp2 ngtcp2-openssl3
|
||||
cd ngtcp2-openssl3
|
||||
autoreconf -i
|
||||
./configure --prefix=$PWD/build --enable-lib-only \
|
||||
PKG_CONFIG_PATH="../openssl3/build/lib64/pkgconfig:../openssl3/build/lib/pkgconfig" \
|
||||
BORINGSSL_CFLAGS="-I$PWD/../aws-lc/include/" \
|
||||
BORINGSSL_LIBS="-L$PWD/../aws-lc/build/ssl -lssl -L$PWD/../aws-lc/build/crypto -lcrypto" \
|
||||
--disable-dependency-tracking \
|
||||
--with-boringssl
|
||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" check
|
||||
make install
|
||||
|
||||
build:
|
||||
needs:
|
||||
- build-cache
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-24.04, macos-14, macos-15]
|
||||
compiler: [gcc, clang]
|
||||
buildtool: [autotools, cmake]
|
||||
http3: [http3, no-http3]
|
||||
openssl: [openssl1, openssl3, boringssl, awslc, wolfssl]
|
||||
exclude:
|
||||
- http3: no-http3
|
||||
openssl: openssl3
|
||||
- os: macos-14
|
||||
compiler: gcc
|
||||
- os: macos-15
|
||||
compiler: gcc
|
||||
- # disable macos cmake because of include path issue
|
||||
os: macos-14
|
||||
buildtool: cmake
|
||||
- # disable macos cmake because of include path issue
|
||||
os: macos-15
|
||||
buildtool: cmake
|
||||
- os: macos-14
|
||||
openssl: boringssl
|
||||
- os: macos-15
|
||||
openssl: boringssl
|
||||
- openssl: boringssl
|
||||
buildtool: cmake
|
||||
- openssl: boringssl
|
||||
compiler: gcc
|
||||
- os: macos-14
|
||||
openssl: awslc
|
||||
- os: macos-15
|
||||
openssl: awslc
|
||||
- openssl: awslc
|
||||
buildtool: cmake
|
||||
- openssl: awslc
|
||||
compiler: gcc
|
||||
include:
|
||||
- os: ubuntu-24.04
|
||||
compiler: clang
|
||||
buildtool: distcheck
|
||||
http3: http3
|
||||
openssl: awslc
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Linux setup
|
||||
if: runner.os == 'Linux'
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install \
|
||||
g++-14 \
|
||||
clang-19 \
|
||||
autoconf \
|
||||
automake \
|
||||
autotools-dev \
|
||||
libtool \
|
||||
pkg-config \
|
||||
zlib1g-dev \
|
||||
libssl-dev \
|
||||
libxml2-dev \
|
||||
libev-dev \
|
||||
libevent-dev \
|
||||
libjansson-dev \
|
||||
libjemalloc-dev \
|
||||
libc-ares-dev \
|
||||
libelf-dev \
|
||||
libbrotli-dev \
|
||||
cmake \
|
||||
cmake-data
|
||||
echo 'CPPFLAGS=-fsanitize=address,undefined -fno-sanitize-recover=undefined -g' >> $GITHUB_ENV
|
||||
echo 'LDFLAGS=-fsanitize=address,undefined -fno-sanitize-recover=undefined' >> $GITHUB_ENV
|
||||
|
||||
# https://github.com/actions/runner-images/issues/9491#issuecomment-1989718917
|
||||
# Asan in llvm 14 provided in ubuntu 22.04 is incompatible with
|
||||
# high-entropy ASLR in much newer kernels that GitHub runners are
|
||||
# using leading to random crashes: https://reviews.llvm.org/D148280
|
||||
sudo sysctl vm.mmap_rnd_bits=28
|
||||
- name: MacOS setup
|
||||
if: runner.os == 'macOS'
|
||||
run: |
|
||||
brew install \
|
||||
libev \
|
||||
libressl \
|
||||
autoconf \
|
||||
automake \
|
||||
libtool
|
||||
echo 'PKG_CONFIG_PATH=/usr/local/opt/libressl/lib/pkgconfig:/usr/local/opt/libxml2/lib/pkgconfig' >> $GITHUB_ENV
|
||||
- name: Setup clang (Linux)
|
||||
if: runner.os == 'Linux' && matrix.compiler == 'clang'
|
||||
run: |
|
||||
echo 'CC=clang-19' >> $GITHUB_ENV
|
||||
echo 'CXX=clang++-19' >> $GITHUB_ENV
|
||||
- name: Setup clang (MacOS)
|
||||
if: runner.os == 'macOS' && matrix.compiler == 'clang'
|
||||
run: |
|
||||
echo 'CC=clang' >> $GITHUB_ENV
|
||||
echo 'CXX=clang++' >> $GITHUB_ENV
|
||||
- name: Setup gcc (Linux)
|
||||
if: runner.os == 'Linux' && matrix.compiler == 'gcc'
|
||||
run: |
|
||||
echo 'CC=gcc-14' >> $GITHUB_ENV
|
||||
echo 'CXX=g++-14' >> $GITHUB_ENV
|
||||
# g++-12 is known to produce false positive warnings.
|
||||
echo 'CXXFLAGS=-Wno-restrict' >> $GITHUB_ENV
|
||||
- name: Setup gcc (MacOS)
|
||||
if: runner.os == 'macOS' && matrix.compiler == 'gcc'
|
||||
run: |
|
||||
echo 'CC=gcc' >> $GITHUB_ENV
|
||||
echo 'CXX=g++' >> $GITHUB_ENV
|
||||
- name: Restore libbpf cache
|
||||
uses: actions/cache/restore@v4
|
||||
if: matrix.http3 == 'http3' && matrix.compiler == 'clang' && runner.os == 'Linux'
|
||||
with:
|
||||
path: libbpf/build
|
||||
key: ${{ matrix.os }}-libbpf-${{ env.LIBBPF_VERSION }}
|
||||
fail-on-cache-miss: true
|
||||
- name: Set libbpf variables
|
||||
if: matrix.http3 == 'http3' && matrix.compiler == 'clang' && runner.os == 'Linux'
|
||||
run: |
|
||||
cd libbpf
|
||||
|
||||
EXTRA_AUTOTOOLS_OPTS="$EXTRA_AUTOTOOLS_OPTS --with-libbpf"
|
||||
EXTRA_CMAKE_OPTS="$EXTRA_CMAKE_OPTS -DWITH_LIBBPF=1"
|
||||
|
||||
echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
|
||||
echo 'EXTRA_CMAKE_OPTS='"$EXTRA_CMAKE_OPTS" >> $GITHUB_ENV
|
||||
- name: Setup libev variables
|
||||
if: runner.os == 'macOS'
|
||||
run: |
|
||||
LIBEV_CFLAGS="-I/opt/homebrew/Cellar/libev/4.33/include"
|
||||
LIBEV_LIBS="-L/opt/homebrew/Cellar/libev/4.33/lib -lev"
|
||||
|
||||
echo 'LIBEV_CFLAGS='"$LIBEV_CFLAGS" >> $GITHUB_ENV
|
||||
echo 'LIBEV_LIBS='"$LIBEV_LIBS" >> $GITHUB_ENV
|
||||
- name: Restore quictls/openssl v1.1.1 cache
|
||||
uses: actions/cache/restore@v4
|
||||
if: matrix.openssl == 'openssl1'
|
||||
with:
|
||||
path: openssl1/build
|
||||
key: ${{ matrix.os }}-openssl-${{ env.OPENSSL1_VERSION }}
|
||||
fail-on-cache-miss: true
|
||||
- name: Restore openssl/openssl v3.x cache
|
||||
uses: actions/cache/restore@v4
|
||||
if: matrix.openssl == 'openssl3'
|
||||
with:
|
||||
path: openssl3/build
|
||||
key: ${{ matrix.os }}-openssl-${{ env.OPENSSL3_VERSION }}
|
||||
fail-on-cache-miss: true
|
||||
- name: Restore BoringSSL cache
|
||||
uses: actions/cache/restore@v4
|
||||
if: matrix.openssl == 'boringssl'
|
||||
with:
|
||||
path: |
|
||||
boringssl/build/libcrypto.a
|
||||
boringssl/build/libssl.a
|
||||
boringssl/include
|
||||
key: ${{ matrix.os }}-boringssl-${{ env.BORINGSSL_VERSION }}
|
||||
fail-on-cache-miss: true
|
||||
- name: Restore aws-lc cache
|
||||
uses: actions/cache/restore@v4
|
||||
if: matrix.openssl == 'awslc'
|
||||
with:
|
||||
path: |
|
||||
aws-lc/build/crypto/libcrypto.a
|
||||
aws-lc/build/ssl/libssl.a
|
||||
aws-lc/include
|
||||
key: ${{ matrix.os }}-awslc-${{ env.AWSLC_VERSION }}
|
||||
fail-on-cache-miss: true
|
||||
- name: Set BoringSSL variables
|
||||
if: matrix.openssl == 'boringssl'
|
||||
run: |
|
||||
cd boringssl
|
||||
|
||||
OPENSSL_CFLAGS="-I$PWD/include/"
|
||||
OPENSSL_LIBS="-L$PWD/build -lssl -lcrypto -pthread"
|
||||
EXTRA_AUTOTOOLS_OPTS="$EXTRA_AUTOTOOLS_OPTS --without-neverbleed --without-jemalloc --disable-examples"
|
||||
|
||||
echo 'OPENSSL_CFLAGS='"$OPENSSL_CFLAGS" >> $GITHUB_ENV
|
||||
echo 'OPENSSL_LIBS='"$OPENSSL_LIBS" >> $GITHUB_ENV
|
||||
echo 'BORINGSSL_CFLAGS='"$OPENSSL_CFLAGS" >> $GITHUB_ENV
|
||||
echo 'BORINGSSL_LIBS='"$OPENSSL_LIBS" >> $GITHUB_ENV
|
||||
echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
|
||||
- name: Set aws-lc variables
|
||||
if: matrix.openssl == 'awslc'
|
||||
run: |
|
||||
cd aws-lc
|
||||
|
||||
OPENSSL_CFLAGS="-I$PWD/include/"
|
||||
OPENSSL_LIBS="-L$PWD/build/ssl -lssl -L$PWD/build/crypto -lcrypto -pthread"
|
||||
EXTRA_AUTOTOOLS_OPTS="$EXTRA_AUTOTOOLS_OPTS --without-neverbleed --without-jemalloc"
|
||||
|
||||
echo 'OPENSSL_CFLAGS='"$OPENSSL_CFLAGS" >> $GITHUB_ENV
|
||||
echo 'OPENSSL_LIBS='"$OPENSSL_LIBS" >> $GITHUB_ENV
|
||||
echo 'BORINGSSL_CFLAGS='"$OPENSSL_CFLAGS" >> $GITHUB_ENV
|
||||
echo 'BORINGSSL_LIBS='"$OPENSSL_LIBS" >> $GITHUB_ENV
|
||||
echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
|
||||
- name: Restore wolfSSL cache
|
||||
uses: actions/cache/restore@v4
|
||||
if: matrix.openssl == 'wolfssl'
|
||||
with:
|
||||
path: wolfssl/build
|
||||
key: ${{ matrix.os }}-wolfssl-${{ env.WOLFSSL_VERSION }}
|
||||
fail-on-cache-miss: true
|
||||
- name: Set wolfSSL variables
|
||||
if: matrix.openssl == 'wolfssl'
|
||||
run: |
|
||||
EXTRA_AUTOTOOLS_OPTS="$EXTRA_AUTOTOOLS_OPTS --with-wolfssl --without-neverbleed"
|
||||
EXTRA_CMAKE_OPTS="$EXTRA_CMAKE_OPTS -DWITH_WOLFSSL=1 -DWITH_NEVERBLEED=0 -DENABLE_EXAMPLES=0"
|
||||
|
||||
echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
|
||||
echo 'EXTRA_CMAKE_OPTS='"$EXTRA_CMAKE_OPTS" >> $GITHUB_ENV
|
||||
- name: Restore nghttp3 cache
|
||||
uses: actions/cache/restore@v4
|
||||
if: matrix.http3 == 'http3'
|
||||
with:
|
||||
path: nghttp3/build
|
||||
key: ${{ matrix.os }}-nghttp3-${{ env.NGHTTP3_VERSION }}
|
||||
fail-on-cache-miss: true
|
||||
- name: Restore ngtcp2 + quictls/openssl v1.1.1 cache + BoringSSL
|
||||
uses: actions/cache/restore@v4
|
||||
if: matrix.http3 == 'http3' && (matrix.openssl == 'openssl1' || matrix.openssl == 'boringssl' || matrix.openssl == 'wolfssl')
|
||||
with:
|
||||
path: ngtcp2-openssl1/build
|
||||
key: ${{ matrix.os }}-ngtcp2-${{ env.NGTCP2_VERSION }}-openssl-${{ env.OPENSSL1_VERSION }}
|
||||
fail-on-cache-miss: true
|
||||
- name: Restore ngtcp2 + quictls/openssl v3.x cache + aws-lc
|
||||
uses: actions/cache/restore@v4
|
||||
if: matrix.http3 == 'http3' && (matrix.openssl == 'openssl3' || matrix.openssl == 'awslc')
|
||||
with:
|
||||
path: ngtcp2-openssl3/build
|
||||
key: ${{ matrix.os }}-ngtcp2-${{ env.NGTCP2_VERSION }}-openssl-${{ env.OPENSSL3_VERSION }}
|
||||
fail-on-cache-miss: true
|
||||
- name: Setup extra environment variables
|
||||
if: matrix.http3 == 'no-http3'
|
||||
run: |
|
||||
PKG_CONFIG_PATH="$PWD/openssl1/build/lib/pkgconfig:$PWD/openssl3/build/lib64/pkgconfig:$PWD/openssl3/build/lib/pkgconfig:$PWD/wolfssl/build/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/openssl1/build/lib -Wl,-rpath,$PWD/openssl3/build/lib64 -Wl,-rpath,$PWD/openssl3/build/lib"
|
||||
|
||||
echo 'PKG_CONFIG_PATH='"$PKG_CONFIG_PATH" >> $GITHUB_ENV
|
||||
echo 'LDFLAGS='"$LDFLAGS" >> $GITHUB_ENV
|
||||
- name: Setup extra environment variables for HTTP/3
|
||||
if: matrix.http3 == 'http3'
|
||||
run: |
|
||||
PKG_CONFIG_PATH="$PWD/openssl1/build/lib/pkgconfig:$PWD/openssl3/build/lib64/pkgconfig:$PWD/openssl3/build/lib/pkgconfig:$PWD/wolfssl/build/lib/pkgconfig:$PWD/nghttp3/build/lib/pkgconfig:$PWD/ngtcp2-openssl1/build/lib/pkgconfig:$PWD/ngtcp2-openssl3/build/lib/pkgconfig:$PWD/libbpf/build/lib64/pkgconfig:$PKG_CONFIG_PATH"
|
||||
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/openssl1/build/lib -Wl,-rpath,$PWD/openssl3/build/lib64 -Wl,-rpath,$PWD/openssl3/build/lib -Wl,-rpath,$PWD/libbpf/build/lib64"
|
||||
EXTRA_AUTOTOOLS_OPTS="$EXTRA_AUTOTOOLS_OPTS --enable-http3"
|
||||
EXTRA_CMAKE_OPTS="$EXTRA_CMAKE_OPTS -DENABLE_HTTP3=1"
|
||||
|
||||
echo 'PKG_CONFIG_PATH='"$PKG_CONFIG_PATH" >> $GITHUB_ENV
|
||||
echo 'LDFLAGS='"$LDFLAGS" >> $GITHUB_ENV
|
||||
echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
|
||||
echo 'EXTRA_CMAKE_OPTS='"$EXTRA_CMAKE_OPTS" >> $GITHUB_ENV
|
||||
- name: Configure autotools
|
||||
run: |
|
||||
autoreconf -i
|
||||
./configure --disable-dependency-tracking
|
||||
- name: Make distribution and unpack
|
||||
if: matrix.buildtool != 'distcheck'
|
||||
run: |
|
||||
make dist
|
||||
VERSION=$(grep PACKAGE_VERSION config.h | cut -d' ' -f3 | tr -d '"')
|
||||
tar xf nghttp2-$VERSION.tar.gz
|
||||
cd nghttp2-$VERSION
|
||||
echo 'NGHTTP2_BUILD_DIR='"$PWD" >> $GITHUB_ENV
|
||||
- name: Configure cmake (Linux)
|
||||
if: matrix.buildtool == 'cmake' && runner.os == 'Linux'
|
||||
run: |
|
||||
cd $NGHTTP2_BUILD_DIR
|
||||
|
||||
cmake -DENABLE_WERROR=1 -DWITH_MRUBY=1 -DWITH_NEVERBLEED=1 -DENABLE_APP=1 $EXTRA_CMAKE_OPTS -DCPPFLAGS="$CPPFLAGS" -DLDFLAGS="$LDFLAGS" -DBUILD_STATIC_LIBS=ON -DBUILD_TESTING=ON .
|
||||
- name: Configure cmake (MacOS)
|
||||
if: matrix.buildtool == 'cmake' && runner.os == 'macOS'
|
||||
run: |
|
||||
# This fixes infamous 'stdio.h not found' error.
|
||||
echo 'SDKROOT='"$(xcrun --sdk macosx --show-sdk-path)" >> $GITHUB_ENV
|
||||
|
||||
cd $NGHTTP2_BUILD_DIR
|
||||
|
||||
cmake -DENABLE_WERROR=1 -DWITH_MRUBY=1 -DENABLE_APP=1 $EXTRA_CMAKE_OPTS -DCPPFLAGS="$CPPFLAGS" -DLDFLAGS="$LDFLAGS" -DBUILD_STATIC_LIBS=ON -DBUILD_TESTING=ON .
|
||||
- name: Build nghttp2 with autotools (Linux)
|
||||
if: matrix.buildtool == 'autotools' && runner.os == 'Linux'
|
||||
run: |
|
||||
cd $NGHTTP2_BUILD_DIR
|
||||
|
||||
./configure --disable-dependency-tracking --with-mruby --with-neverbleed --with-libev --with-libbrotlienc --with-libbrotlidec --enable-werror $EXTRA_AUTOTOOLS_OPTS
|
||||
make -j"$(nproc)" check
|
||||
- name: Build nghttp2 with autotools (MacOS)
|
||||
if: matrix.buildtool == 'autotools' && runner.os == 'macOS'
|
||||
run: |
|
||||
cd $NGHTTP2_BUILD_DIR
|
||||
|
||||
./configure --disable-dependency-tracking --with-mruby --with-libev --with-libbrotlienc --with-libbrotlidec --enable-werror $EXTRA_AUTOTOOLS_OPTS
|
||||
make -j"$(sysctl -n hw.ncpu)" check
|
||||
- name: Build nghttp2 with autotools (distcheck)
|
||||
if: matrix.buildtool == 'distcheck'
|
||||
run: |
|
||||
make -j"$(nproc)" distcheck \
|
||||
DISTCHECK_CONFIGURE_FLAGS="--with-mruby --with-neverbleed --with-libev --with-libbrotlienc --with-libbrotlidec --enable-werror $EXTRA_AUTOTOOLS_OPTS CPPFLAGS=\"$CPPFLAGS\" LDFLAGS=\"$LDFLAGS\""
|
||||
- name: Build nghttp2 with cmake
|
||||
if: matrix.buildtool == 'cmake'
|
||||
run: |
|
||||
cd $NGHTTP2_BUILD_DIR
|
||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
|
||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" check
|
||||
- uses: actions/setup-go@v6
|
||||
if: matrix.buildtool != 'distcheck'
|
||||
with:
|
||||
go-version: "1.24"
|
||||
- name: Integration test
|
||||
# Integration tests for nghttpx; autotools erases build
|
||||
# artifacts.
|
||||
if: matrix.buildtool != 'distcheck'
|
||||
run: |
|
||||
sudo sh -c 'echo "127.0.0.1 127.0.0.1.nip.io" >> /etc/hosts'
|
||||
cd $NGHTTP2_BUILD_DIR/integration-tests
|
||||
make it
|
||||
|
||||
build-cross:
|
||||
strategy:
|
||||
matrix:
|
||||
host: [x86_64-w64-mingw32, i686-w64-mingw32]
|
||||
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
env:
|
||||
HOST: ${{ matrix.host }}
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Prepare for i386
|
||||
if: matrix.host == 'i686-w64-mingw32'
|
||||
run: |
|
||||
sudo dpkg --add-architecture i386
|
||||
- name: Linux setup
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install \
|
||||
gcc-mingw-w64 \
|
||||
autoconf \
|
||||
automake \
|
||||
autotools-dev \
|
||||
libtool \
|
||||
pkg-config \
|
||||
wine
|
||||
- name: Configure autotools
|
||||
run: |
|
||||
autoreconf -i && \
|
||||
./configure --disable-dependency-tracking --enable-werror \
|
||||
--enable-lib-only --host="$HOST" \
|
||||
CFLAGS="-g -O2 -D_WIN32_WINNT=0x0600" LIBS="-pthread"
|
||||
- name: Build nghttp2
|
||||
run: |
|
||||
make -j$(nproc)
|
||||
make -j$(nproc) check TESTS=""
|
||||
- name: Run tests
|
||||
run: |
|
||||
export WINEPATH="/usr/${{ matrix.host }}/lib;$(winepath -w /usr/lib/x86_64-linux-gnu/wine/x86_64-windows)"
|
||||
cd tests
|
||||
wine main.exe
|
||||
|
||||
build-windows:
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [x86, x64]
|
||||
include:
|
||||
- arch: x86
|
||||
platform: Win32
|
||||
- arch: x64
|
||||
platform: x64
|
||||
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
submodules: recursive
|
||||
- uses: microsoft/setup-msbuild@v2
|
||||
- name: Configure cmake
|
||||
run: cmake -B build -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_GENERATOR_PLATFORM=${{ matrix.platform }} -DVCPKG_TARGET_TRIPLET=${{ matrix.arch}}-windows -DBUILD_STATIC_LIBS=ON -DBUILD_TESTING=ON
|
||||
- name: Build nghttp2
|
||||
run: |
|
||||
cmake --build build
|
||||
cmake --build build --target check
|
||||
|
||||
release:
|
||||
if: github.ref_type == 'tag'
|
||||
|
||||
needs:
|
||||
- build
|
||||
- build-cross
|
||||
- build-windows
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: recursive
|
||||
- name: Make artifacts
|
||||
run: |
|
||||
ver='${{ github.ref_name }}'
|
||||
|
||||
prev_ver=$(git tag --sort v:refname | grep -v -F "${ver}" | \
|
||||
grep 'v[0-9]\+\.[0-9]\+\.0' | tail -n1)
|
||||
|
||||
echo -n "$GPG_KEY" | gpg --batch --pinentry-mode loopback --import
|
||||
./makerelease.sh "${ver}" "${prev_ver}"
|
||||
env:
|
||||
GPG_KEY: ${{ secrets.GPG_KEY }}
|
||||
GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
|
||||
- name: Make release
|
||||
uses: actions/github-script@v8
|
||||
with:
|
||||
script: |
|
||||
const fs = require('fs')
|
||||
|
||||
let ver = '${{ github.ref_name }}'
|
||||
|
||||
let {data: release} = await github.rest.repos.createRelease({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
tag_name: ver,
|
||||
name: `nghttp2 ${ver}`,
|
||||
draft: true,
|
||||
generate_release_notes: true,
|
||||
discussion_category_name: 'Announcements',
|
||||
})
|
||||
|
||||
let v = ver.substring(1)
|
||||
|
||||
let files = [
|
||||
'checksums.txt',
|
||||
`nghttp2-${v}.tar.bz2`,
|
||||
`nghttp2-${v}.tar.bz2.asc`,
|
||||
`nghttp2-${v}.tar.gz`,
|
||||
`nghttp2-${v}.tar.gz.asc`,
|
||||
`nghttp2-${v}.tar.xz`,
|
||||
`nghttp2-${v}.tar.xz.asc`,
|
||||
]
|
||||
|
||||
await Promise.all(files.map(elem =>
|
||||
github.rest.repos.uploadReleaseAsset({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
release_id: release.id,
|
||||
name: elem,
|
||||
data: fs.readFileSync(elem),
|
||||
})
|
||||
))
|
||||
24
.github/workflows/docker.yaml
vendored
Normal file
24
.github/workflows/docker.yaml
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
name: docker-build
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- docker/Dockerfile
|
||||
branches:
|
||||
- '**'
|
||||
|
||||
permissions: read-all
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Build
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: docker
|
||||
build-args: NGHTTP2_BRANCH=${{ github.ref_name }}
|
||||
31
.github/workflows/fuzz.yml
vendored
Normal file
31
.github/workflows/fuzz.yml
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
name: CIFuzz
|
||||
on: [pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
Fuzzing:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: LLVM workaround
|
||||
run: |
|
||||
# https://github.com/actions/runner-images/issues/9491#issuecomment-1989718917
|
||||
# Asan in llvm 14 provided in ubuntu 22.04 is incompatible with
|
||||
# high-entropy ASLR in much newer kernels that GitHub runners are
|
||||
# using leading to random crashes: https://reviews.llvm.org/D148280
|
||||
sudo sysctl vm.mmap_rnd_bits=28
|
||||
- name: Build Fuzzers
|
||||
uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
|
||||
with:
|
||||
oss-fuzz-project-name: 'nghttp2'
|
||||
dry-run: false
|
||||
- name: Run Fuzzers
|
||||
uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
|
||||
with:
|
||||
oss-fuzz-project-name: 'nghttp2'
|
||||
fuzz-seconds: 600
|
||||
dry-run: false
|
||||
- name: Upload Crash
|
||||
uses: actions/upload-artifact@v5
|
||||
if: failure()
|
||||
with:
|
||||
name: artifacts
|
||||
path: ./out/artifacts
|
||||
22
.github/workflows/stale.yaml
vendored
Normal file
22
.github/workflows/stale.yaml
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
name: 'Close stale issues'
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '30 1 * * *'
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
actions: write
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- uses: actions/stale@v10
|
||||
with:
|
||||
stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
|
||||
days-before-stale: 30
|
||||
days-before-close: 7
|
||||
days-before-pr-stale: -1
|
||||
exempt-all-milestones: true
|
||||
62
.gitignore
vendored
62
.gitignore
vendored
@@ -1,14 +1,19 @@
|
||||
# emacs backup file
|
||||
*~
|
||||
*.o
|
||||
*.lo
|
||||
|
||||
# autotools
|
||||
*.la
|
||||
depcomp
|
||||
*.lo
|
||||
*.m4
|
||||
*.o
|
||||
*.pyc
|
||||
.deps/
|
||||
.libs/
|
||||
INSTALL
|
||||
Makefile
|
||||
Makefile.in
|
||||
libtool
|
||||
missing
|
||||
autom4te.cache/
|
||||
compile
|
||||
config.guess
|
||||
config.h
|
||||
config.h.in
|
||||
@@ -16,17 +21,44 @@ config.log
|
||||
config.status
|
||||
config.sub
|
||||
configure
|
||||
depcomp
|
||||
install-sh
|
||||
.deps/
|
||||
.libs
|
||||
lib/includes/nghttp2/nghttp2ver.h
|
||||
lib/libnghttp2.pc
|
||||
libtool
|
||||
ltmain.sh
|
||||
missing
|
||||
stamp-h1
|
||||
.deps/
|
||||
INSTALL
|
||||
.DS_STORE
|
||||
tests/main
|
||||
tests/failmalloc
|
||||
compile
|
||||
test-driver
|
||||
|
||||
# cmake
|
||||
CMakeCache.txt
|
||||
CMakeFiles/
|
||||
cmake_install.cmake
|
||||
install_manifest.txt
|
||||
CTestTestfile.cmake
|
||||
build.ninja
|
||||
rules.ninja
|
||||
.ninja_deps
|
||||
.ninja_log
|
||||
lib*.so
|
||||
lib*.so.*
|
||||
lib*.a
|
||||
|
||||
# generated by "make test" with cmake
|
||||
Testing/
|
||||
|
||||
# test logs generated by `make check`
|
||||
*.log
|
||||
*.trs
|
||||
|
||||
lib/MSVC_obj/
|
||||
_VC_ROOT/
|
||||
.depend.MSVC
|
||||
*.pyd
|
||||
*.egg-info/
|
||||
|
||||
# Build Directories
|
||||
build/
|
||||
|
||||
# IDEs
|
||||
cmake-*
|
||||
.idea/
|
||||
|
||||
13
.gitmodules
vendored
Normal file
13
.gitmodules
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
[submodule "third-party/mruby"]
|
||||
path = third-party/mruby
|
||||
url = https://github.com/mruby/mruby
|
||||
[submodule "third-party/neverbleed"]
|
||||
path = third-party/neverbleed
|
||||
url = https://github.com/tatsuhiro-t/neverbleed.git
|
||||
branch = nghttp2
|
||||
[submodule "tests/munit"]
|
||||
path = tests/munit
|
||||
url = https://github.com/ngtcp2/munit
|
||||
[submodule "third-party/urlparse"]
|
||||
path = third-party/urlparse
|
||||
url = https://github.com/ngtcp2/urlparse
|
||||
176
AUTHORS
176
AUTHORS
@@ -1 +1,175 @@
|
||||
Tatsuhiro Tsujikawa <t-tujikawa at users dot sourceforge dot net>
|
||||
nghttp2 project was started as a fork of spdylay project [1]. Both
|
||||
projects were started by Tatsuhiro Tsujikawa, who is still the main
|
||||
author of these projects. Meanwhile, we have many contributions, and
|
||||
we are not here without them. We sincerely thank you to all who made
|
||||
a contribution. Here is the all individuals/organizations who
|
||||
contributed to nghttp2 and spdylay project at which we forked. These
|
||||
names are retrieved from git commit log. If you have made a
|
||||
contribution, but you are missing in the list, please let us know via
|
||||
github issues [2].
|
||||
|
||||
[1] https://github.com/tatsuhiro-t/spdylay
|
||||
[2] https://github.com/nghttp2/nghttp2/issues
|
||||
|
||||
--------
|
||||
|
||||
187j3x1
|
||||
Adam Gołębiowski
|
||||
Alek Storm
|
||||
Alex Nalivko
|
||||
Alexandr Vlasov
|
||||
Alexandros Konstantinakis-Karmis
|
||||
Alexis La Goutte
|
||||
Alyssa Ross
|
||||
Amir Livneh
|
||||
Amir Pakdel
|
||||
Anders Bakken
|
||||
Andreas Pohl
|
||||
Andrew Penkrat
|
||||
Andy Davies
|
||||
Angus Gratton
|
||||
Anna Henningsen
|
||||
Ant Bryan
|
||||
Anthony Alayo
|
||||
Asra Ali
|
||||
Benedikt Christoph Wolters
|
||||
Benjamin Peterson
|
||||
Bernard Spil
|
||||
Bernhard Walle
|
||||
Brendan Heinonen
|
||||
Brian Card
|
||||
Brian Suh
|
||||
Daniel Bevenius
|
||||
Daniel Evers
|
||||
Daniel Stenberg
|
||||
Dave Reisner
|
||||
David Beitey
|
||||
David Korczynski
|
||||
David Weekly
|
||||
Deel
|
||||
Deep Chordia
|
||||
Dimitris Apostolou
|
||||
Dmitri Tikhonov
|
||||
Dmitriy Vetutnev
|
||||
Don
|
||||
Dylan Plecki
|
||||
Etienne Cimon
|
||||
Fabian Möller
|
||||
Fabian Wiesel
|
||||
Fred Sundvik
|
||||
Gabi Davar
|
||||
Gaël PORTAY
|
||||
Geoff Hill
|
||||
George Liu
|
||||
Gitai
|
||||
Google Inc.
|
||||
Hajime Fujita
|
||||
Jacky Tian
|
||||
Jacky_Yin
|
||||
Jacob Champion
|
||||
James M Snell
|
||||
Jan Kundrát
|
||||
Jan-E
|
||||
Janusz Dziemidowicz
|
||||
Jay Satiro
|
||||
Jeff 'Raid' Baitis
|
||||
Jianqing Wang
|
||||
Jim Morrison
|
||||
Jiwoo Park
|
||||
Jonas Kvinge
|
||||
Josh Braegger
|
||||
José F. Calcerrada
|
||||
Kamil Dudka
|
||||
Karthik Dasari
|
||||
Kazuho Oku
|
||||
Kenny (kang-yen) Peng
|
||||
Kenny Peng
|
||||
Kit Chan
|
||||
Kyle Schomp
|
||||
LazyHamster
|
||||
Leo Neat
|
||||
Lorenz Nickel
|
||||
Lucas Pardue
|
||||
Lukas Märdian
|
||||
MATSUMOTO Ryosuke
|
||||
Marc Bachmann
|
||||
Marcelo Trylesinski
|
||||
Mark Boddington
|
||||
Matt Rudary
|
||||
Matt Way
|
||||
Michael Kaufmann
|
||||
Mike Conlen
|
||||
Mike Frysinger
|
||||
Mike Lothian
|
||||
Nicholas Hurley
|
||||
Nora Shoemaker
|
||||
Paweł Wegner
|
||||
Pedro Santos
|
||||
Peeyush Aggarwal
|
||||
Peng-Yu Chen
|
||||
Peter Wu
|
||||
Piotr Sikora
|
||||
PufferOverflow
|
||||
Raul Gutierrez Segales
|
||||
Remo E
|
||||
Renaud
|
||||
Reza Tavakoli
|
||||
Richard Wolfert
|
||||
Rick Lei
|
||||
Ross Smith II
|
||||
Rudi Heitbaum
|
||||
Ryan Carsten Schmidt
|
||||
Ryo Ota
|
||||
Scott Mitchell
|
||||
Sebastiaan Deckers
|
||||
Sergei Trofimovich
|
||||
Sergey Fedorov
|
||||
Shelley Vohr
|
||||
Simon Frankenberger
|
||||
Simone Basso
|
||||
Soham Sinha
|
||||
Stefan Eissing
|
||||
Stephen Ludin
|
||||
Sunpoet Po-Chuan Hsieh
|
||||
Svante Signell
|
||||
Syohei YOSHIDA
|
||||
Tapanito
|
||||
Tatsuhiko Kubo
|
||||
Tatsuhiro Tsujikawa
|
||||
Thomas Devoogdt
|
||||
Tobias Geerinckx-Rice
|
||||
Tom Harwood
|
||||
Tomas Krizek
|
||||
Tomasz Buchert
|
||||
Tomasz Torcz
|
||||
Vernon Tang
|
||||
Viacheslav Biriukov
|
||||
Viktor Szakats
|
||||
Viktor Szépe
|
||||
Ville Vesilehto
|
||||
Wenfeng Liu
|
||||
William A Rowe Jr
|
||||
Xiaoguang Sun
|
||||
Zachary Turner
|
||||
Zhuoyun Wei
|
||||
acesso
|
||||
ayanamist
|
||||
bmarques1995
|
||||
bxshi
|
||||
clemahieu
|
||||
dalf
|
||||
dawg
|
||||
es
|
||||
fangdingjun
|
||||
feicong
|
||||
hrxi
|
||||
jwchoi
|
||||
kumagi
|
||||
lhuang04
|
||||
lstefani
|
||||
makovich
|
||||
mod-h2-dev
|
||||
moparisthebest
|
||||
robaho
|
||||
snnn
|
||||
yuuki-kodama
|
||||
|
||||
560
CMakeLists.txt
Normal file
560
CMakeLists.txt
Normal file
@@ -0,0 +1,560 @@
|
||||
# nghttp2 - HTTP/2 C Library
|
||||
#
|
||||
# Copyright (c) 2012, 2013, 2014, 2015 Tatsuhiro Tsujikawa
|
||||
# Copyright (c) 2016 Peter Wu <peter@lekensteyn.nl>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be
|
||||
# included in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
# XXX using 1.8.90 instead of 1.9.0-DEV
|
||||
project(nghttp2 VERSION 1.68.90 LANGUAGES C)
|
||||
|
||||
# See versioning rule:
|
||||
# https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
|
||||
set(LT_CURRENT 43)
|
||||
set(LT_REVISION 2)
|
||||
set(LT_AGE 29)
|
||||
|
||||
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
|
||||
include(Version)
|
||||
|
||||
math(EXPR LT_SOVERSION "${LT_CURRENT} - ${LT_AGE}")
|
||||
set(LT_VERSION "${LT_SOVERSION}.${LT_AGE}.${LT_REVISION}")
|
||||
set(PACKAGE_VERSION "${PROJECT_VERSION}")
|
||||
HexVersion(PACKAGE_VERSION_NUM ${PROJECT_VERSION_MAJOR} ${PROJECT_VERSION_MINOR} ${PROJECT_VERSION_PATCH})
|
||||
|
||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||
set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the build type" FORCE)
|
||||
|
||||
# Include "None" as option to disable any additional (optimization) flags,
|
||||
# relying on just CMAKE_C_FLAGS and CMAKE_CXX_FLAGS (which are empty by
|
||||
# default). These strings are presented in cmake-gui.
|
||||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
|
||||
"None" "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
|
||||
endif()
|
||||
|
||||
include(GNUInstallDirs)
|
||||
include(CMakeDependentOption)
|
||||
|
||||
# For documentation
|
||||
find_package(Python3 COMPONENTS Interpreter)
|
||||
|
||||
# Auto-detection of features that can be toggled
|
||||
if(NOT ENABLE_LIB_ONLY)
|
||||
enable_language(CXX)
|
||||
find_package(Libev 4.11)
|
||||
find_package(Libcares 1.7.5)
|
||||
find_package(ZLIB 1.2.3)
|
||||
find_package(Libbrotlienc 1.0.9)
|
||||
find_package(Libbrotlidec 1.0.9)
|
||||
endif()
|
||||
|
||||
if(WITH_WOLFSSL)
|
||||
find_package(WolfSSL 5.7.0)
|
||||
else()
|
||||
find_package(OpenSSL 1.1.1)
|
||||
endif()
|
||||
find_package(Libngtcp2 1.15.0)
|
||||
find_package(Libnghttp3 1.11.0)
|
||||
if(WITH_LIBBPF)
|
||||
find_package(Libbpf 0.7.0)
|
||||
if(NOT LIBBPF_FOUND)
|
||||
message(FATAL_ERROR "libbpf was requested (WITH_LIBBPF=1) but not found.")
|
||||
endif()
|
||||
endif()
|
||||
if((OPENSSL_FOUND OR WOLFSSL_FOUND) AND LIBEV_FOUND AND ZLIB_FOUND)
|
||||
set(ENABLE_APP_DEFAULT ON)
|
||||
else()
|
||||
set(ENABLE_APP_DEFAULT OFF)
|
||||
endif()
|
||||
find_package(Systemd 209)
|
||||
find_package(Jansson 2.5)
|
||||
set(ENABLE_HPACK_TOOLS_DEFAULT ${JANSSON_FOUND})
|
||||
# 2.0.8 is required because we use evconnlistener_set_error_cb()
|
||||
find_package(Libevent 2.0.8 COMPONENTS core extra openssl)
|
||||
set(ENABLE_EXAMPLES_DEFAULT ${LIBEVENT_OPENSSL_FOUND})
|
||||
|
||||
find_package(LibXml2 2.6.26)
|
||||
set(WITH_LIBXML2_DEFAULT ${LIBXML2_FOUND})
|
||||
find_package(Jemalloc)
|
||||
set(WITH_JEMALLOC_DEFAULT ${JEMALLOC_FOUND})
|
||||
|
||||
include(CMakeOptions.txt)
|
||||
|
||||
if(ENABLE_LIB_ONLY AND (ENABLE_APP OR ENABLE_HPACK_TOOLS OR ENABLE_EXAMPLES))
|
||||
# Remember when disabled options are disabled for later diagnostics.
|
||||
set(ENABLE_LIB_ONLY_DISABLED_OTHERS 1)
|
||||
else()
|
||||
set(ENABLE_LIB_ONLY_DISABLED_OTHERS 0)
|
||||
endif()
|
||||
if(ENABLE_LIB_ONLY)
|
||||
set(ENABLE_APP OFF)
|
||||
set(ENABLE_HPACK_TOOLS OFF)
|
||||
set(ENABLE_EXAMPLES OFF)
|
||||
endif()
|
||||
|
||||
# Do not disable assertions based on CMAKE_BUILD_TYPE.
|
||||
foreach(_build_type "Release" "MinSizeRel" "RelWithDebInfo")
|
||||
foreach(_lang C CXX)
|
||||
string(TOUPPER "CMAKE_${_lang}_FLAGS_${_build_type}" _var)
|
||||
string(REGEX REPLACE "(^| )[/-]D *NDEBUG($| )" " " ${_var} "${${_var}}")
|
||||
endforeach()
|
||||
endforeach()
|
||||
|
||||
if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
set(HINT_NORETURN "__attribute__((noreturn))")
|
||||
else()
|
||||
set(HINT_NORETURN)
|
||||
endif()
|
||||
|
||||
if(NOT ENABLE_LIB_ONLY)
|
||||
include(ExtractValidFlags)
|
||||
foreach(_cxx1x_flag -std=c++20)
|
||||
extract_valid_cxx_flags(_cxx1x_flag_supported ${_cxx1x_flag})
|
||||
if(_cxx1x_flag_supported)
|
||||
set(CXX1XCXXFLAGS ${_cxx1x_flag})
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
include(CMakePushCheckState)
|
||||
include(CheckCXXSourceCompiles)
|
||||
cmake_push_check_state()
|
||||
set(CMAKE_REQUIRED_DEFINITIONS "${CXX1XCXXFLAGS}")
|
||||
# Check that std::future is available.
|
||||
check_cxx_source_compiles("
|
||||
#include <vector>
|
||||
#include <future>
|
||||
int main() { std::vector<std::future<int>> v; }" HAVE_STD_FUTURE)
|
||||
# Check that std::chrono::time_zone is available.
|
||||
check_cxx_source_compiles("
|
||||
#include <chrono>
|
||||
int main() { auto tz = std::chrono::current_zone(); (void)tz; }" HAVE_STD_CHRONO_TIME_ZONE)
|
||||
cmake_pop_check_state()
|
||||
endif()
|
||||
|
||||
# Checks for libraries.
|
||||
# Additional libraries required for programs under src directory.
|
||||
set(APP_LIBRARIES)
|
||||
|
||||
set(CMAKE_THREAD_PREFER_PTHREAD 1)
|
||||
find_package(Threads)
|
||||
if(CMAKE_USE_PTHREADS_INIT)
|
||||
list(APPEND APP_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
|
||||
endif()
|
||||
# XXX android and C++, is this still needed in cmake?
|
||||
# case "$host" in
|
||||
# *android*)
|
||||
# android_build=yes
|
||||
# # android does not need -pthread, but needs following 3 libs for C++
|
||||
# APPLDFLAGS="$APPLDFLAGS -lstdc++ -latomic -lsupc++"
|
||||
|
||||
# dl: openssl requires libdl when it is statically linked.
|
||||
# XXX shouldn't ${CMAKE_DL_LIBS} be appended to OPENSSL_LIBRARIES instead of
|
||||
# APP_LIBRARIES if it is really specific to OpenSSL?
|
||||
|
||||
enable_testing()
|
||||
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
|
||||
|
||||
# openssl (for src)
|
||||
include(CheckSymbolExists)
|
||||
set(HAVE_OPENSSL ${OPENSSL_FOUND})
|
||||
if(NOT ENABLE_LIB_ONLY AND OPENSSL_FOUND)
|
||||
set(OPENSSL_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR})
|
||||
cmake_push_check_state()
|
||||
set(CMAKE_REQUIRED_INCLUDES "${OPENSSL_INCLUDE_DIR}")
|
||||
set(CMAKE_REQUIRED_LIBRARIES "${OPENSSL_LIBRARIES}")
|
||||
if(WIN32)
|
||||
set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}" "ws2_32" "bcrypt")
|
||||
endif()
|
||||
check_symbol_exists("LIBRESSL_VERSION_NUMBER" "openssl/opensslv.h" LIBRESSL_FOUND)
|
||||
if(ENABLE_HTTP3)
|
||||
check_symbol_exists(SSL_provide_quic_data "openssl/ssl.h" HAVE_SSL_PROVIDE_QUIC_DATA)
|
||||
if(NOT HAVE_SSL_PROVIDE_QUIC_DATA)
|
||||
check_symbol_exists(SSL_set_quic_tls_cbs "openssl/ssl.h" HAVE_SSL_SET_QUIC_TLS_CBS)
|
||||
if(NOT HAVE_SSL_SET_QUIC_TLS_CBS)
|
||||
message(WARNING "OpenSSL in ${OPENSSL_LIBRARIES} has neither SSL_provide_quic_data nor SSL_set_quic_tls_cbs. HTTP/3 support cannot be enabled")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
cmake_pop_check_state()
|
||||
else()
|
||||
set(OPENSSL_INCLUDE_DIRS "")
|
||||
set(OPENSSL_LIBRARIES "")
|
||||
endif()
|
||||
# wolfSSL (for src)
|
||||
set(HAVE_WOLFSSL ${WOLFSSL_FOUND})
|
||||
if(WOLFSSL_FOUND)
|
||||
set(WOLFSSL_INCLUDE_DIRS ${WOLFSSL_INCLUDE_DIR})
|
||||
cmake_push_check_state()
|
||||
set(CMAKE_REQUIRED_INCLUDES "${WOLFSSL_INCLUDE_DIR}")
|
||||
set(CMAKE_REQUIRED_LIBRARIES "${WOLFSSL_LIBRARIES}")
|
||||
check_symbol_exists(SSL_provide_quic_data "wolfssl/options.h;wolfssl/ssl.h" HAVE_WOLFSSL_SSL_PROVIDE_QUIC_DATA)
|
||||
if(NOT HAVE_WOLFSSL_SSL_PROVIDE_QUIC_DATA)
|
||||
message(WARNING "wolfSSL in ${WOLFSSL_LIBRARIES} does not have SSL_provide_quic_data. HTTP/3 support cannot be enabled")
|
||||
endif()
|
||||
cmake_pop_check_state()
|
||||
else()
|
||||
set(WOLFSSL_INCLUDE_DIRS "")
|
||||
set(WOLFSSL_LIBRARIES "")
|
||||
endif()
|
||||
# libev (for src)
|
||||
set(HAVE_LIBEV ${LIBEV_FOUND})
|
||||
set(HAVE_ZLIB ${ZLIB_FOUND})
|
||||
set(HAVE_SYSTEMD ${SYSTEMD_FOUND})
|
||||
set(HAVE_LIBEVENT_OPENSSL ${LIBEVENT_FOUND})
|
||||
if(LIBEVENT_FOUND)
|
||||
# Must both link the core and openssl libraries.
|
||||
set(LIBEVENT_OPENSSL_LIBRARIES ${LIBEVENT_LIBRARIES})
|
||||
endif()
|
||||
# libc-ares (for src)
|
||||
set(HAVE_LIBCARES ${LIBCARES_FOUND})
|
||||
if(LIBCARES_FOUND)
|
||||
set(LIBCARES_INCLUDE_DIRS ${LIBCARES_INCLUDE_DIR})
|
||||
else()
|
||||
set(LIBCARES_INCLUDE_DIRS "")
|
||||
set(LIBCARES_LIBRARIES "")
|
||||
endif()
|
||||
# jansson (for src/nghttp, src/deflatehd and src/inflatehd)
|
||||
set(HAVE_JANSSON ${JANSSON_FOUND})
|
||||
# libxml2 (for src/nghttp)
|
||||
set(HAVE_LIBXML2 ${LIBXML2_FOUND})
|
||||
if(LIBXML2_FOUND)
|
||||
set(LIBXML2_INCLUDE_DIRS ${LIBXML2_INCLUDE_DIR})
|
||||
else()
|
||||
set(LIBXML2_INCLUDE_DIRS "")
|
||||
set(LIBXML2_LIBRARIES "")
|
||||
endif()
|
||||
# jemalloc
|
||||
set(HAVE_JEMALLOC ${JEMALLOC_FOUND})
|
||||
|
||||
# libbrotli (for src)
|
||||
set(HAVE_LIBBROTLIENC ${LIBBROTLIENC_FOUND})
|
||||
set(HAVE_LIBBROTLIDEC ${LIBBROTLIDEC_FOUND})
|
||||
if(LIBBROTLIENC_FOUND AND LIBBROTLIDEC_FOUND)
|
||||
set(HAVE_LIBBROTLI 1)
|
||||
endif()
|
||||
|
||||
# libbpf (for bpf)
|
||||
set(HAVE_LIBBPF ${LIBBPF_FOUND})
|
||||
if(LIBBPF_FOUND)
|
||||
set(BPFCFLAGS -Wall -O2 -g)
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
# For Debian/Ubuntu
|
||||
set(EXTRABPFCFLAGS -I/usr/include/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu)
|
||||
endif()
|
||||
|
||||
check_c_source_compiles("
|
||||
#include <linux/bpf.h>
|
||||
int main() { enum bpf_stats_type foo; (void)foo; }" HAVE_BPF_STATS_TYPE)
|
||||
endif()
|
||||
|
||||
# The nghttp, nghttpd and nghttpx under src depend on zlib, OpenSSL and libev
|
||||
if(ENABLE_APP AND NOT (ZLIB_FOUND AND (OPENSSL_FOUND OR WOLFSSL_FOUND) AND LIBEV_FOUND))
|
||||
message(FATAL_ERROR "Applications were requested (ENABLE_APP=1) but dependencies are not met.")
|
||||
endif()
|
||||
|
||||
if(ENABLE_HTTP3)
|
||||
if(HAVE_SSL_PROVIDE_QUIC_DATA AND NOT LIBRESSL_FOUND)
|
||||
find_package(Libngtcp2_crypto_quictls 1.15.0)
|
||||
if(LIBNGTCP2_CRYPTO_QUICTLS_FOUND)
|
||||
set(HAVE_LIBNGTCP2_CRYPTO_QUICTLS 1)
|
||||
endif()
|
||||
elseif(HAVE_SSL_PROVIDE_QUIC_DATA AND LIBRESSL_FOUND)
|
||||
find_package(Libngtcp2_crypto_libressl 1.15.0)
|
||||
if(LIBNGTCP2_CRYPTO_LIBRESSL_FOUND)
|
||||
set(HAVE_LIBNGTCP2_CRYPTO_LIBRESSL 1)
|
||||
endif()
|
||||
elseif(HAVE_WOLFSSL_SSL_PROVIDE_QUIC_DATA)
|
||||
find_package(Libngtcp2_crypto_wolfssl 1.15.0)
|
||||
if(LIBNGTCP2_CRYPTO_WOLFSSL_FOUND)
|
||||
set(HAVE_LIBNGTCP2_CRYPTO_WOLFSSL 1)
|
||||
endif()
|
||||
elseif(HAVE_SSL_SET_QUIC_TLS_CBS)
|
||||
find_package(Libngtcp2_crypto_ossl 1.15.0)
|
||||
if(LIBNGTCP2_CRYPTO_OSSL_FOUND)
|
||||
set(HAVE_LIBNGTCP2_CRYPTO_OSSL 1)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# HTTP/3 requires libngtcp2 + nghttp3 + one of:
|
||||
#
|
||||
# - quictls/openssl + libngtcp2_crypto_quictls
|
||||
# - libressl + libngtcp2_crypto_libressl
|
||||
# - wolfSSL + libngtcp2_crypto_wolfssl
|
||||
# - openssl/openssl + libngtcp2_crypto_ossl
|
||||
if(ENABLE_HTTP3 AND NOT (LIBNGTCP2_FOUND AND LIBNGHTTP3_FOUND AND
|
||||
((HAVE_SSL_PROVIDE_QUIC_DATA AND NOT LIBRESSL_FOUND AND LIBNGTCP2_CRYPTO_QUICTLS_FOUND) OR
|
||||
(HAVE_SSL_PROVIDE_QUIC_DATA AND LIBRESSL_FOUND AND LIBNGTCP2_CRYPTO_LIBRESSL_FOUND) OR
|
||||
(HAVE_WOLFSSL_SSL_PROVIDE_QUIC_DATA AND LIBNGTCP2_CRYPTO_WOLFSSL_FOUND) OR
|
||||
(HAVE_SSL_SET_QUIC_TLS_CBS AND LIBNGTCP2_CRYPTO_OSSL_FOUND))))
|
||||
message(FATAL_ERROR "HTTP/3 was requested (ENABLE_HTTP3=1) but dependencies are not met.")
|
||||
endif()
|
||||
|
||||
# HPACK tools requires jansson
|
||||
if(ENABLE_HPACK_TOOLS AND NOT HAVE_JANSSON)
|
||||
message(FATAL_ERROR "HPACK tools were requested (ENABLE_HPACK_TOOLS=1) but dependencies are not met.")
|
||||
endif()
|
||||
|
||||
# examples
|
||||
if(ENABLE_EXAMPLES AND NOT (OPENSSL_FOUND AND LIBEVENT_OPENSSL_FOUND))
|
||||
message(FATAL_ERROR "examples were requested (ENABLE_EXAMPLES=1) but dependencies are not met.")
|
||||
endif()
|
||||
|
||||
# third-party http-parser only be built when needed
|
||||
if(ENABLE_EXAMPLES OR ENABLE_APP OR ENABLE_HPACK_TOOLS)
|
||||
set(ENABLE_THIRD_PARTY 1)
|
||||
# mruby (for src/nghttpx)
|
||||
set(HAVE_MRUBY ${WITH_MRUBY})
|
||||
set(HAVE_NEVERBLEED ${WITH_NEVERBLEED})
|
||||
else()
|
||||
set(HAVE_MRUBY 0)
|
||||
set(HAVE_NEVERBLEED 0)
|
||||
endif()
|
||||
|
||||
# Checks for header files.
|
||||
include(CheckIncludeFile)
|
||||
check_include_file("arpa/inet.h" HAVE_ARPA_INET_H)
|
||||
check_include_file("fcntl.h" HAVE_FCNTL_H)
|
||||
check_include_file("inttypes.h" HAVE_INTTYPES_H)
|
||||
check_include_file("limits.h" HAVE_LIMITS_H)
|
||||
check_include_file("netdb.h" HAVE_NETDB_H)
|
||||
check_include_file("netinet/in.h" HAVE_NETINET_IN_H)
|
||||
check_include_file("netinet/ip.h" HAVE_NETINET_IP_H)
|
||||
check_include_file("pwd.h" HAVE_PWD_H)
|
||||
check_include_file("sys/socket.h" HAVE_SYS_SOCKET_H)
|
||||
check_include_file("sys/time.h" HAVE_SYS_TIME_H)
|
||||
check_include_file("syslog.h" HAVE_SYSLOG_H)
|
||||
check_include_file("unistd.h" HAVE_UNISTD_H)
|
||||
check_include_file("windows.h" HAVE_WINDOWS_H)
|
||||
|
||||
include(CheckTypeSize)
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
# AC_TYPE_SIZE_T
|
||||
check_type_size("ssize_t" SIZEOF_SSIZE_T)
|
||||
if(SIZEOF_SSIZE_T STREQUAL "")
|
||||
# ssize_t is a signed type in POSIX storing at least -1.
|
||||
# Set it to "int" to match the behavior of AC_TYPE_SSIZE_T (autotools).
|
||||
set(ssize_t int)
|
||||
endif()
|
||||
# AC_TYPE_UINT8_T
|
||||
# AC_TYPE_UINT16_T
|
||||
# AC_TYPE_UINT32_T
|
||||
# AC_TYPE_UINT64_T
|
||||
# AC_TYPE_INT8_T
|
||||
# AC_TYPE_INT16_T
|
||||
# AC_TYPE_INT32_T
|
||||
# AC_TYPE_INT64_T
|
||||
# AC_TYPE_OFF_T
|
||||
# AC_TYPE_PID_T
|
||||
# AC_TYPE_UID_T
|
||||
# XXX To support inline for crappy compilers, see https://cmake.org/Wiki/CMakeTestInline
|
||||
# AC_C_INLINE
|
||||
# XXX is AC_SYS_LARGEFILE still needed for modern systems?
|
||||
# add_definitions(-D_FILE_OFFSET_BITS=64)
|
||||
|
||||
include(CheckStructHasMember)
|
||||
check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_STRUCT_TM_TM_GMTOFF)
|
||||
|
||||
# Checks for library functions.
|
||||
include(CheckFunctionExists)
|
||||
check_function_exists(_Exit HAVE__EXIT)
|
||||
check_function_exists(accept4 HAVE_ACCEPT4)
|
||||
check_function_exists(clock_gettime HAVE_CLOCK_GETTIME)
|
||||
check_function_exists(mkostemp HAVE_MKOSTEMP)
|
||||
check_function_exists(pipe2 HAVE_PIPE2)
|
||||
|
||||
check_symbol_exists(GetTickCount64 "windows.h;sysinfoapi.h" HAVE_GETTICKCOUNT64)
|
||||
|
||||
include(CheckSymbolExists)
|
||||
# XXX does this correctly detect initgroups (un)availability on cygwin?
|
||||
check_symbol_exists(initgroups grp.h HAVE_DECL_INITGROUPS)
|
||||
if(NOT HAVE_DECL_INITGROUPS AND HAVE_UNISTD_H)
|
||||
# FreeBSD declares initgroups() in unistd.h
|
||||
check_symbol_exists(initgroups unistd.h HAVE_DECL_INITGROUPS2)
|
||||
if(HAVE_DECL_INITGROUPS2)
|
||||
set(HAVE_DECL_INITGROUPS 1)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
check_symbol_exists(CLOCK_MONOTONIC "time.h" HAVE_DECL_CLOCK_MONOTONIC)
|
||||
|
||||
set(WARNCFLAGS)
|
||||
set(WARNCXXFLAGS)
|
||||
if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
|
||||
if(ENABLE_WERROR)
|
||||
set(WARNCFLAGS /WX)
|
||||
set(WARNCXXFLAGS /WX)
|
||||
endif()
|
||||
else()
|
||||
if(ENABLE_WERROR)
|
||||
set(WARNCFLAGS "-Werror")
|
||||
set(WARNCXXFLAGS "-Werror")
|
||||
endif()
|
||||
|
||||
include(PickyWarningsC)
|
||||
include(PickyWarningsCXX)
|
||||
endif()
|
||||
|
||||
if(ENABLE_STATIC_CRT)
|
||||
foreach(lang C CXX)
|
||||
foreach(suffix "" _DEBUG _MINSIZEREL _RELEASE _RELWITHDEBINFO)
|
||||
set(var "CMAKE_${lang}_FLAGS${suffix}")
|
||||
string(REPLACE "/MD" "/MT" ${var} "${${var}}")
|
||||
endforeach()
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
if(ENABLE_DEBUG)
|
||||
set(DEBUGBUILD 1)
|
||||
endif()
|
||||
|
||||
# Some platform does not have working std::future. We disable
|
||||
# threading for those platforms.
|
||||
if(NOT ENABLE_THREADS OR NOT HAVE_STD_FUTURE)
|
||||
set(NOTHREADS 1)
|
||||
endif()
|
||||
|
||||
add_definitions(-DHAVE_CONFIG_H)
|
||||
configure_file(cmakeconfig.h.in config.h)
|
||||
# autotools-compatible names
|
||||
# Sphinx expects relative paths in the .rst files. Use the fact that the files
|
||||
# below are all one directory level deep.
|
||||
file(RELATIVE_PATH top_srcdir "${CMAKE_CURRENT_BINARY_DIR}/dir" "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
file(RELATIVE_PATH top_builddir "${CMAKE_CURRENT_BINARY_DIR}/dir" "${CMAKE_CURRENT_BINARY_DIR}")
|
||||
set(abs_top_srcdir "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
set(abs_top_builddir "${CMAKE_CURRENT_BINARY_DIR}")
|
||||
# libnghttp2.pc (pkg-config file)
|
||||
set(prefix "${CMAKE_INSTALL_PREFIX}")
|
||||
set(exec_prefix "${CMAKE_INSTALL_PREFIX}")
|
||||
set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
|
||||
set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
|
||||
set(VERSION "${PACKAGE_VERSION}")
|
||||
# For init scripts and systemd service file (in contrib/)
|
||||
set(bindir "${CMAKE_INSTALL_FULL_BINDIR}")
|
||||
set(sbindir "${CMAKE_INSTALL_FULL_SBINDIR}")
|
||||
foreach(name
|
||||
lib/libnghttp2.pc
|
||||
lib/includes/nghttp2/nghttp2ver.h
|
||||
integration-tests/config.go
|
||||
integration-tests/setenv
|
||||
doc/conf.py
|
||||
doc/index.rst
|
||||
doc/package_README.rst
|
||||
doc/tutorial-client.rst
|
||||
doc/tutorial-server.rst
|
||||
doc/tutorial-hpack.rst
|
||||
doc/nghttpx-howto.rst
|
||||
doc/h2load-howto.rst
|
||||
doc/building-android-binary.rst
|
||||
doc/nghttp2.h.rst
|
||||
doc/nghttp2ver.h.rst
|
||||
doc/contribute.rst
|
||||
)
|
||||
configure_file("${name}.in" "${name}" @ONLY)
|
||||
endforeach()
|
||||
|
||||
if(APPLE)
|
||||
add_definitions(-D__APPLE_USE_RFC_3542)
|
||||
endif()
|
||||
|
||||
include_directories(
|
||||
"${CMAKE_CURRENT_BINARY_DIR}" # for config.h
|
||||
)
|
||||
# For use in src/CMakeLists.txt
|
||||
set(PKGDATADIR "${CMAKE_INSTALL_FULL_DATADIR}/${CMAKE_PROJECT_NAME}")
|
||||
set(PKGLIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}/${CMAKE_PROJECT_NAME}")
|
||||
|
||||
install(FILES README.rst DESTINATION "${CMAKE_INSTALL_DOCDIR}")
|
||||
|
||||
add_subdirectory(lib)
|
||||
#add_subdirectory(lib/includes)
|
||||
add_subdirectory(third-party)
|
||||
add_subdirectory(src)
|
||||
add_subdirectory(examples)
|
||||
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND BUILD_TESTING)
|
||||
add_subdirectory(tests)
|
||||
#add_subdirectory(tests/testdata)
|
||||
add_subdirectory(integration-tests)
|
||||
endif()
|
||||
if(ENABLE_DOC)
|
||||
add_subdirectory(doc)
|
||||
endif()
|
||||
add_subdirectory(contrib)
|
||||
add_subdirectory(bpf)
|
||||
|
||||
|
||||
string(TOUPPER "${CMAKE_BUILD_TYPE}" _build_type)
|
||||
message(STATUS "summary of build options:
|
||||
|
||||
Package version: ${VERSION}
|
||||
Library version: ${LT_CURRENT}:${LT_REVISION}:${LT_AGE}
|
||||
Install prefix: ${CMAKE_INSTALL_PREFIX}
|
||||
Target system: ${CMAKE_SYSTEM_NAME}
|
||||
Compiler:
|
||||
Build type: ${CMAKE_BUILD_TYPE}
|
||||
C compiler: ${CMAKE_C_COMPILER}
|
||||
CFLAGS: ${CMAKE_C_FLAGS_${_build_type}} ${CMAKE_C_FLAGS}
|
||||
C++ compiler: ${CMAKE_CXX_COMPILER}
|
||||
CXXFLAGS: ${CMAKE_CXX_FLAGS_${_build_type}} ${CMAKE_CXX_FLAGS}
|
||||
WARNCFLAGS: ${WARNCFLAGS}
|
||||
CXX1XCXXFLAGS: ${CXX1XCXXFLAGS}
|
||||
WARNCXXFLAGS: ${WARNCXXFLAGS}
|
||||
Python:
|
||||
Python: ${Python3_EXECUTABLE}
|
||||
Python3_VERSION: ${Python3_VERSION}
|
||||
Test:
|
||||
Failmalloc: ${ENABLE_FAILMALLOC}
|
||||
Build Test: ${BUILD_TESTING}
|
||||
Libs:
|
||||
OpenSSL: ${HAVE_OPENSSL} (LIBS='${OPENSSL_LIBRARIES}')
|
||||
wolfSSL: ${HAVE_WOLFSSL} (LIBS='${WOLFSSL_LIBRARIES}')
|
||||
Libxml2: ${HAVE_LIBXML2} (LIBS='${LIBXML2_LIBRARIES}')
|
||||
Libev: ${HAVE_LIBEV} (LIBS='${LIBEV_LIBRARIES}')
|
||||
Libc-ares: ${HAVE_LIBCARES} (LIBS='${LIBCARES_LIBRARIES}')
|
||||
Libngtcp2: ${HAVE_LIBNGTCP2} (LIBS='${LIBNGTCP2_LIBRARIES}')
|
||||
Libngtcp2_crypto_quictls: ${HAVE_LIBNGTCP2_CRYPTO_QUICTLS} (LIBS='${LIBNGTCP2_CRYPTO_QUICTLS_LIBRARIES}')
|
||||
Libngtcp2_crypto_libressl: ${HAVE_LIBNGTCP2_CRYPTO_LIBRESSL} (LIBS='${LIBNGTCP2_CRYPTO_LIBRESSL_LIBRARIES}')
|
||||
Libngtcp2_crypto_wolfssl: ${HAVE_LIBNGTCP2_CRYPTO_WOLFSSL} (LIBS='${LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARIES}')
|
||||
Libnghttp3: ${HAVE_LIBNGHTTP3} (LIBS='${LIBNGHTTP3_LIBRARIES}')
|
||||
Libbpf: ${HAVE_LIBBPF} (LIBS='${LIBBPF_LIBRARIES}')
|
||||
Libevent(SSL): ${HAVE_LIBEVENT_OPENSSL} (LIBS='${LIBEVENT_OPENSSL_LIBRARIES}')
|
||||
Jansson: ${HAVE_JANSSON} (LIBS='${JANSSON_LIBRARIES}')
|
||||
Jemalloc: ${HAVE_JEMALLOC} (LIBS='${JEMALLOC_LIBRARIES}')
|
||||
Zlib: ${HAVE_ZLIB} (LIBS='${ZLIB_LIBRARIES}')
|
||||
Systemd: ${HAVE_SYSTEMD} (LIBS='${SYSTEMD_LIBRARIES}')
|
||||
Libbrotlienc: ${HAVE_LIBBROTLIENC} (LIBS='${LIBBROTLIENC_LIBRARIES}')
|
||||
Libbrotlidec: ${HAVE_LIBBROTLIDEC} (LIBS='${LIBBROTLIDEC_LIBRARIES}')
|
||||
Third-party:
|
||||
http-parser: ${ENABLE_THIRD_PARTY}
|
||||
MRuby: ${HAVE_MRUBY}
|
||||
Neverbleed: ${HAVE_NEVERBLEED}
|
||||
Features:
|
||||
Applications: ${ENABLE_APP}
|
||||
HPACK tools: ${ENABLE_HPACK_TOOLS}
|
||||
Examples: ${ENABLE_EXAMPLES}
|
||||
Threading: ${ENABLE_THREADS}
|
||||
HTTP/3(EXPERIMENTAL): ${ENABLE_HTTP3}
|
||||
")
|
||||
if(ENABLE_LIB_ONLY_DISABLED_OTHERS)
|
||||
message("Only the library will be built. To build other components "
|
||||
"(such as applications and examples), set ENABLE_LIB_ONLY=OFF.")
|
||||
endif()
|
||||
30
CMakeOptions.txt
Normal file
30
CMakeOptions.txt
Normal file
@@ -0,0 +1,30 @@
|
||||
# Features that can be enabled for cmake (see CMakeLists.txt)
|
||||
|
||||
option(ENABLE_WERROR "Turn on compile time warnings")
|
||||
option(ENABLE_DEBUG "Turn on debug output")
|
||||
option(ENABLE_THREADS "Turn on threading in apps" ON)
|
||||
option(ENABLE_APP "Build applications (nghttp, nghttpd, nghttpx and h2load)"
|
||||
${ENABLE_APP_DEFAULT})
|
||||
option(ENABLE_HPACK_TOOLS "Build HPACK tools"
|
||||
${ENABLE_HPACK_TOOLS_DEFAULT})
|
||||
option(ENABLE_EXAMPLES "Build examples"
|
||||
${ENABLE_EXAMPLES_DEFAULT})
|
||||
option(ENABLE_FAILMALLOC "Build failmalloc test program" ON)
|
||||
option(ENABLE_LIB_ONLY "Build libnghttp2 only. This is a short hand for -DENABLE_APP=0 -DENABLE_EXAMPLES=0 -DENABLE_HPACK_TOOLS=0")
|
||||
option(BUILD_SHARED_LIBS "Build libnghttp2 as a shared library" ON)
|
||||
option(BUILD_STATIC_LIBS "Build libnghttp2 in static mode also" OFF)
|
||||
option(ENABLE_STATIC_CRT "Build libnghttp2 against the MS LIBCMT[d]")
|
||||
option(ENABLE_HTTP3 "Enable HTTP/3 support" OFF)
|
||||
option(ENABLE_DOC "Build documentation" ON)
|
||||
cmake_dependent_option(BUILD_TESTING "Enable tests" ON "BUILD_STATIC_LIBS" OFF)
|
||||
|
||||
option(WITH_LIBXML2 "Use libxml2"
|
||||
${WITH_LIBXML2_DEFAULT})
|
||||
option(WITH_JEMALLOC "Use jemalloc"
|
||||
${WITH_JEMALLOC_DEFAULT})
|
||||
option(WITH_MRUBY "Use mruby")
|
||||
option(WITH_NEVERBLEED "Use neverbleed")
|
||||
option(WITH_LIBBPF "Use libbpf")
|
||||
option(WITH_WOLFSSL "Use wolfSSL")
|
||||
|
||||
# vim: ft=cmake:
|
||||
18
CONTRIBUTION
Normal file
18
CONTRIBUTION
Normal file
@@ -0,0 +1,18 @@
|
||||
[The text below was composed based on 1.2. License section of
|
||||
curl/libcurl project.]
|
||||
|
||||
When contributing with code, you agree to put your changes and new
|
||||
code under the same license nghttp2 is already using unless stated and
|
||||
agreed otherwise.
|
||||
|
||||
When changing existing source code, you do not alter the copyright of
|
||||
the original file(s). The copyright will still be owned by the
|
||||
original creator(s) or those who have been assigned copyright by the
|
||||
original author(s).
|
||||
|
||||
By submitting a patch to the nghttp2 project, you are assumed to have
|
||||
the right to the code and to be allowed by your employer or whatever
|
||||
to hand over that patch/code to us. We will credit you for your
|
||||
changes as far as possible, to give credit but also to keep a trace
|
||||
back to who made what changes. Please always provide us with your
|
||||
full real name when contributing!
|
||||
3
COPYING
3
COPYING
@@ -1,6 +1,7 @@
|
||||
The MIT License
|
||||
|
||||
Copyright (c) 2012 Tatsuhiro Tsujikawa
|
||||
Copyright (c) 2012, 2014, 2015, 2016 Tatsuhiro Tsujikawa
|
||||
Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
|
||||
124
Dockerfile.android
Normal file
124
Dockerfile.android
Normal file
@@ -0,0 +1,124 @@
|
||||
# vim: ft=dockerfile:
|
||||
# Dockerfile to build nghttp2 android binary
|
||||
#
|
||||
# $ sudo docker build -t nghttp2-android - < Dockerfile.android
|
||||
#
|
||||
# After successful build, android binaries are located under
|
||||
# /root/build/nghttp2. You can copy the binary using docker cp. For
|
||||
# example, to copy nghttpx binary to host file system location
|
||||
# /path/to/dest, do this:
|
||||
#
|
||||
# $ sudo docker run -v /path/to/dest:/out nghttp2-android cp /root/build/nghttp2/src/nghttpx /out
|
||||
|
||||
|
||||
# Only use standalone-toolchain for reduce size
|
||||
FROM ubuntu:24.04
|
||||
LABEL org.opencontainers.image.authors="Tatsuhiro Tsujikawa"
|
||||
|
||||
ARG NDK_VERSION=r27c
|
||||
ARG NDK=/root/android-ndk-$NDK_VERSION
|
||||
ARG TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
|
||||
ARG TARGET=aarch64-linux-android
|
||||
ARG API=33
|
||||
ARG AR=$TOOLCHAIN/bin/llvm-ar
|
||||
ARG CC=$TOOLCHAIN/bin/$TARGET$API-clang
|
||||
ARG CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
|
||||
ARG LD=$TOOLCHAIN/bin/ld
|
||||
ARG RANDLIB=$TOOLCHAIN/bin/llvm-ranlib
|
||||
ARG STRIP=$TOOLCHAIN/bin/llvm-strip
|
||||
ARG PREFIX=/root/usr/local
|
||||
|
||||
WORKDIR /root
|
||||
RUN apt-get update && \
|
||||
apt-get install -y unzip make binutils autoconf \
|
||||
automake autotools-dev libtool pkg-config git \
|
||||
curl dpkg-dev libxml2-dev genisoimage libc6-i386 \
|
||||
lib32stdc++6 && \
|
||||
rm -rf /var/cache/apt/*
|
||||
|
||||
# Download NDK
|
||||
RUN curl -L -O https://dl.google.com/android/repository/android-ndk-$NDK_VERSION-linux.zip && \
|
||||
unzip -q android-ndk-$NDK_VERSION-linux.zip && \
|
||||
rm android-ndk-$NDK_VERSION-linux.zip
|
||||
|
||||
# Setup version of libraries
|
||||
ARG OPENSSL_VERSION=1.1.1w
|
||||
ARG LIBEV_VERSION=4.33
|
||||
ARG ZLIB_VERSION=1.3.1
|
||||
ARG CARES_VERSION=1.18.1
|
||||
ARG NGHTTP2_VERSION=master
|
||||
|
||||
WORKDIR /root/build
|
||||
RUN curl -L -O https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz && \
|
||||
tar xf openssl-$OPENSSL_VERSION.tar.gz && \
|
||||
rm openssl-$OPENSSL_VERSION.tar.gz
|
||||
|
||||
WORKDIR /root/build/openssl-$OPENSSL_VERSION
|
||||
RUN export ANDROID_NDK_HOME=$NDK PATH=$TOOLCHAIN/bin:$PATH && \
|
||||
./Configure no-shared --prefix=$PREFIX android-arm64 && \
|
||||
make && make install_sw
|
||||
|
||||
WORKDIR /root/build
|
||||
RUN curl -L -O http://dist.schmorp.de/libev/Attic/libev-$LIBEV_VERSION.tar.gz && \
|
||||
tar xf libev-$LIBEV_VERSION.tar.gz && \
|
||||
rm libev-$LIBEV_VERSION.tar.gz
|
||||
|
||||
WORKDIR /root/build/libev-$LIBEV_VERSION
|
||||
RUN ./configure \
|
||||
--disable-dependency-tracking \
|
||||
--host=$TARGET \
|
||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||
--prefix=$PREFIX \
|
||||
--disable-shared \
|
||||
--enable-static \
|
||||
CPPFLAGS=-I$PREFIX/include \
|
||||
LDFLAGS=-L$PREFIX/lib && \
|
||||
make install
|
||||
|
||||
WORKDIR /root/build
|
||||
RUN curl -L -O https://github.com/madler/zlib/releases/download/v$ZLIB_VERSION/zlib-$ZLIB_VERSION.tar.gz && \
|
||||
tar xf zlib-$ZLIB_VERSION.tar.gz && \
|
||||
rm zlib-$ZLIB_VERSION.tar.gz
|
||||
|
||||
WORKDIR /root/build/zlib-$ZLIB_VERSION
|
||||
RUN HOST=$TARGET \
|
||||
./configure \
|
||||
--prefix=$PREFIX \
|
||||
--libdir=$PREFIX/lib \
|
||||
--includedir=$PREFIX/include \
|
||||
--static && \
|
||||
make install
|
||||
|
||||
|
||||
WORKDIR /root/build
|
||||
RUN curl -L -O https://github.com/c-ares/c-ares/releases/download/cares-1_18_1/c-ares-$CARES_VERSION.tar.gz && \
|
||||
tar xf c-ares-$CARES_VERSION.tar.gz && \
|
||||
rm c-ares-$CARES_VERSION.tar.gz
|
||||
|
||||
WORKDIR /root/build/c-ares-$CARES_VERSION
|
||||
RUN ./configure \
|
||||
--disable-dependency-tracking \
|
||||
--host=$TARGET \
|
||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||
--prefix=$PREFIX \
|
||||
--disable-shared && \
|
||||
make install
|
||||
|
||||
WORKDIR /root/build
|
||||
RUN git clone --recursive --shallow-submodules https://github.com/nghttp2/nghttp2 -b $NGHTTP2_VERSION --depth 1
|
||||
WORKDIR /root/build/nghttp2
|
||||
RUN autoreconf -i && \
|
||||
./configure \
|
||||
--disable-dependency-tracking \
|
||||
--enable-app \
|
||||
--disable-shared \
|
||||
--host=$TARGET \
|
||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||
--without-libxml2 \
|
||||
--disable-examples \
|
||||
--disable-threads \
|
||||
CPPFLAGS="-fPIE -I$PREFIX/include" \
|
||||
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
|
||||
LDFLAGS="-static-libstdc++ -static-libgcc -fPIE -pie -L$PREFIX/lib" && \
|
||||
make && \
|
||||
$STRIP src/nghttpx src/nghttpd src/nghttp
|
||||
42
Makefile.am
42
Makefile.am
@@ -1,4 +1,4 @@
|
||||
# nghttp2 - HTTP/2.0 C Library
|
||||
# nghttp2 - HTTP/2 C Library
|
||||
|
||||
# Copyright (c) 2012 Tatsuhiro Tsujikawa
|
||||
|
||||
@@ -20,10 +20,46 @@
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
SUBDIRS = lib src examples tests doc
|
||||
SUBDIRS = lib tests third-party src bpf examples integration-tests \
|
||||
doc contrib
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
dist_doc_DATA = README.rst
|
||||
|
||||
EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-make
|
||||
EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-env \
|
||||
Dockerfile.android \
|
||||
cmakeconfig.h.in \
|
||||
CMakeLists.txt \
|
||||
CMakeOptions.txt \
|
||||
cmake/ExtractValidFlags.cmake \
|
||||
cmake/FindJemalloc.cmake \
|
||||
cmake/FindLibev.cmake \
|
||||
cmake/Version.cmake \
|
||||
cmake/FindLibevent.cmake \
|
||||
cmake/FindJansson.cmake \
|
||||
cmake/FindLibcares.cmake \
|
||||
cmake/FindSystemd.cmake \
|
||||
cmake/FindLibbpf.cmake \
|
||||
cmake/FindLibnghttp3.cmake \
|
||||
cmake/FindLibngtcp2.cmake \
|
||||
cmake/FindLibngtcp2_crypto_quictls.cmake \
|
||||
cmake/FindLibbrotlienc.cmake \
|
||||
cmake/FindLibbrotlidec.cmake \
|
||||
cmake/FindLibngtcp2_crypto_wolfssl.cmake \
|
||||
cmake/FindLibngtcp2_crypto_ossl.cmake \
|
||||
cmake/FindWolfSSL.cmake \
|
||||
cmake/PickyWarningsC.cmake \
|
||||
cmake/PickyWarningsCXX.cmake
|
||||
|
||||
.PHONY: clang-format
|
||||
|
||||
# Format source files using clang-format. Don't format source files
|
||||
# under third-party directory since we are not responsible for their
|
||||
# coding style.
|
||||
clang-format:
|
||||
CLANGFORMAT=`git config --get clangformat.binary`; \
|
||||
test -z $${CLANGFORMAT} && CLANGFORMAT="clang-format"; \
|
||||
$${CLANGFORMAT} -i lib/*.{c,h} lib/includes/nghttp2/*.h \
|
||||
src/*.{c,cc,h} examples/*.c \
|
||||
tests/*.{c,h} bpf/*.c fuzz/*.cc
|
||||
|
||||
1609
README.rst
1609
README.rst
File diff suppressed because it is too large
Load Diff
31
SECURITY.md
Normal file
31
SECURITY.md
Normal file
@@ -0,0 +1,31 @@
|
||||
# Security Process
|
||||
|
||||
If you find a vulnerability in our software, please report it via
|
||||
GitHub "Private vulnerability reporting" feature at
|
||||
https://github.com/nghttp2/nghttp2/security instead of submitting
|
||||
issues on github issue page. It is a standard practice not to
|
||||
disclose vulnerability information publicly until a fixed version is
|
||||
released, or mitigation is worked out.
|
||||
|
||||
If we identify that the reported issue is really a vulnerability, we
|
||||
open a new security advisory draft using [GitHub security
|
||||
feature](https://github.com/nghttp2/nghttp2/security) and discuss the
|
||||
mitigation and bug fixes there. The fixes are committed to the
|
||||
private repository.
|
||||
|
||||
We write the security advisory and get CVE number from GitHub
|
||||
privately. We also discuss the disclosure date to the public.
|
||||
|
||||
We make a new release with the fix at the same time when the
|
||||
vulnerability is disclosed to public.
|
||||
|
||||
At least 7 days before the public disclosure date, we open a new issue
|
||||
on [nghttp2 issue tracker](https://github.com/nghttp2/nghttp2/issues)
|
||||
which notifies that the upcoming release will have a security fix.
|
||||
The `SECURITY` label is attached to this kind of issue. The issue is
|
||||
not opened if a vulnerability is already disclosed, and it is publicly
|
||||
known that nghttp2 is affected by that.
|
||||
|
||||
Before few hours of new release, we merge the fixes to the master
|
||||
branch (and/or a release branch if necessary) and make a new release.
|
||||
Security advisory is disclosed on GitHub.
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# nghttp2 - HTTP/2.0 C Library
|
||||
# nghttp2 - HTTP/2 C Library
|
||||
#
|
||||
# Copyright (c) 2013 Tatsuhiro Tsujikawa
|
||||
#
|
||||
@@ -23,19 +23,15 @@
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
if [ -z "$ANDROID_HOME" ]; then
|
||||
echo 'No $ANDROID_HOME specified.'
|
||||
exit 1
|
||||
fi
|
||||
PREFIX=$ANDROID_HOME/usr/local
|
||||
TOOLCHAIN=$ANDROID_HOME/toolchain
|
||||
PATH=$TOOLCHAIN/bin:$PATH
|
||||
. ./android-env
|
||||
|
||||
./configure \
|
||||
--disable-shared \
|
||||
--host=arm-linux-androideabi \
|
||||
--host=$TARGET \
|
||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||
--with-xml-prefix="$PREFIX" \
|
||||
CPPFLAGS="-I$PREFIX/include" \
|
||||
--without-libxml2 \
|
||||
--disable-examples \
|
||||
--disable-threads \
|
||||
CPPFLAGS="-fPIE -I$PREFIX/include" \
|
||||
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
|
||||
LDFLAGS="-L$PREFIX/lib"
|
||||
LDFLAGS="-fPIE -pie -L$PREFIX/lib"
|
||||
|
||||
40
android-env
Executable file
40
android-env
Executable file
@@ -0,0 +1,40 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# nghttp2 - HTTP/2 C Library
|
||||
#
|
||||
# Copyright (c) 2022 nghttp2 contributors
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be
|
||||
# included in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
if [ -z "$NDK" ]; then
|
||||
echo 'No $NDK specified.'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
|
||||
export TARGET=aarch64-linux-android
|
||||
export API=33
|
||||
export AR=$TOOLCHAIN/bin/llvm-ar
|
||||
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
|
||||
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
|
||||
export LD=$TOOLCHAIN/bin/ld
|
||||
export RANDLIB=$TOOLCHAIN/bin/llvm-ranlib
|
||||
export STRIP=$TOOLCHAIN/bin/llvm-strip
|
||||
export PREFIX=$NDK/usr/local
|
||||
52
author.py
Executable file
52
author.py
Executable file
@@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# script to extract commit author's name from standard input. The
|
||||
# input should be <AUTHOR>:<EMAIL>, one per line.
|
||||
# This script expects the input is created by git-log command:
|
||||
#
|
||||
# git log --format=%aN:%aE
|
||||
#
|
||||
# This script removes duplicates based on email address, breaking a
|
||||
# tie with longer author name. Among the all author names extract the
|
||||
# previous step, we remove duplicate by case-insensitive match.
|
||||
#
|
||||
# So we can do this in one line:
|
||||
#
|
||||
# git log --format=%aN:%aE | sort | uniq | ./author.py > authors
|
||||
|
||||
import sys
|
||||
|
||||
edict = {}
|
||||
|
||||
for line in sys.stdin:
|
||||
author, email = line.strip().split(':', 1)
|
||||
if email in edict:
|
||||
an = edict[email]
|
||||
if len(an) < len(author) or an > author:
|
||||
sys.stderr.write(
|
||||
'eliminated {} in favor of {}\n'.format(an, author))
|
||||
edict[email] = author
|
||||
else:
|
||||
sys.stderr.write(
|
||||
'eliminated {} in favor of {}\n'.format(author, an))
|
||||
else:
|
||||
edict[email] = author
|
||||
|
||||
names = list(sorted(edict.values()))
|
||||
|
||||
ndict = {}
|
||||
|
||||
for name in names:
|
||||
lowname = name.lower()
|
||||
if lowname in ndict:
|
||||
an = ndict[lowname]
|
||||
if an > name:
|
||||
sys.stderr.write('eliminated {} in favor of {}\n'.format(an, name))
|
||||
ndict[lowname] = name
|
||||
else:
|
||||
sys.stderr.write('eliminated {} in favor of {}\n'.format(name, an))
|
||||
else:
|
||||
ndict[lowname] = name
|
||||
|
||||
for name in sorted(ndict.values()):
|
||||
print(name)
|
||||
13
bpf/CMakeLists.txt
Normal file
13
bpf/CMakeLists.txt
Normal file
@@ -0,0 +1,13 @@
|
||||
if(LIBBPF_FOUND)
|
||||
add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/reuseport_kern.o"
|
||||
COMMAND ${CMAKE_C_COMPILER} ${BPFCFLAGS} ${EXTRABPFCFLAGS} -I${LIBBPF_INCLUDE_DIRS} -target bpf -c reuseport_kern.c -o "${CMAKE_CURRENT_BINARY_DIR}/reuseport_kern.o"
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
VERBATIM)
|
||||
|
||||
add_custom_target(bpf ALL
|
||||
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/reuseport_kern.o"
|
||||
VERBATIM)
|
||||
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/reuseport_kern.o"
|
||||
DESTINATION "${CMAKE_INSTALL_LIBDIR}/${CMAKE_PROJECT_NAME}")
|
||||
endif()
|
||||
40
bpf/Makefile.am
Normal file
40
bpf/Makefile.am
Normal file
@@ -0,0 +1,40 @@
|
||||
# nghttp2 - HTTP/2 C Library
|
||||
|
||||
# Copyright (c) 2021 Tatsuhiro Tsujikawa
|
||||
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
|
||||
# The above copyright notice and this permission notice shall be
|
||||
# included in all copies or substantial portions of the Software.
|
||||
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
EXTRA_DIST = CMakeLists.txt reuseport_kern.c
|
||||
|
||||
if HAVE_LIBBPF
|
||||
|
||||
bpf_pkglibdir = $(pkglibdir)
|
||||
bpf_pkglib_DATA = reuseport_kern.o
|
||||
|
||||
all: $(builddir)/reuseport_kern.o
|
||||
|
||||
$(builddir)/reuseport_kern.o: reuseport_kern.c
|
||||
$(CC) @LIBBPF_CFLAGS@ @BPFCFLAGS@ @EXTRABPFCFLAGS@ \
|
||||
-target bpf -c $< -o $@
|
||||
|
||||
clean-local:
|
||||
-rm -f reuseport_kern.o
|
||||
|
||||
endif # HAVE_LIBBPF
|
||||
579
bpf/reuseport_kern.c
Normal file
579
bpf/reuseport_kern.c
Normal file
@@ -0,0 +1,579 @@
|
||||
/*
|
||||
* nghttp2 - HTTP/2 C Library
|
||||
*
|
||||
* Copyright (c) 2021 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include <linux/udp.h>
|
||||
#include <linux/bpf.h>
|
||||
|
||||
#include <bpf/bpf_helpers.h>
|
||||
|
||||
/*
|
||||
* How to compile:
|
||||
*
|
||||
* clang-12 -O2 -Wall -target bpf -g -c reuseport_kern.c -o reuseport_kern.o \
|
||||
* -I/path/to/kernel/include
|
||||
*
|
||||
* See
|
||||
* https://www.kernel.org/doc/Documentation/kbuild/headers_install.txt
|
||||
* how to install kernel header files.
|
||||
*/
|
||||
|
||||
/* AES_CBC_decrypt_buffer: https://github.com/kokke/tiny-AES-c
|
||||
License is Public Domain. Commit hash:
|
||||
12e7744b4919e9d55de75b7ab566326a1c8e7a67 */
|
||||
|
||||
#define AES_keyExpSize 176
|
||||
|
||||
struct AES_ctx {
|
||||
__u8 RoundKey[AES_keyExpSize];
|
||||
};
|
||||
|
||||
/* The number of columns comprising a state in AES. This is a constant
|
||||
in AES. Value=4 */
|
||||
#define Nb 4
|
||||
|
||||
#define Nr 10 /* The number of rounds in AES Cipher. */
|
||||
|
||||
/* state - array holding the intermediate results during
|
||||
decryption. */
|
||||
typedef __u8 state_t[4][4];
|
||||
|
||||
/* The lookup-tables are marked const so they can be placed in
|
||||
read-only storage instead of RAM The numbers below can be computed
|
||||
dynamically trading ROM for RAM - This can be useful in (embedded)
|
||||
bootloader applications, where ROM is often limited. */
|
||||
static const __u8 rsbox[256] = {
|
||||
0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81,
|
||||
0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e,
|
||||
0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23,
|
||||
0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66,
|
||||
0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72,
|
||||
0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65,
|
||||
0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46,
|
||||
0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a,
|
||||
0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca,
|
||||
0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91,
|
||||
0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6,
|
||||
0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
|
||||
0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f,
|
||||
0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2,
|
||||
0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8,
|
||||
0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
|
||||
0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93,
|
||||
0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb,
|
||||
0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6,
|
||||
0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d};
|
||||
|
||||
/* This function adds the round key to state. The round key is added
|
||||
to the state by an XOR function. */
|
||||
static void AddRoundKey(__u8 round, state_t *state, const __u8 *RoundKey) {
|
||||
__u8 i, j;
|
||||
for (i = 0; i < 4; ++i) {
|
||||
for (j = 0; j < 4; ++j) {
|
||||
(*state)[i][j] ^= RoundKey[(round * Nb * 4) + (i * Nb) + j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static __u8 xtime(__u8 x) { return ((x << 1) ^ (((x >> 7) & 1) * 0x1b)); }
|
||||
|
||||
#define Multiply(x, y) \
|
||||
(((y & 1) * x) ^ ((y >> 1 & 1) * xtime(x)) ^ \
|
||||
((y >> 2 & 1) * xtime(xtime(x))) ^ \
|
||||
((y >> 3 & 1) * xtime(xtime(xtime(x)))) ^ \
|
||||
((y >> 4 & 1) * xtime(xtime(xtime(xtime(x))))))
|
||||
|
||||
#define getSBoxInvert(num) (rsbox[(num)])
|
||||
|
||||
/* MixColumns function mixes the columns of the state matrix. The
|
||||
method used to multiply may be difficult to understand for the
|
||||
inexperienced. Please use the references to gain more
|
||||
information. */
|
||||
static void InvMixColumns(state_t *state) {
|
||||
int i;
|
||||
__u8 a, b, c, d;
|
||||
for (i = 0; i < 4; ++i) {
|
||||
a = (*state)[i][0];
|
||||
b = (*state)[i][1];
|
||||
c = (*state)[i][2];
|
||||
d = (*state)[i][3];
|
||||
|
||||
(*state)[i][0] = Multiply(a, 0x0e) ^ Multiply(b, 0x0b) ^ Multiply(c, 0x0d) ^
|
||||
Multiply(d, 0x09);
|
||||
(*state)[i][1] = Multiply(a, 0x09) ^ Multiply(b, 0x0e) ^ Multiply(c, 0x0b) ^
|
||||
Multiply(d, 0x0d);
|
||||
(*state)[i][2] = Multiply(a, 0x0d) ^ Multiply(b, 0x09) ^ Multiply(c, 0x0e) ^
|
||||
Multiply(d, 0x0b);
|
||||
(*state)[i][3] = Multiply(a, 0x0b) ^ Multiply(b, 0x0d) ^ Multiply(c, 0x09) ^
|
||||
Multiply(d, 0x0e);
|
||||
}
|
||||
}
|
||||
|
||||
extern __u32 LINUX_KERNEL_VERSION __kconfig;
|
||||
|
||||
/* The SubBytes Function Substitutes the values in the state matrix
|
||||
with values in an S-box. */
|
||||
static void InvSubBytes(state_t *state) {
|
||||
__u8 i, j;
|
||||
if (LINUX_KERNEL_VERSION < KERNEL_VERSION(5, 10, 0)) {
|
||||
for (i = 0; i < 4; ++i) {
|
||||
for (j = 0; j < 4; ++j) {
|
||||
/* Ubuntu 20.04 LTS kernel 5.4.0 needs this workaround
|
||||
otherwise "math between map_value pointer and register with
|
||||
unbounded min value is not allowed". 5.10.0 is a kernel
|
||||
version that works but it might not be the minimum
|
||||
version. */
|
||||
__u8 k = (*state)[j][i];
|
||||
(*state)[j][i] = k ? getSBoxInvert(k) : getSBoxInvert(0);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < 4; ++i) {
|
||||
for (j = 0; j < 4; ++j) {
|
||||
(*state)[j][i] = getSBoxInvert((*state)[j][i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void InvShiftRows(state_t *state) {
|
||||
__u8 temp;
|
||||
|
||||
/* Rotate first row 1 columns to right */
|
||||
temp = (*state)[3][1];
|
||||
(*state)[3][1] = (*state)[2][1];
|
||||
(*state)[2][1] = (*state)[1][1];
|
||||
(*state)[1][1] = (*state)[0][1];
|
||||
(*state)[0][1] = temp;
|
||||
|
||||
/* Rotate second row 2 columns to right */
|
||||
temp = (*state)[0][2];
|
||||
(*state)[0][2] = (*state)[2][2];
|
||||
(*state)[2][2] = temp;
|
||||
|
||||
temp = (*state)[1][2];
|
||||
(*state)[1][2] = (*state)[3][2];
|
||||
(*state)[3][2] = temp;
|
||||
|
||||
/* Rotate third row 3 columns to right */
|
||||
temp = (*state)[0][3];
|
||||
(*state)[0][3] = (*state)[1][3];
|
||||
(*state)[1][3] = (*state)[2][3];
|
||||
(*state)[2][3] = (*state)[3][3];
|
||||
(*state)[3][3] = temp;
|
||||
}
|
||||
|
||||
static void InvCipher(state_t *state, const __u8 *RoundKey) {
|
||||
/* Add the First round key to the state before starting the
|
||||
rounds. */
|
||||
AddRoundKey(Nr, state, RoundKey);
|
||||
|
||||
/* There will be Nr rounds. The first Nr-1 rounds are identical.
|
||||
These Nr rounds are executed in the loop below. Last one without
|
||||
InvMixColumn() */
|
||||
InvShiftRows(state);
|
||||
InvSubBytes(state);
|
||||
AddRoundKey(Nr - 1, state, RoundKey);
|
||||
InvMixColumns(state);
|
||||
|
||||
InvShiftRows(state);
|
||||
InvSubBytes(state);
|
||||
AddRoundKey(Nr - 2, state, RoundKey);
|
||||
InvMixColumns(state);
|
||||
|
||||
InvShiftRows(state);
|
||||
InvSubBytes(state);
|
||||
AddRoundKey(Nr - 3, state, RoundKey);
|
||||
InvMixColumns(state);
|
||||
|
||||
InvShiftRows(state);
|
||||
InvSubBytes(state);
|
||||
AddRoundKey(Nr - 4, state, RoundKey);
|
||||
InvMixColumns(state);
|
||||
|
||||
InvShiftRows(state);
|
||||
InvSubBytes(state);
|
||||
AddRoundKey(Nr - 5, state, RoundKey);
|
||||
InvMixColumns(state);
|
||||
|
||||
InvShiftRows(state);
|
||||
InvSubBytes(state);
|
||||
AddRoundKey(Nr - 6, state, RoundKey);
|
||||
InvMixColumns(state);
|
||||
|
||||
InvShiftRows(state);
|
||||
InvSubBytes(state);
|
||||
AddRoundKey(Nr - 7, state, RoundKey);
|
||||
InvMixColumns(state);
|
||||
|
||||
InvShiftRows(state);
|
||||
InvSubBytes(state);
|
||||
AddRoundKey(Nr - 8, state, RoundKey);
|
||||
InvMixColumns(state);
|
||||
|
||||
InvShiftRows(state);
|
||||
InvSubBytes(state);
|
||||
AddRoundKey(Nr - 9, state, RoundKey);
|
||||
InvMixColumns(state);
|
||||
|
||||
InvShiftRows(state);
|
||||
InvSubBytes(state);
|
||||
AddRoundKey(Nr - 10, state, RoundKey);
|
||||
}
|
||||
|
||||
static void AES_ECB_decrypt(const struct AES_ctx *ctx, __u8 *buf) {
|
||||
/* The next function call decrypts the PlainText with the Key using
|
||||
AES algorithm. */
|
||||
InvCipher((state_t *)buf, ctx->RoundKey);
|
||||
}
|
||||
|
||||
/* rol32: From linux kernel source code */
|
||||
|
||||
/**
|
||||
* rol32 - rotate a 32-bit value left
|
||||
* @word: value to rotate
|
||||
* @shift: bits to roll
|
||||
*/
|
||||
static inline __u32 rol32(__u32 word, unsigned int shift) {
|
||||
return (word << shift) | (word >> ((-shift) & 31));
|
||||
}
|
||||
|
||||
/* jhash.h: Jenkins hash support.
|
||||
*
|
||||
* Copyright (C) 2006. Bob Jenkins (bob_jenkins@burtleburtle.net)
|
||||
*
|
||||
* https://burtleburtle.net/bob/hash/
|
||||
*
|
||||
* These are the credits from Bob's sources:
|
||||
*
|
||||
* lookup3.c, by Bob Jenkins, May 2006, Public Domain.
|
||||
*
|
||||
* These are functions for producing 32-bit hashes for hash table lookup.
|
||||
* hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final()
|
||||
* are externally useful functions. Routines to test the hash are included
|
||||
* if SELF_TEST is defined. You can use this free for any purpose. It's in
|
||||
* the public domain. It has no warranty.
|
||||
*
|
||||
* Copyright (C) 2009-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu)
|
||||
*
|
||||
* I've modified Bob's hash to be useful in the Linux kernel, and
|
||||
* any bugs present are my fault.
|
||||
* Jozsef
|
||||
*/
|
||||
|
||||
/* __jhash_final - final mixing of 3 32-bit values (a,b,c) into c */
|
||||
#define __jhash_final(a, b, c) \
|
||||
{ \
|
||||
c ^= b; \
|
||||
c -= rol32(b, 14); \
|
||||
a ^= c; \
|
||||
a -= rol32(c, 11); \
|
||||
b ^= a; \
|
||||
b -= rol32(a, 25); \
|
||||
c ^= b; \
|
||||
c -= rol32(b, 16); \
|
||||
a ^= c; \
|
||||
a -= rol32(c, 4); \
|
||||
b ^= a; \
|
||||
b -= rol32(a, 14); \
|
||||
c ^= b; \
|
||||
c -= rol32(b, 24); \
|
||||
}
|
||||
|
||||
/* __jhash_nwords - hash exactly 3, 2 or 1 word(s) */
|
||||
static inline __u32 __jhash_nwords(__u32 a, __u32 b, __u32 c, __u32 initval) {
|
||||
a += initval;
|
||||
b += initval;
|
||||
c += initval;
|
||||
|
||||
__jhash_final(a, b, c);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
/* An arbitrary initial parameter */
|
||||
#define JHASH_INITVAL 0xdeadbeef
|
||||
|
||||
static inline __u32 jhash_2words(__u32 a, __u32 b, __u32 initval) {
|
||||
return __jhash_nwords(a, b, 0, initval + JHASH_INITVAL + (2 << 2));
|
||||
}
|
||||
|
||||
struct {
|
||||
__uint(type, BPF_MAP_TYPE_HASH);
|
||||
__uint(max_entries, 255);
|
||||
__type(key, __u64);
|
||||
__type(value, __u32);
|
||||
} worker_id_map SEC(".maps");
|
||||
|
||||
struct {
|
||||
__uint(type, BPF_MAP_TYPE_REUSEPORT_SOCKARRAY);
|
||||
__uint(max_entries, 255);
|
||||
__type(key, __u32);
|
||||
__type(value, __u32);
|
||||
} reuseport_array SEC(".maps");
|
||||
|
||||
struct {
|
||||
__uint(type, BPF_MAP_TYPE_ARRAY);
|
||||
__uint(max_entries, 1);
|
||||
__type(key, __u32);
|
||||
__type(value, __u64);
|
||||
} sk_info SEC(".maps");
|
||||
|
||||
struct {
|
||||
__uint(type, BPF_MAP_TYPE_ARRAY);
|
||||
__uint(max_entries, 1);
|
||||
__type(key, __u32);
|
||||
__type(value, struct AES_ctx);
|
||||
} aes_key SEC(".maps");
|
||||
|
||||
typedef struct quic_hd {
|
||||
__u8 *dcid;
|
||||
__u32 dcidlen;
|
||||
__u32 dcid_offset;
|
||||
__u8 type;
|
||||
} quic_hd;
|
||||
|
||||
#define SV_DCIDLEN 17
|
||||
#define MAX_DCIDLEN 20
|
||||
#define MIN_DCIDLEN 8
|
||||
#define WORKER_IDLEN 8
|
||||
#define WORKER_ID_OFFSET 1
|
||||
|
||||
enum {
|
||||
NGTCP2_PKT_INITIAL = 0x0,
|
||||
NGTCP2_PKT_0RTT = 0x1,
|
||||
NGTCP2_PKT_HANDSHAKE = 0x2,
|
||||
NGTCP2_PKT_SHORT = 0x40,
|
||||
};
|
||||
|
||||
static inline int parse_quic(quic_hd *qhd, __u8 *data, __u8 *data_end) {
|
||||
__u8 *p;
|
||||
__u64 dcidlen;
|
||||
|
||||
if (*data & 0x80) {
|
||||
p = data + 1 + 4;
|
||||
|
||||
/* Do not check the actual DCID length because we might not buffer
|
||||
entire DCID here. */
|
||||
dcidlen = *p;
|
||||
|
||||
if (dcidlen > MAX_DCIDLEN || dcidlen < MIN_DCIDLEN) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
++p;
|
||||
|
||||
qhd->type = (*data & 0x30) >> 4;
|
||||
qhd->dcid = p;
|
||||
qhd->dcidlen = dcidlen;
|
||||
qhd->dcid_offset = 6;
|
||||
} else {
|
||||
qhd->type = NGTCP2_PKT_SHORT;
|
||||
qhd->dcid = data + 1;
|
||||
qhd->dcidlen = SV_DCIDLEN;
|
||||
qhd->dcid_offset = 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __u32 hash(const __u8 *data, __u32 datalen, __u32 initval) {
|
||||
__u32 a, b;
|
||||
|
||||
a = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];
|
||||
b = (data[4] << 24) | (data[5] << 16) | (data[6] << 8) | data[7];
|
||||
|
||||
return jhash_2words(a, b, initval);
|
||||
}
|
||||
|
||||
static __u32 sk_index_from_dcid(const quic_hd *qhd,
|
||||
const struct sk_reuseport_md *reuse_md,
|
||||
__u64 num_socks) {
|
||||
__u32 len = qhd->dcidlen;
|
||||
__u32 h = reuse_md->hash;
|
||||
__u8 hbuf[8];
|
||||
|
||||
if (len > 16) {
|
||||
__builtin_memset(hbuf, 0, sizeof(hbuf));
|
||||
|
||||
switch (len) {
|
||||
case 20:
|
||||
__builtin_memcpy(hbuf, qhd->dcid + 16, 4);
|
||||
break;
|
||||
case 19:
|
||||
__builtin_memcpy(hbuf, qhd->dcid + 16, 3);
|
||||
break;
|
||||
case 18:
|
||||
__builtin_memcpy(hbuf, qhd->dcid + 16, 2);
|
||||
break;
|
||||
case 17:
|
||||
__builtin_memcpy(hbuf, qhd->dcid + 16, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
h = hash(hbuf, sizeof(hbuf), h);
|
||||
len = 16;
|
||||
}
|
||||
|
||||
if (len > 8) {
|
||||
__builtin_memset(hbuf, 0, sizeof(hbuf));
|
||||
|
||||
switch (len) {
|
||||
case 16:
|
||||
__builtin_memcpy(hbuf, qhd->dcid + 8, 8);
|
||||
break;
|
||||
case 15:
|
||||
__builtin_memcpy(hbuf, qhd->dcid + 8, 7);
|
||||
break;
|
||||
case 14:
|
||||
__builtin_memcpy(hbuf, qhd->dcid + 8, 6);
|
||||
break;
|
||||
case 13:
|
||||
__builtin_memcpy(hbuf, qhd->dcid + 8, 5);
|
||||
break;
|
||||
case 12:
|
||||
__builtin_memcpy(hbuf, qhd->dcid + 8, 4);
|
||||
break;
|
||||
case 11:
|
||||
__builtin_memcpy(hbuf, qhd->dcid + 8, 3);
|
||||
break;
|
||||
case 10:
|
||||
__builtin_memcpy(hbuf, qhd->dcid + 8, 2);
|
||||
break;
|
||||
case 9:
|
||||
__builtin_memcpy(hbuf, qhd->dcid + 8, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
h = hash(hbuf, sizeof(hbuf), h);
|
||||
len = 8;
|
||||
}
|
||||
|
||||
return hash(qhd->dcid, len, h) % num_socks;
|
||||
}
|
||||
|
||||
SEC("sk_reuseport")
|
||||
int select_reuseport(struct sk_reuseport_md *reuse_md) {
|
||||
__u32 sk_index, *psk_index;
|
||||
__u64 *pnum_socks;
|
||||
__u32 zero = 0;
|
||||
int rv;
|
||||
quic_hd qhd;
|
||||
__u8 qpktbuf[6 + MAX_DCIDLEN];
|
||||
struct AES_ctx *aes_ctx;
|
||||
__u8 *worker_id;
|
||||
__u16 remote_port;
|
||||
__u8 *data = reuse_md->data;
|
||||
|
||||
/* Packets less than 22 bytes never be a valid QUIC packet. */
|
||||
if (reuse_md->len < sizeof(struct udphdr) + 22) {
|
||||
return SK_DROP;
|
||||
}
|
||||
|
||||
if (reuse_md->data + sizeof(struct udphdr) > reuse_md->data_end) {
|
||||
return SK_DROP;
|
||||
}
|
||||
|
||||
remote_port = (data[0] << 8) + data[1];
|
||||
|
||||
switch (remote_port) {
|
||||
case 1900:
|
||||
case 5353:
|
||||
case 11211:
|
||||
case 20800:
|
||||
case 27015:
|
||||
return SK_DROP;
|
||||
default:
|
||||
if (remote_port < 1024) {
|
||||
return SK_DROP;
|
||||
}
|
||||
}
|
||||
|
||||
if (bpf_skb_load_bytes(reuse_md, sizeof(struct udphdr), qpktbuf,
|
||||
sizeof(qpktbuf)) != 0) {
|
||||
return SK_DROP;
|
||||
}
|
||||
|
||||
pnum_socks = bpf_map_lookup_elem(&sk_info, &zero);
|
||||
if (pnum_socks == NULL) {
|
||||
return SK_DROP;
|
||||
}
|
||||
|
||||
aes_ctx = bpf_map_lookup_elem(&aes_key, &zero);
|
||||
if (aes_ctx == NULL) {
|
||||
return SK_DROP;
|
||||
}
|
||||
|
||||
rv = parse_quic(&qhd, qpktbuf, qpktbuf + sizeof(qpktbuf));
|
||||
if (rv != 0) {
|
||||
return SK_DROP;
|
||||
}
|
||||
|
||||
switch (qhd.type) {
|
||||
case NGTCP2_PKT_INITIAL:
|
||||
case NGTCP2_PKT_0RTT:
|
||||
if (qhd.dcidlen == SV_DCIDLEN) {
|
||||
worker_id = qhd.dcid + WORKER_ID_OFFSET;
|
||||
AES_ECB_decrypt(aes_ctx, worker_id);
|
||||
|
||||
psk_index = bpf_map_lookup_elem(&worker_id_map, worker_id);
|
||||
if (psk_index != NULL) {
|
||||
sk_index = *psk_index;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
sk_index = sk_index_from_dcid(&qhd, reuse_md, *pnum_socks);
|
||||
|
||||
break;
|
||||
case NGTCP2_PKT_HANDSHAKE:
|
||||
case NGTCP2_PKT_SHORT:
|
||||
if (qhd.dcidlen != SV_DCIDLEN) {
|
||||
return SK_DROP;
|
||||
}
|
||||
|
||||
worker_id = qhd.dcid + WORKER_ID_OFFSET;
|
||||
AES_ECB_decrypt(aes_ctx, worker_id);
|
||||
|
||||
psk_index = bpf_map_lookup_elem(&worker_id_map, worker_id);
|
||||
if (psk_index == NULL) {
|
||||
sk_index = sk_index_from_dcid(&qhd, reuse_md, *pnum_socks);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
sk_index = *psk_index;
|
||||
|
||||
break;
|
||||
default:
|
||||
return SK_DROP;
|
||||
}
|
||||
|
||||
rv = bpf_sk_select_reuseport(reuse_md, &reuseport_array, &sk_index, 0);
|
||||
if (rv != 0) {
|
||||
return SK_DROP;
|
||||
}
|
||||
|
||||
return SK_PASS;
|
||||
}
|
||||
31
cmake/ExtractValidFlags.cmake
Normal file
31
cmake/ExtractValidFlags.cmake
Normal file
@@ -0,0 +1,31 @@
|
||||
# Convenience function that checks the availability of certain
|
||||
# C or C++ compiler flags and returns valid ones as a string.
|
||||
|
||||
include(CheckCCompilerFlag)
|
||||
include(CheckCXXCompilerFlag)
|
||||
|
||||
function(extract_valid_c_flags varname)
|
||||
set(valid_flags)
|
||||
foreach(flag IN LISTS ARGN)
|
||||
string(REGEX REPLACE "[^a-zA-Z0-9_]+" "_" flag_var ${flag})
|
||||
set(flag_var "C_FLAG_${flag_var}")
|
||||
check_c_compiler_flag("${flag}" "${flag_var}")
|
||||
if(${flag_var})
|
||||
set(valid_flags "${valid_flags} ${flag}")
|
||||
endif()
|
||||
endforeach()
|
||||
set(${varname} "${valid_flags}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(extract_valid_cxx_flags varname)
|
||||
set(valid_flags)
|
||||
foreach(flag IN LISTS ARGN)
|
||||
string(REGEX REPLACE "[^a-zA-Z0-9_]+" "_" flag_var ${flag})
|
||||
set(flag_var "CXX_FLAG_${flag_var}")
|
||||
check_cxx_compiler_flag("${flag}" "${flag_var}")
|
||||
if(${flag_var})
|
||||
set(valid_flags "${valid_flags} ${flag}")
|
||||
endif()
|
||||
endforeach()
|
||||
set(${varname} "${valid_flags}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
40
cmake/FindJansson.cmake
Normal file
40
cmake/FindJansson.cmake
Normal file
@@ -0,0 +1,40 @@
|
||||
# - Try to find jansson
|
||||
# Once done this will define
|
||||
# JANSSON_FOUND - System has jansson
|
||||
# JANSSON_INCLUDE_DIRS - The jansson include directories
|
||||
# JANSSON_LIBRARIES - The libraries needed to use jansson
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_JANSSON QUIET jansson)
|
||||
|
||||
find_path(JANSSON_INCLUDE_DIR
|
||||
NAMES jansson.h
|
||||
HINTS ${PC_JANSSON_INCLUDE_DIRS}
|
||||
)
|
||||
find_library(JANSSON_LIBRARY
|
||||
NAMES jansson
|
||||
HINTS ${PC_JANSSON_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
if(JANSSON_INCLUDE_DIR)
|
||||
set(_version_regex "^#define[ \t]+JANSSON_VERSION[ \t]+\"([^\"]+)\".*")
|
||||
file(STRINGS "${JANSSON_INCLUDE_DIR}/jansson.h"
|
||||
JANSSON_VERSION REGEX "${_version_regex}")
|
||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
||||
JANSSON_VERSION "${JANSSON_VERSION}")
|
||||
unset(_version_regex)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set JANSSON_FOUND to TRUE
|
||||
# if all listed variables are TRUE and the requested version matches.
|
||||
find_package_handle_standard_args(Jansson REQUIRED_VARS
|
||||
JANSSON_LIBRARY JANSSON_INCLUDE_DIR
|
||||
VERSION_VAR JANSSON_VERSION)
|
||||
|
||||
if(JANSSON_FOUND)
|
||||
set(JANSSON_LIBRARIES ${JANSSON_LIBRARY})
|
||||
set(JANSSON_INCLUDE_DIRS ${JANSSON_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(JANSSON_INCLUDE_DIR JANSSON_LIBRARY)
|
||||
40
cmake/FindJemalloc.cmake
Normal file
40
cmake/FindJemalloc.cmake
Normal file
@@ -0,0 +1,40 @@
|
||||
# - Try to find jemalloc
|
||||
# Once done this will define
|
||||
# JEMALLOC_FOUND - System has jemalloc
|
||||
# JEMALLOC_INCLUDE_DIRS - The jemalloc include directories
|
||||
# JEMALLOC_LIBRARIES - The libraries needed to use jemalloc
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_JEMALLOC QUIET jemalloc)
|
||||
|
||||
find_path(JEMALLOC_INCLUDE_DIR
|
||||
NAMES jemalloc/jemalloc.h
|
||||
HINTS ${PC_JEMALLOC_INCLUDE_DIRS}
|
||||
)
|
||||
find_library(JEMALLOC_LIBRARY
|
||||
NAMES jemalloc
|
||||
HINTS ${PC_JEMALLOC_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
if(JEMALLOC_INCLUDE_DIR)
|
||||
set(_version_regex "^#define[ \t]+JEMALLOC_VERSION[ \t]+\"([^\"]+)\".*")
|
||||
file(STRINGS "${JEMALLOC_INCLUDE_DIR}/jemalloc/jemalloc.h"
|
||||
JEMALLOC_VERSION REGEX "${_version_regex}")
|
||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
||||
JEMALLOC_VERSION "${JEMALLOC_VERSION}")
|
||||
unset(_version_regex)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set JEMALLOC_FOUND to TRUE
|
||||
# if all listed variables are TRUE and the requested version matches.
|
||||
find_package_handle_standard_args(Jemalloc REQUIRED_VARS
|
||||
JEMALLOC_LIBRARY JEMALLOC_INCLUDE_DIR
|
||||
VERSION_VAR JEMALLOC_VERSION)
|
||||
|
||||
if(JEMALLOC_FOUND)
|
||||
set(JEMALLOC_LIBRARIES ${JEMALLOC_LIBRARY})
|
||||
set(JEMALLOC_INCLUDE_DIRS ${JEMALLOC_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(JEMALLOC_INCLUDE_DIR JEMALLOC_LIBRARY)
|
||||
32
cmake/FindLibbpf.cmake
Normal file
32
cmake/FindLibbpf.cmake
Normal file
@@ -0,0 +1,32 @@
|
||||
# - Try to find libbpf
|
||||
# Once done this will define
|
||||
# LIBBPF_FOUND - System has libbpf
|
||||
# LIBBPF_INCLUDE_DIRS - The libbpf include directories
|
||||
# LIBBPF_LIBRARIES - The libraries needed to use libbpf
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_LIBBPF QUIET libbpf)
|
||||
|
||||
find_path(LIBBPF_INCLUDE_DIR
|
||||
NAMES bpf/bpf.h
|
||||
HINTS ${PC_LIBBPF_INCLUDE_DIRS}
|
||||
)
|
||||
find_library(LIBBPF_LIBRARY
|
||||
NAMES bpf
|
||||
HINTS ${PC_LIBBPF_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set LIBBPF_FOUND
|
||||
# to TRUE if all listed variables are TRUE and the requested version
|
||||
# matches.
|
||||
find_package_handle_standard_args(Libbpf REQUIRED_VARS
|
||||
LIBBPF_LIBRARY LIBBPF_INCLUDE_DIR
|
||||
VERSION_VAR LIBBPF_VERSION)
|
||||
|
||||
if(LIBBPF_FOUND)
|
||||
set(LIBBPF_LIBRARIES ${LIBBPF_LIBRARY})
|
||||
set(LIBBPF_INCLUDE_DIRS ${LIBBPF_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(LIBBPF_INCLUDE_DIR LIBBPF_LIBRARY)
|
||||
36
cmake/FindLibbrotlidec.cmake
Normal file
36
cmake/FindLibbrotlidec.cmake
Normal file
@@ -0,0 +1,36 @@
|
||||
# - Try to find libbrotlidec
|
||||
# Once done this will define
|
||||
# LIBBROTLIDEC_FOUND - System has libbrotlidec
|
||||
# LIBBROTLIDEC_INCLUDE_DIRS - The libbrotlidec include directories
|
||||
# LIBBROTLIDEC_LIBRARIES - The libraries needed to use libbrotlidec
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_LIBBROTLIDEC QUIET libbrotlidec)
|
||||
|
||||
find_path(LIBBROTLIDEC_INCLUDE_DIR
|
||||
NAMES brotli/decode.h
|
||||
HINTS ${PC_LIBBROTLIDEC_INCLUDE_DIRS}
|
||||
)
|
||||
find_library(LIBBROTLIDEC_LIBRARY
|
||||
NAMES brotlidec
|
||||
HINTS ${PC_LIBBROTLIDEC_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
if(PC_LIBBROTLIDEC_FOUND)
|
||||
set(LIBBROTLIDEC_VERSION ${PC_LIBBROTLIDEC_VERSION})
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set LIBBROTLIDEC_FOUND
|
||||
# to TRUE if all listed variables are TRUE and the requested version
|
||||
# matches.
|
||||
find_package_handle_standard_args(Libbrotlidec REQUIRED_VARS
|
||||
LIBBROTLIDEC_LIBRARY LIBBROTLIDEC_INCLUDE_DIR
|
||||
VERSION_VAR LIBBROTLIDEC_VERSION)
|
||||
|
||||
if(LIBBROTLIDEC_FOUND)
|
||||
set(LIBBROTLIDEC_LIBRARIES ${LIBBROTLIDEC_LIBRARY})
|
||||
set(LIBBROTLIDEC_INCLUDE_DIRS ${LIBBROTLIDEC_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(LIBBROTLIDEC_INCLUDE_DIR LIBBROTLIDEC_LIBRARY)
|
||||
36
cmake/FindLibbrotlienc.cmake
Normal file
36
cmake/FindLibbrotlienc.cmake
Normal file
@@ -0,0 +1,36 @@
|
||||
# - Try to find libbrotlienc
|
||||
# Once done this will define
|
||||
# LIBBROTLIENC_FOUND - System has libbrotlienc
|
||||
# LIBBROTLIENC_INCLUDE_DIRS - The libbrotlienc include directories
|
||||
# LIBBROTLIENC_LIBRARIES - The libraries needed to use libbrotlienc
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_LIBBROTLIENC QUIET libbrotlienc)
|
||||
|
||||
find_path(LIBBROTLIENC_INCLUDE_DIR
|
||||
NAMES brotli/encode.h
|
||||
HINTS ${PC_LIBBROTLIENC_INCLUDE_DIRS}
|
||||
)
|
||||
find_library(LIBBROTLIENC_LIBRARY
|
||||
NAMES brotlienc
|
||||
HINTS ${PC_LIBBROTLIENC_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
if(PC_LIBBROTLIENC_FOUND)
|
||||
set(LIBBROTLIENC_VERSION ${PC_LIBBROTLIENC_VERSION})
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set LIBBROTLIENC_FOUND
|
||||
# to TRUE if all listed variables are TRUE and the requested version
|
||||
# matches.
|
||||
find_package_handle_standard_args(Libbrotlienc REQUIRED_VARS
|
||||
LIBBROTLIENC_LIBRARY LIBBROTLIENC_INCLUDE_DIR
|
||||
VERSION_VAR LIBBROTLIENC_VERSION)
|
||||
|
||||
if(LIBBROTLIENC_FOUND)
|
||||
set(LIBBROTLIENC_LIBRARIES ${LIBBROTLIENC_LIBRARY})
|
||||
set(LIBBROTLIENC_INCLUDE_DIRS ${LIBBROTLIENC_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(LIBBROTLIENC_INCLUDE_DIR LIBBROTLIENC_LIBRARY)
|
||||
46
cmake/FindLibcares.cmake
Normal file
46
cmake/FindLibcares.cmake
Normal file
@@ -0,0 +1,46 @@
|
||||
# - Try to find libcares
|
||||
# Once done this will define
|
||||
# LIBCARES_FOUND - System has libcares
|
||||
# LIBCARES_INCLUDE_DIRS - The libcares include directories
|
||||
# LIBCARES_LIBRARIES - The libraries needed to use libcares
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_LIBCARES QUIET libcares)
|
||||
|
||||
find_path(LIBCARES_INCLUDE_DIR
|
||||
NAMES ares.h
|
||||
HINTS ${PC_LIBCARES_INCLUDE_DIRS}
|
||||
)
|
||||
find_library(LIBCARES_LIBRARY
|
||||
NAMES cares
|
||||
HINTS ${PC_LIBCARES_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
if(LIBCARES_INCLUDE_DIR)
|
||||
file(READ "${LIBCARES_INCLUDE_DIR}/ares_version.h" _ares_version_h)
|
||||
string(REGEX REPLACE ".*#define[ \t]+ARES_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1"
|
||||
_ares_version_major ${_ares_version_h})
|
||||
string(REGEX REPLACE ".*#define[ \t]+ARES_VERSION_MINOR[ \t]+([0-9]+).*" "\\1"
|
||||
_ares_version_minor ${_ares_version_h})
|
||||
string(REGEX REPLACE ".*#define[ \t]+ARES_VERSION_PATCH[ \t]+([0-9]+).*" "\\1"
|
||||
_ares_version_patch ${_ares_version_h})
|
||||
set(LIBCARES_VERSION "${_ares_version_major}.${_ares_version_minor}.${_ares_version_patch}")
|
||||
unset(_ares_version_patch)
|
||||
unset(_ares_version_minor)
|
||||
unset(_ares_version_major)
|
||||
unset(_ares_version_h)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set LIBCARES_FOUND to TRUE
|
||||
# if all listed variables are TRUE and the requested version matches.
|
||||
find_package_handle_standard_args(Libcares REQUIRED_VARS
|
||||
LIBCARES_LIBRARY LIBCARES_INCLUDE_DIR
|
||||
VERSION_VAR LIBCARES_VERSION)
|
||||
|
||||
if(LIBCARES_FOUND)
|
||||
set(LIBCARES_LIBRARIES ${LIBCARES_LIBRARY})
|
||||
set(LIBCARES_INCLUDE_DIRS ${LIBCARES_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(LIBCARES_INCLUDE_DIR LIBCARES_LIBRARY)
|
||||
38
cmake/FindLibev.cmake
Normal file
38
cmake/FindLibev.cmake
Normal file
@@ -0,0 +1,38 @@
|
||||
# - Try to find libev
|
||||
# Once done this will define
|
||||
# LIBEV_FOUND - System has libev
|
||||
# LIBEV_INCLUDE_DIRS - The libev include directories
|
||||
# LIBEV_LIBRARIES - The libraries needed to use libev
|
||||
|
||||
find_path(LIBEV_INCLUDE_DIR
|
||||
NAMES ev.h
|
||||
)
|
||||
find_library(LIBEV_LIBRARY
|
||||
NAMES ev
|
||||
)
|
||||
|
||||
if(LIBEV_INCLUDE_DIR)
|
||||
file(STRINGS "${LIBEV_INCLUDE_DIR}/ev.h"
|
||||
LIBEV_VERSION_MAJOR REGEX "^#define[ \t]+EV_VERSION_MAJOR[ \t]+[0-9]+")
|
||||
file(STRINGS "${LIBEV_INCLUDE_DIR}/ev.h"
|
||||
LIBEV_VERSION_MINOR REGEX "^#define[ \t]+EV_VERSION_MINOR[ \t]+[0-9]+")
|
||||
string(REGEX REPLACE "[^0-9]+" "" LIBEV_VERSION_MAJOR "${LIBEV_VERSION_MAJOR}")
|
||||
string(REGEX REPLACE "[^0-9]+" "" LIBEV_VERSION_MINOR "${LIBEV_VERSION_MINOR}")
|
||||
set(LIBEV_VERSION "${LIBEV_VERSION_MAJOR}.${LIBEV_VERSION_MINOR}")
|
||||
unset(LIBEV_VERSION_MINOR)
|
||||
unset(LIBEV_VERSION_MAJOR)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set LIBEV_FOUND to TRUE
|
||||
# if all listed variables are TRUE and the requested version matches.
|
||||
find_package_handle_standard_args(Libev REQUIRED_VARS
|
||||
LIBEV_LIBRARY LIBEV_INCLUDE_DIR
|
||||
VERSION_VAR LIBEV_VERSION)
|
||||
|
||||
if(LIBEV_FOUND)
|
||||
set(LIBEV_LIBRARIES ${LIBEV_LIBRARY})
|
||||
set(LIBEV_INCLUDE_DIRS ${LIBEV_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(LIBEV_INCLUDE_DIR LIBEV_LIBRARY)
|
||||
97
cmake/FindLibevent.cmake
Normal file
97
cmake/FindLibevent.cmake
Normal file
@@ -0,0 +1,97 @@
|
||||
# - Try to find libevent
|
||||
#.rst
|
||||
# FindLibevent
|
||||
# ------------
|
||||
#
|
||||
# Find Libevent include directories and libraries. Invoke as::
|
||||
#
|
||||
# find_package(Libevent
|
||||
# [version] [EXACT] # Minimum or exact version
|
||||
# [REQUIRED] # Fail if Libevent is not found
|
||||
# [COMPONENT <C>...]) # Libraries to look for
|
||||
#
|
||||
# Valid components are one or more of:: libevent core extra pthreads openssl.
|
||||
# Note that 'libevent' contains both core and extra. You must specify one of
|
||||
# them for the other components.
|
||||
#
|
||||
# This module will define the following variables::
|
||||
#
|
||||
# LIBEVENT_FOUND - True if headers and requested libraries were found
|
||||
# LIBEVENT_INCLUDE_DIRS - Libevent include directories
|
||||
# LIBEVENT_LIBRARIES - Libevent libraries to be linked
|
||||
# LIBEVENT_<C>_FOUND - Component <C> was found (<C> is uppercase)
|
||||
# LIBEVENT_<C>_LIBRARY - Library to be linked for Libevent component <C>.
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_LIBEVENT QUIET libevent)
|
||||
|
||||
# Look for the Libevent 2.0 or 1.4 headers
|
||||
find_path(LIBEVENT_INCLUDE_DIR
|
||||
NAMES
|
||||
event2/event-config.h
|
||||
event-config.h
|
||||
HINTS
|
||||
${PC_LIBEVENT_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
if(LIBEVENT_INCLUDE_DIR)
|
||||
set(_version_regex "^#define[ \t]+_EVENT_VERSION[ \t]+\"([^\"]+)\".*")
|
||||
if(EXISTS "${LIBEVENT_INCLUDE_DIR}/event2/event-config.h")
|
||||
# Libevent 2.0
|
||||
file(STRINGS "${LIBEVENT_INCLUDE_DIR}/event2/event-config.h"
|
||||
LIBEVENT_VERSION REGEX "${_version_regex}")
|
||||
if("${LIBEVENT_VERSION}" STREQUAL "")
|
||||
set(LIBEVENT_VERSION ${PC_LIBEVENT_VERSION})
|
||||
endif()
|
||||
else()
|
||||
# Libevent 1.4
|
||||
file(STRINGS "${LIBEVENT_INCLUDE_DIR}/event-config.h"
|
||||
LIBEVENT_VERSION REGEX "${_version_regex}")
|
||||
endif()
|
||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
||||
LIBEVENT_VERSION "${LIBEVENT_VERSION}")
|
||||
unset(_version_regex)
|
||||
endif()
|
||||
|
||||
set(_LIBEVENT_REQUIRED_VARS)
|
||||
foreach(COMPONENT ${Libevent_FIND_COMPONENTS})
|
||||
set(_LIBEVENT_LIBNAME libevent)
|
||||
# Note: compare two variables to avoid a CMP0054 policy warning
|
||||
if(COMPONENT STREQUAL _LIBEVENT_LIBNAME)
|
||||
set(_LIBEVENT_LIBNAME event)
|
||||
else()
|
||||
set(_LIBEVENT_LIBNAME "event_${COMPONENT}")
|
||||
endif()
|
||||
string(TOUPPER "${COMPONENT}" COMPONENT_UPPER)
|
||||
find_library(LIBEVENT_${COMPONENT_UPPER}_LIBRARY
|
||||
NAMES ${_LIBEVENT_LIBNAME}
|
||||
HINTS ${PC_LIBEVENT_LIBRARY_DIRS}
|
||||
)
|
||||
if(LIBEVENT_${COMPONENT_UPPER}_LIBRARY)
|
||||
set(Libevent_${COMPONENT}_FOUND 1)
|
||||
endif()
|
||||
list(APPEND _LIBEVENT_REQUIRED_VARS LIBEVENT_${COMPONENT_UPPER}_LIBRARY)
|
||||
endforeach()
|
||||
unset(_LIBEVENT_LIBNAME)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set LIBEVENT_FOUND to TRUE
|
||||
# if all listed variables are TRUE and the requested version matches.
|
||||
find_package_handle_standard_args(Libevent REQUIRED_VARS
|
||||
${_LIBEVENT_REQUIRED_VARS}
|
||||
LIBEVENT_INCLUDE_DIR
|
||||
VERSION_VAR LIBEVENT_VERSION
|
||||
HANDLE_COMPONENTS)
|
||||
|
||||
if(LIBEVENT_FOUND)
|
||||
set(LIBEVENT_INCLUDE_DIRS ${LIBEVENT_INCLUDE_DIR})
|
||||
set(LIBEVENT_LIBRARIES)
|
||||
foreach(COMPONENT ${Libevent_FIND_COMPONENTS})
|
||||
string(TOUPPER "${COMPONENT}" COMPONENT_UPPER)
|
||||
list(APPEND LIBEVENT_LIBRARIES ${LIBEVENT_${COMPONENT_UPPER}_LIBRARY})
|
||||
set(LIBEVENT_${COMPONENT_UPPER}_FOUND ${Libevent_${COMPONENT}_FOUND})
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
mark_as_advanced(LIBEVENT_INCLUDE_DIR ${_LIBEVENT_REQUIRED_VARS})
|
||||
unset(_LIBEVENT_REQUIRED_VARS)
|
||||
41
cmake/FindLibnghttp3.cmake
Normal file
41
cmake/FindLibnghttp3.cmake
Normal file
@@ -0,0 +1,41 @@
|
||||
# - Try to find libnghttp3
|
||||
# Once done this will define
|
||||
# LIBNGHTTP3_FOUND - System has libnghttp3
|
||||
# LIBNGHTTP3_INCLUDE_DIRS - The libnghttp3 include directories
|
||||
# LIBNGHTTP3_LIBRARIES - The libraries needed to use libnghttp3
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_LIBNGHTTP3 QUIET libnghttp3)
|
||||
|
||||
find_path(LIBNGHTTP3_INCLUDE_DIR
|
||||
NAMES nghttp3/nghttp3.h
|
||||
HINTS ${PC_LIBNGHTTP3_INCLUDE_DIRS}
|
||||
)
|
||||
find_library(LIBNGHTTP3_LIBRARY
|
||||
NAMES nghttp3
|
||||
HINTS ${PC_LIBNGHTTP3_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
if(LIBNGHTTP3_INCLUDE_DIR)
|
||||
set(_version_regex "^#define[ \t]+NGHTTP3_VERSION[ \t]+\"([^\"]+)\".*")
|
||||
file(STRINGS "${LIBNGHTTP3_INCLUDE_DIR}/nghttp3/version.h"
|
||||
LIBNGHTTP3_VERSION REGEX "${_version_regex}")
|
||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
||||
LIBNGHTTP3_VERSION "${LIBNGHTTP3_VERSION}")
|
||||
unset(_version_regex)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set LIBNGHTTP3_FOUND
|
||||
# to TRUE if all listed variables are TRUE and the requested version
|
||||
# matches.
|
||||
find_package_handle_standard_args(Libnghttp3 REQUIRED_VARS
|
||||
LIBNGHTTP3_LIBRARY LIBNGHTTP3_INCLUDE_DIR
|
||||
VERSION_VAR LIBNGHTTP3_VERSION)
|
||||
|
||||
if(LIBNGHTTP3_FOUND)
|
||||
set(LIBNGHTTP3_LIBRARIES ${LIBNGHTTP3_LIBRARY})
|
||||
set(LIBNGHTTP3_INCLUDE_DIRS ${LIBNGHTTP3_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(LIBNGHTTP3_INCLUDE_DIR LIBNGHTTP3_LIBRARY)
|
||||
41
cmake/FindLibngtcp2.cmake
Normal file
41
cmake/FindLibngtcp2.cmake
Normal file
@@ -0,0 +1,41 @@
|
||||
# - Try to find libngtcp2
|
||||
# Once done this will define
|
||||
# LIBNGTCP2_FOUND - System has libngtcp2
|
||||
# LIBNGTCP2_INCLUDE_DIRS - The libngtcp2 include directories
|
||||
# LIBNGTCP2_LIBRARIES - The libraries needed to use libngtcp2
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_LIBNGTCP2 QUIET libngtcp2)
|
||||
|
||||
find_path(LIBNGTCP2_INCLUDE_DIR
|
||||
NAMES ngtcp2/ngtcp2.h
|
||||
HINTS ${PC_LIBNGTCP2_INCLUDE_DIRS}
|
||||
)
|
||||
find_library(LIBNGTCP2_LIBRARY
|
||||
NAMES ngtcp2
|
||||
HINTS ${PC_LIBNGTCP2_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
if(LIBNGTCP2_INCLUDE_DIR)
|
||||
set(_version_regex "^#define[ \t]+NGTCP2_VERSION[ \t]+\"([^\"]+)\".*")
|
||||
file(STRINGS "${LIBNGTCP2_INCLUDE_DIR}/ngtcp2/version.h"
|
||||
LIBNGTCP2_VERSION REGEX "${_version_regex}")
|
||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
||||
LIBNGTCP2_VERSION "${LIBNGTCP2_VERSION}")
|
||||
unset(_version_regex)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set LIBNGTCP2_FOUND
|
||||
# to TRUE if all listed variables are TRUE and the requested version
|
||||
# matches.
|
||||
find_package_handle_standard_args(Libngtcp2 REQUIRED_VARS
|
||||
LIBNGTCP2_LIBRARY LIBNGTCP2_INCLUDE_DIR
|
||||
VERSION_VAR LIBNGTCP2_VERSION)
|
||||
|
||||
if(LIBNGTCP2_FOUND)
|
||||
set(LIBNGTCP2_LIBRARIES ${LIBNGTCP2_LIBRARY})
|
||||
set(LIBNGTCP2_INCLUDE_DIRS ${LIBNGTCP2_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(LIBNGTCP2_INCLUDE_DIR LIBNGTCP2_LIBRARY)
|
||||
43
cmake/FindLibngtcp2_crypto_libressl.cmake
Normal file
43
cmake/FindLibngtcp2_crypto_libressl.cmake
Normal file
@@ -0,0 +1,43 @@
|
||||
# - Try to find libngtcp2_crypto_libressl
|
||||
# Once done this will define
|
||||
# LIBNGTCP2_CRYPTO_LIBRESSL_FOUND - System has libngtcp2_crypto_libressl
|
||||
# LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIRS - The libngtcp2_crypto_libressl include directories
|
||||
# LIBNGTCP2_CRYPTO_LIBRESSL_LIBRARIES - The libraries needed to use libngtcp2_crypto_libressl
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_LIBNGTCP2_CRYPTO_LIBRESSL QUIET libngtcp2_crypto_libressl)
|
||||
|
||||
find_path(LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIR
|
||||
NAMES ngtcp2/ngtcp2_crypto_quictls.h
|
||||
HINTS ${PC_LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIRS}
|
||||
)
|
||||
find_library(LIBNGTCP2_CRYPTO_LIBRESSL_LIBRARY
|
||||
NAMES ngtcp2_crypto_libressl
|
||||
HINTS ${PC_LIBNGTCP2_CRYPTO_LIBRESSL_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
if(LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIR)
|
||||
set(_version_regex "^#define[ \t]+NGTCP2_VERSION[ \t]+\"([^\"]+)\".*")
|
||||
file(STRINGS "${LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIR}/ngtcp2/version.h"
|
||||
LIBNGTCP2_CRYPTO_LIBRESSL_VERSION REGEX "${_version_regex}")
|
||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
||||
LIBNGTCP2_CRYPTO_LIBRESSL_VERSION "${LIBNGTCP2_CRYPTO_LIBRESSL_VERSION}")
|
||||
unset(_version_regex)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set
|
||||
# LIBNGTCP2_CRYPTO_LIBRESSL_FOUND to TRUE if all listed variables are
|
||||
# TRUE and the requested version matches.
|
||||
find_package_handle_standard_args(Libngtcp2_crypto_libressl REQUIRED_VARS
|
||||
LIBNGTCP2_CRYPTO_LIBRESSL_LIBRARY
|
||||
LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIR
|
||||
VERSION_VAR LIBNGTCP2_CRYPTO_LIBRESSL_VERSION)
|
||||
|
||||
if(LIBNGTCP2_CRYPTO_LIBRESSL_FOUND)
|
||||
set(LIBNGTCP2_CRYPTO_LIBRESSL_LIBRARIES ${LIBNGTCP2_CRYPTO_LIBRESSL_LIBRARY})
|
||||
set(LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIRS ${LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIR
|
||||
LIBNGTCP2_CRYPTO_LIBRESSL_LIBRARY)
|
||||
43
cmake/FindLibngtcp2_crypto_ossl.cmake
Normal file
43
cmake/FindLibngtcp2_crypto_ossl.cmake
Normal file
@@ -0,0 +1,43 @@
|
||||
# - Try to find libngtcp2_crypto_ossl
|
||||
# Once done this will define
|
||||
# LIBNGTCP2_CRYPTO_OSSL_FOUND - System has libngtcp2_crypto_ossl
|
||||
# LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIRS - The libngtcp2_crypto_ossl include directories
|
||||
# LIBNGTCP2_CRYPTO_OSSL_LIBRARIES - The libraries needed to use libngtcp2_crypto_ossl
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_LIBNGTCP2_CRYPTO_OSSL QUIET libngtcp2_crypto_ossl)
|
||||
|
||||
find_path(LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR
|
||||
NAMES ngtcp2/ngtcp2_crypto_ossl.h
|
||||
HINTS ${PC_LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIRS}
|
||||
)
|
||||
find_library(LIBNGTCP2_CRYPTO_OSSL_LIBRARY
|
||||
NAMES ngtcp2_crypto_ossl
|
||||
HINTS ${PC_LIBNGTCP2_CRYPTO_OSSL_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
if(LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR)
|
||||
set(_version_regex "^#define[ \t]+NGTCP2_VERSION[ \t]+\"([^\"]+)\".*")
|
||||
file(STRINGS "${LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR}/ngtcp2/version.h"
|
||||
LIBNGTCP2_CRYPTO_OSSL_VERSION REGEX "${_version_regex}")
|
||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
||||
LIBNGTCP2_CRYPTO_OSSL_VERSION "${LIBNGTCP2_CRYPTO_OSSL_VERSION}")
|
||||
unset(_version_regex)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set
|
||||
# LIBNGTCP2_CRYPTO_OSSL_FOUND to TRUE if all listed variables are
|
||||
# TRUE and the requested version matches.
|
||||
find_package_handle_standard_args(Libngtcp2_crypto_ossl REQUIRED_VARS
|
||||
LIBNGTCP2_CRYPTO_OSSL_LIBRARY
|
||||
LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR
|
||||
VERSION_VAR LIBNGTCP2_CRYPTO_OSSL_VERSION)
|
||||
|
||||
if(LIBNGTCP2_CRYPTO_OSSL_FOUND)
|
||||
set(LIBNGTCP2_CRYPTO_OSSL_LIBRARIES ${LIBNGTCP2_CRYPTO_OSSL_LIBRARY})
|
||||
set(LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIRS ${LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR
|
||||
LIBNGTCP2_CRYPTO_OSSL_LIBRARY)
|
||||
43
cmake/FindLibngtcp2_crypto_quictls.cmake
Normal file
43
cmake/FindLibngtcp2_crypto_quictls.cmake
Normal file
@@ -0,0 +1,43 @@
|
||||
# - Try to find libngtcp2_crypto_quictls
|
||||
# Once done this will define
|
||||
# LIBNGTCP2_CRYPTO_QUICTLS_FOUND - System has libngtcp2_crypto_quictls
|
||||
# LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIRS - The libngtcp2_crypto_quictls include directories
|
||||
# LIBNGTCP2_CRYPTO_QUICTLS_LIBRARIES - The libraries needed to use libngtcp2_crypto_quictls
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_LIBNGTCP2_CRYPTO_QUICTLS QUIET libngtcp2_crypto_quictls)
|
||||
|
||||
find_path(LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIR
|
||||
NAMES ngtcp2/ngtcp2_crypto_quictls.h
|
||||
HINTS ${PC_LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIRS}
|
||||
)
|
||||
find_library(LIBNGTCP2_CRYPTO_QUICTLS_LIBRARY
|
||||
NAMES ngtcp2_crypto_quictls
|
||||
HINTS ${PC_LIBNGTCP2_CRYPTO_QUICTLS_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
if(LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIR)
|
||||
set(_version_regex "^#define[ \t]+NGTCP2_VERSION[ \t]+\"([^\"]+)\".*")
|
||||
file(STRINGS "${LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIR}/ngtcp2/version.h"
|
||||
LIBNGTCP2_CRYPTO_QUICTLS_VERSION REGEX "${_version_regex}")
|
||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
||||
LIBNGTCP2_CRYPTO_QUICTLS_VERSION "${LIBNGTCP2_CRYPTO_QUICTLS_VERSION}")
|
||||
unset(_version_regex)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set
|
||||
# LIBNGTCP2_CRYPTO_QUICTLS_FOUND to TRUE if all listed variables are
|
||||
# TRUE and the requested version matches.
|
||||
find_package_handle_standard_args(Libngtcp2_crypto_quictls REQUIRED_VARS
|
||||
LIBNGTCP2_CRYPTO_QUICTLS_LIBRARY
|
||||
LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIR
|
||||
VERSION_VAR LIBNGTCP2_CRYPTO_QUICTLS_VERSION)
|
||||
|
||||
if(LIBNGTCP2_CRYPTO_QUICTLS_FOUND)
|
||||
set(LIBNGTCP2_CRYPTO_QUICTLS_LIBRARIES ${LIBNGTCP2_CRYPTO_QUICTLS_LIBRARY})
|
||||
set(LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIRS ${LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIR
|
||||
LIBNGTCP2_CRYPTO_QUICTLS_LIBRARY)
|
||||
43
cmake/FindLibngtcp2_crypto_wolfssl.cmake
Normal file
43
cmake/FindLibngtcp2_crypto_wolfssl.cmake
Normal file
@@ -0,0 +1,43 @@
|
||||
# - Try to find libngtcp2_crypto_wolfssl
|
||||
# Once done this will define
|
||||
# LIBNGTCP2_CRYPTO_WOLFSSL_FOUND - System has libngtcp2_crypto_wolfssl
|
||||
# LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIRS - The libngtcp2_crypto_wolfssl include directories
|
||||
# LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARIES - The libraries needed to use libngtcp2_crypto_wolfssl
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_LIBNGTCP2_CRYPTO_WOLFSSL QUIET libngtcp2_crypto_wolfssl)
|
||||
|
||||
find_path(LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIR
|
||||
NAMES ngtcp2/ngtcp2_crypto_wolfssl.h
|
||||
HINTS ${PC_LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIRS}
|
||||
)
|
||||
find_library(LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARY
|
||||
NAMES ngtcp2_crypto_wolfssl
|
||||
HINTS ${PC_LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
if(LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIR)
|
||||
set(_version_regex "^#define[ \t]+NGTCP2_VERSION[ \t]+\"([^\"]+)\".*")
|
||||
file(STRINGS "${LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIR}/ngtcp2/version.h"
|
||||
LIBNGTCP2_CRYPTO_WOLFSSL_VERSION REGEX "${_version_regex}")
|
||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
||||
LIBNGTCP2_CRYPTO_WOLFSSL_VERSION "${LIBNGTCP2_CRYPTO_WOLFSSL_VERSION}")
|
||||
unset(_version_regex)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set
|
||||
# LIBNGTCP2_CRYPTO_WOLFSSL_FOUND to TRUE if all listed variables are
|
||||
# TRUE and the requested version matches.
|
||||
find_package_handle_standard_args(Libngtcp2_crypto_wolfssl REQUIRED_VARS
|
||||
LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARY
|
||||
LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIR
|
||||
VERSION_VAR LIBNGTCP2_CRYPTO_WOLFSSL_VERSION)
|
||||
|
||||
if(LIBNGTCP2_CRYPTO_WOLFSSL_FOUND)
|
||||
set(LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARIES ${LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARY})
|
||||
set(LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIRS ${LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIR
|
||||
LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARY)
|
||||
19
cmake/FindSystemd.cmake
Normal file
19
cmake/FindSystemd.cmake
Normal file
@@ -0,0 +1,19 @@
|
||||
# - Try to find systemd
|
||||
# Once done this will define
|
||||
# SYSTEMD_FOUND - System has systemd
|
||||
# SYSTEMD_INCLUDE_DIRS - The systemd include directories
|
||||
# SYSTEMD_LIBRARIES - The libraries needed to use systemd
|
||||
|
||||
include(FeatureSummary)
|
||||
set_package_properties(Systemd PROPERTIES
|
||||
URL "http://freedesktop.org/wiki/Software/systemd/"
|
||||
DESCRIPTION "System and Service Manager")
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_SYSTEMD QUIET libsystemd)
|
||||
find_library(SYSTEMD_LIBRARIES NAMES systemd ${PC_SYSTEMD_LIBRARY_DIRS})
|
||||
find_path(SYSTEMD_INCLUDE_DIRS systemd/sd-login.h HINTS ${PC_SYSTEMD_INCLUDE_DIRS})
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(Systemd DEFAULT_MSG SYSTEMD_INCLUDE_DIRS SYSTEMD_LIBRARIES)
|
||||
mark_as_advanced(SYSTEMD_INCLUDE_DIRS SYSTEMD_LIBRARIES)
|
||||
41
cmake/FindWolfSSL.cmake
Normal file
41
cmake/FindWolfSSL.cmake
Normal file
@@ -0,0 +1,41 @@
|
||||
# - Try to find wolfssl
|
||||
# Once done this will define
|
||||
# WOLFSSL_FOUND - System has wolfssl
|
||||
# WOLFSSL_INCLUDE_DIRS - The wolfssl include directories
|
||||
# WOLFSSL_LIBRARIES - The libraries needed to use wolfssl
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_WOLFSSL QUIET wolfssl)
|
||||
|
||||
find_path(WOLFSSL_INCLUDE_DIR
|
||||
NAMES wolfssl/ssl.h
|
||||
HINTS ${PC_WOLFSSL_INCLUDE_DIRS}
|
||||
)
|
||||
find_library(WOLFSSL_LIBRARY
|
||||
NAMES wolfssl
|
||||
HINTS ${PC_WOLFSSL_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
if(WOLFSSL_INCLUDE_DIR)
|
||||
set(_version_regex "^#define[ \t]+LIBWOLFSSL_VERSION_STRING[ \t]+\"([^\"]+)\".*")
|
||||
file(STRINGS "${WOLFSSL_INCLUDE_DIR}/wolfssl/version.h"
|
||||
WOLFSSL_VERSION REGEX "${_version_regex}")
|
||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
||||
WOLFSSL_VERSION "${WOLFSSL_VERSION}")
|
||||
unset(_version_regex)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set WOLFSSL_FOUND
|
||||
# to TRUE if all listed variables are TRUE and the requested version
|
||||
# matches.
|
||||
find_package_handle_standard_args(WolfSSL REQUIRED_VARS
|
||||
WOLFSSL_LIBRARY WOLFSSL_INCLUDE_DIR
|
||||
VERSION_VAR WOLFSSL_VERSION)
|
||||
|
||||
if(WOLFSSL_FOUND)
|
||||
set(WOLFSSL_LIBRARIES ${WOLFSSL_LIBRARY})
|
||||
set(WOLFSSL_INCLUDE_DIRS ${WOLFSSL_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(WOLFSSL_INCLUDE_DIR WOLFSSL_LIBRARY)
|
||||
162
cmake/PickyWarningsC.cmake
Normal file
162
cmake/PickyWarningsC.cmake
Normal file
@@ -0,0 +1,162 @@
|
||||
# nghttp2
|
||||
#
|
||||
# Copyright (c) 2023 nghttp2 contributors
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be
|
||||
# included in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
# C
|
||||
|
||||
include(CheckCCompilerFlag)
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
|
||||
# https://clang.llvm.org/docs/DiagnosticsReference.html
|
||||
# https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
|
||||
|
||||
# WPICKY_ENABLE = Options we want to enable as-is.
|
||||
# WPICKY_DETECT = Options we want to test first and enable if available.
|
||||
|
||||
# Prefer the -Wextra alias with clang.
|
||||
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
set(WPICKY_ENABLE "-Wextra")
|
||||
else()
|
||||
set(WPICKY_ENABLE "-W")
|
||||
endif()
|
||||
|
||||
list(APPEND WPICKY_ENABLE
|
||||
-Wall
|
||||
)
|
||||
|
||||
# ----------------------------------
|
||||
# Add new options here, if in doubt:
|
||||
# ----------------------------------
|
||||
set(WPICKY_DETECT
|
||||
)
|
||||
|
||||
# Assume these options always exist with both clang and gcc.
|
||||
# Require clang 3.0 / gcc 2.95 or later.
|
||||
list(APPEND WPICKY_ENABLE
|
||||
-Wconversion # clang 3.0 gcc 2.95
|
||||
-Winline # clang 1.0 gcc 1.0
|
||||
-Wmissing-declarations # clang 1.0 gcc 2.7
|
||||
-Wmissing-prototypes # clang 1.0 gcc 1.0
|
||||
-Wnested-externs # clang 1.0 gcc 2.7
|
||||
-Wpointer-arith # clang 1.0 gcc 1.4
|
||||
-Wshadow # clang 1.0 gcc 2.95
|
||||
-Wundef # clang 1.0 gcc 2.95
|
||||
-Wwrite-strings # clang 1.0 gcc 1.4
|
||||
)
|
||||
|
||||
# Always enable with clang, version dependent with gcc
|
||||
set(WPICKY_COMMON_OLD
|
||||
-Waddress # clang 3.0 gcc 4.3
|
||||
-Wattributes # clang 3.0 gcc 4.1
|
||||
-Wcast-align # clang 1.0 gcc 4.2
|
||||
-Wdeclaration-after-statement # clang 1.0 gcc 3.4
|
||||
-Wdiv-by-zero # clang 3.0 gcc 4.1
|
||||
-Wempty-body # clang 3.0 gcc 4.3
|
||||
-Wendif-labels # clang 1.0 gcc 3.3
|
||||
-Wfloat-equal # clang 1.0 gcc 2.96 (3.0)
|
||||
-Wformat-nonliteral # clang 3.0 gcc 4.1
|
||||
-Wformat-security # clang 3.0 gcc 4.1
|
||||
-Wmissing-field-initializers # clang 3.0 gcc 4.1
|
||||
-Wmissing-noreturn # clang 3.0 gcc 4.1
|
||||
-Wno-format-nonliteral # clang 1.0 gcc 2.96 (3.0) # This is required because we pass format string as "const char*"
|
||||
# -Wpadded # clang 3.0 gcc 4.1 # Not used because we cannot change public structs
|
||||
-Wredundant-decls # clang 3.0 gcc 4.1
|
||||
-Wsign-conversion # clang 3.0 gcc 4.3
|
||||
-Wstrict-prototypes # clang 1.0 gcc 3.3
|
||||
# -Wswitch-enum # clang 3.0 gcc 4.1 # Not used because this basically disallows default case
|
||||
-Wunreachable-code # clang 3.0 gcc 4.1
|
||||
-Wunused-parameter # clang 3.0 gcc 4.1
|
||||
-Wvla # clang 2.8 gcc 4.3
|
||||
)
|
||||
|
||||
set(WPICKY_COMMON
|
||||
-Wpragmas # clang 3.5 gcc 4.1 appleclang 6.0
|
||||
)
|
||||
|
||||
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
list(APPEND WPICKY_ENABLE
|
||||
${WPICKY_COMMON_OLD}
|
||||
-Wshorten-64-to-32 # clang 1.0
|
||||
-Wlanguage-extension-token # clang 3.0
|
||||
)
|
||||
# Enable based on compiler version
|
||||
if((CMAKE_C_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.6) OR
|
||||
(CMAKE_C_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 6.3))
|
||||
list(APPEND WPICKY_ENABLE
|
||||
${WPICKY_COMMON}
|
||||
-Wunreachable-code-break # clang 3.5 appleclang 6.0
|
||||
-Wheader-guard # clang 3.4 appleclang 5.1
|
||||
)
|
||||
endif()
|
||||
if((CMAKE_C_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.9) OR
|
||||
(CMAKE_C_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 8.3))
|
||||
list(APPEND WPICKY_ENABLE
|
||||
-Wmissing-variable-declarations # clang 3.2 appleclang 4.6
|
||||
)
|
||||
endif()
|
||||
if((CMAKE_C_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0) OR
|
||||
(CMAKE_C_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 9.4))
|
||||
list(APPEND WPICKY_ENABLE
|
||||
)
|
||||
endif()
|
||||
if((CMAKE_C_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 7.0) OR
|
||||
(CMAKE_C_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 10.3))
|
||||
list(APPEND WPICKY_ENABLE
|
||||
)
|
||||
endif()
|
||||
else() # gcc
|
||||
list(APPEND WPICKY_DETECT
|
||||
${WPICKY_COMMON}
|
||||
)
|
||||
# Enable based on compiler version
|
||||
if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.3)
|
||||
list(APPEND WPICKY_ENABLE
|
||||
${WPICKY_COMMON_OLD}
|
||||
-Wclobbered # gcc 4.3
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
#
|
||||
|
||||
unset(_wpicky)
|
||||
|
||||
foreach(_CCOPT IN LISTS WPICKY_ENABLE)
|
||||
set(_wpicky "${_wpicky} ${_CCOPT}")
|
||||
endforeach()
|
||||
|
||||
foreach(_CCOPT IN LISTS WPICKY_DETECT)
|
||||
# surprisingly, CHECK_C_COMPILER_FLAG needs a new variable to store each new
|
||||
# test result in.
|
||||
string(MAKE_C_IDENTIFIER "OPT${_CCOPT}" _optvarname)
|
||||
# GCC only warns about unknown -Wno- options if there are also other diagnostic messages,
|
||||
# so test for the positive form instead
|
||||
string(REPLACE "-Wno-" "-W" _CCOPT_ON "${_CCOPT}")
|
||||
check_c_compiler_flag(${_CCOPT_ON} ${_optvarname})
|
||||
if(${_optvarname})
|
||||
set(_wpicky "${_wpicky} ${_CCOPT}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
set(WARNCFLAGS "${WARNCFLAGS} ${_wpicky}")
|
||||
endif()
|
||||
121
cmake/PickyWarningsCXX.cmake
Normal file
121
cmake/PickyWarningsCXX.cmake
Normal file
@@ -0,0 +1,121 @@
|
||||
# nghttp2
|
||||
#
|
||||
# Copyright (c) 2023 nghttp2 contributors
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be
|
||||
# included in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
# C++
|
||||
|
||||
include(CheckCXXCompilerFlag)
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
|
||||
# https://clang.llvm.org/docs/DiagnosticsReference.html
|
||||
# https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
|
||||
|
||||
# WPICKY_ENABLE = Options we want to enable as-is.
|
||||
# WPICKY_DETECT = Options we want to test first and enable if available.
|
||||
|
||||
set(WPICKY_ENABLE "-Wall")
|
||||
|
||||
# ----------------------------------
|
||||
# Add new options here, if in doubt:
|
||||
# ----------------------------------
|
||||
set(WPICKY_DETECT
|
||||
)
|
||||
|
||||
# Assume these options always exist with both clang and gcc.
|
||||
# Require clang 3.0 / gcc 2.95 or later.
|
||||
list(APPEND WPICKY_ENABLE
|
||||
)
|
||||
|
||||
# Always enable with clang, version dependent with gcc
|
||||
set(WPICKY_COMMON_OLD
|
||||
-Wformat-security # clang 3.0 gcc 4.1
|
||||
)
|
||||
|
||||
set(WPICKY_COMMON
|
||||
)
|
||||
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
list(APPEND WPICKY_ENABLE
|
||||
${WPICKY_COMMON_OLD}
|
||||
)
|
||||
list(APPEND WPICKY_ENABLE
|
||||
# clang++-18 warns this when building with wolfSSL >= v5.7.6-stable.
|
||||
-Wno-extern-c-compat
|
||||
)
|
||||
# Enable based on compiler version
|
||||
if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.6) OR
|
||||
(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.3))
|
||||
list(APPEND WPICKY_ENABLE
|
||||
${WPICKY_COMMON}
|
||||
)
|
||||
endif()
|
||||
if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.9) OR
|
||||
(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.3))
|
||||
list(APPEND WPICKY_ENABLE
|
||||
)
|
||||
endif()
|
||||
if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) OR
|
||||
(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.4))
|
||||
list(APPEND WPICKY_ENABLE
|
||||
)
|
||||
endif()
|
||||
if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0) OR
|
||||
(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.3))
|
||||
list(APPEND WPICKY_ENABLE
|
||||
)
|
||||
endif()
|
||||
else() # gcc
|
||||
list(APPEND WPICKY_DETECT
|
||||
${WPICKY_COMMON}
|
||||
)
|
||||
# Enable based on compiler version
|
||||
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.3)
|
||||
list(APPEND WPICKY_ENABLE
|
||||
${WPICKY_COMMON_OLD}
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
#
|
||||
|
||||
unset(_wpicky)
|
||||
|
||||
foreach(_CCOPT IN LISTS WPICKY_ENABLE)
|
||||
set(_wpicky "${_wpicky} ${_CCOPT}")
|
||||
endforeach()
|
||||
|
||||
foreach(_CCOPT IN LISTS WPICKY_DETECT)
|
||||
# surprisingly, CHECK_CXX_COMPILER_FLAG needs a new variable to store each new
|
||||
# test result in.
|
||||
string(MAKE_C_IDENTIFIER "OPT${_CCOPT}" _optvarname)
|
||||
# GCC only warns about unknown -Wno- options if there are also other diagnostic messages,
|
||||
# so test for the positive form instead
|
||||
string(REPLACE "-Wno-" "-W" _CCOPT_ON "${_CCOPT}")
|
||||
check_cxx_compiler_flag(${_CCOPT_ON} ${_optvarname})
|
||||
if(${_optvarname})
|
||||
set(_wpicky "${_wpicky} ${_CCOPT}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
set(WARNCXXFLAGS "${WARNCXXFLAGS} ${_wpicky}")
|
||||
endif()
|
||||
11
cmake/Version.cmake
Normal file
11
cmake/Version.cmake
Normal file
@@ -0,0 +1,11 @@
|
||||
# Converts a version such as 1.2.255 to 0x0102ff
|
||||
function(HexVersion version_hex_var major minor patch)
|
||||
math(EXPR version_dec "${major} * 256 * 256 + ${minor} * 256 + ${patch}")
|
||||
set(version_hex "0x")
|
||||
foreach(i RANGE 5 0 -1)
|
||||
math(EXPR num "(${version_dec} >> (4 * ${i})) & 15")
|
||||
string(SUBSTRING "0123456789abcdef" ${num} 1 num_hex)
|
||||
set(version_hex "${version_hex}${num_hex}")
|
||||
endforeach()
|
||||
set(${version_hex_var} "${version_hex}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
116
cmakeconfig.h.in
Normal file
116
cmakeconfig.h.in
Normal file
@@ -0,0 +1,116 @@
|
||||
/* Hint to the compiler that a function never returns */
|
||||
#define NGHTTP2_NORETURN @HINT_NORETURN@
|
||||
|
||||
/* Define to `int' if <sys/types.h> does not define. */
|
||||
#cmakedefine ssize_t @ssize_t@
|
||||
|
||||
/* Define to 1 if you have the `std::chrono::time_zone`. */
|
||||
#cmakedefine HAVE_STD_CHRONO_TIME_ZONE 1
|
||||
|
||||
/* Define to 1 if you have `libjansson` library. */
|
||||
#cmakedefine HAVE_JANSSON 1
|
||||
|
||||
/* Define to 1 if you have `libxml2` library. */
|
||||
#cmakedefine HAVE_LIBXML2 1
|
||||
|
||||
/* Define to 1 if you have `mruby` library. */
|
||||
#cmakedefine HAVE_MRUBY 1
|
||||
|
||||
/* Define to 1 if you have `neverbleed` library. */
|
||||
#cmakedefine HAVE_NEVERBLEED 1
|
||||
|
||||
/* Define to 1 if you have the `_Exit` function. */
|
||||
#cmakedefine HAVE__EXIT 1
|
||||
|
||||
/* Define to 1 if you have the `accept4` function. */
|
||||
#cmakedefine HAVE_ACCEPT4 1
|
||||
|
||||
/* Define to 1 if you have the `clock_gettime` function. */
|
||||
#cmakedefine HAVE_CLOCK_GETTIME 1
|
||||
|
||||
/* Define to 1 if you have the `mkostemp` function. */
|
||||
#cmakedefine HAVE_MKOSTEMP 1
|
||||
|
||||
/* Define to 1 if you have the `pipe2` function. */
|
||||
#cmakedefine HAVE_PIPE2 1
|
||||
|
||||
/* Define to 1 if you have the `GetTickCount64` function. */
|
||||
#cmakedefine HAVE_GETTICKCOUNT64 1
|
||||
|
||||
/* Define to 1 if you have the `initgroups` function. */
|
||||
#cmakedefine01 HAVE_DECL_INITGROUPS
|
||||
|
||||
/* Define to 1 if you have the `CLOCK_MONOTONIC` defined. */
|
||||
#cmakedefine01 HAVE_DECL_CLOCK_MONOTONIC
|
||||
|
||||
/* Define to 1 to enable debug output. */
|
||||
#cmakedefine DEBUGBUILD 1
|
||||
|
||||
/* Define to 1 if you want to disable threads. */
|
||||
#cmakedefine NOTHREADS 1
|
||||
|
||||
/* Define to 1 if you have the <arpa/inet.h> header file. */
|
||||
#cmakedefine HAVE_ARPA_INET_H 1
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#cmakedefine HAVE_FCNTL_H 1
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#cmakedefine HAVE_INTTYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the <limits.h> header file. */
|
||||
#cmakedefine HAVE_LIMITS_H 1
|
||||
|
||||
/* Define to 1 if you have the <netdb.h> header file. */
|
||||
#cmakedefine HAVE_NETDB_H 1
|
||||
|
||||
/* Define to 1 if you have the <netinet/in.h> header file. */
|
||||
#cmakedefine HAVE_NETINET_IN_H 1
|
||||
|
||||
/* Define to 1 if you have the <netinet/ip.h> header file. */
|
||||
#cmakedefine HAVE_NETINET_IP_H 1
|
||||
|
||||
/* Define to 1 if you have the <pwd.h> header file. */
|
||||
#cmakedefine HAVE_PWD_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/socket.h> header file. */
|
||||
#cmakedefine HAVE_SYS_SOCKET_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||
#cmakedefine HAVE_SYS_TIME_H 1
|
||||
|
||||
/* Define to 1 if you have the <syslog.h> header file. */
|
||||
#cmakedefine HAVE_SYSLOG_H 1
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#cmakedefine HAVE_UNISTD_H 1
|
||||
|
||||
/* Define to 1 if you have the <windows.h> header file. */
|
||||
#cmakedefine HAVE_WINDOWS_H 1
|
||||
|
||||
/* Define to 1 if HTTP/3 is enabled. */
|
||||
#cmakedefine ENABLE_HTTP3 1
|
||||
|
||||
/* Define to 1 if you have `libbpf` library. */
|
||||
#cmakedefine HAVE_LIBBPF 1
|
||||
|
||||
/* Define to 1 if you have enum bpf_stats_type in linux/bpf.h. */
|
||||
#cmakedefine HAVE_BPF_STATS_TYPE 1
|
||||
|
||||
/* Define to 1 if you have `libngtcp2_crypto_quictls` library. */
|
||||
#cmakedefine HAVE_LIBNGTCP2_CRYPTO_QUICTLS
|
||||
|
||||
/* Define to 1 if you have `libngtcp2_crypto_libressl` library. */
|
||||
#cmakedefine HAVE_LIBNGTCP2_CRYPTO_LIBRESSL
|
||||
|
||||
/* Define to 1 if you have `libngtcp2_crypto_wolfssl` library. */
|
||||
#cmakedefine HAVE_LIBNGTCP2_CRYPTO_WOLFSSL 1
|
||||
|
||||
/* Define to 1 if you have `libev` library. */
|
||||
#cmakedefine HAVE_LIBEV 1
|
||||
|
||||
/* Define to 1 if you have `libbrotlienc` and `libbrotlidec` libraries. */
|
||||
#cmakedefine HAVE_LIBBROTLI 1
|
||||
|
||||
/* Define to 1 if you have `wolfssl` library. */
|
||||
#cmakedefine HAVE_WOLFSSL 1
|
||||
1346
configure.ac
1346
configure.ac
File diff suppressed because it is too large
Load Diff
3
contrib/.gitignore
vendored
Normal file
3
contrib/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
nghttpx-init
|
||||
nghttpx.service
|
||||
nghttpx-upstart.conf
|
||||
12
contrib/CMakeLists.txt
Normal file
12
contrib/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
set(CONFIGFILES
|
||||
nghttpx-init
|
||||
nghttpx.service
|
||||
nghttpx-upstart.conf
|
||||
)
|
||||
|
||||
# Note that the execute permissions of nghttpx-init is preserved
|
||||
foreach(name IN LISTS CONFIGFILES)
|
||||
configure_file("${name}.in" "${name}" @ONLY)
|
||||
endforeach()
|
||||
|
||||
# set(EXTRA_DIST ${CONFIGFILES} nghttpx-logrotate tlsticketupdate.go)
|
||||
51
contrib/Makefile.am
Normal file
51
contrib/Makefile.am
Normal file
@@ -0,0 +1,51 @@
|
||||
# nghttp2 - HTTP/2 C Library
|
||||
|
||||
# Copyright (c) 2014 Tatsuhiro Tsujikawa
|
||||
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
|
||||
# The above copyright notice and this permission notice shall be
|
||||
# included in all copies or substantial portions of the Software.
|
||||
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
configfiles = nghttpx-init nghttpx.service nghttpx-upstart.conf
|
||||
|
||||
EXTRA_DIST = \
|
||||
CMakeLists.txt \
|
||||
$(configfiles:%=%.in) \
|
||||
nghttpx-logrotate \
|
||||
tlsticketupdate.go
|
||||
|
||||
edit = sed -e 's|@bindir[@]|$(bindir)|g'
|
||||
|
||||
nghttpx-init: $(srcdir)/nghttpx-init.in
|
||||
rm -f $@ $@.tmp
|
||||
$(edit) $< > $@.tmp
|
||||
chmod +x $@.tmp
|
||||
mv $@.tmp $@
|
||||
|
||||
nghttpx.service: $(srcdir)/nghttpx.service.in
|
||||
$(edit) $< > $@
|
||||
|
||||
nghttpx-upstart.conf: $(srcdir)/nghttpx-upstart.conf.in
|
||||
$(edit) $< > $@
|
||||
|
||||
$(configfiles): Makefile
|
||||
|
||||
all-local: $(configfiles)
|
||||
|
||||
clean-local:
|
||||
-rm -f nghttpx-init.tmp $(configfiles)
|
||||
164
contrib/nghttpx-init.in
Executable file
164
contrib/nghttpx-init.in
Executable file
@@ -0,0 +1,164 @@
|
||||
#! /bin/sh
|
||||
### BEGIN INIT INFO
|
||||
# Provides: nghttpx
|
||||
# Required-Start: $remote_fs $syslog
|
||||
# Required-Stop: $remote_fs $syslog
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: nghttpx initscript
|
||||
# Description: nghttpx initscript
|
||||
### END INIT INFO
|
||||
|
||||
# Author: Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>
|
||||
#
|
||||
# Do NOT "set -e"
|
||||
|
||||
# PATH should only include /usr/* if it runs after the mountnfs.sh script
|
||||
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
|
||||
DESC="HTTP/2 reverse proxy"
|
||||
NAME=nghttpx
|
||||
# Depending on the configuration, binary may be located under @sbindir@
|
||||
DAEMON=@bindir@/$NAME
|
||||
PIDFILE=/var/run/$NAME.pid
|
||||
DAEMON_ARGS="--conf /etc/nghttpx/nghttpx.conf --pid-file=$PIDFILE --daemon"
|
||||
SCRIPTNAME=/etc/init.d/$NAME
|
||||
|
||||
# Exit if the package is not installed
|
||||
[ -x "$DAEMON" ] || exit 0
|
||||
|
||||
# Read configuration variable file if it is present
|
||||
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
|
||||
|
||||
# Load the VERBOSE setting and other rcS variables
|
||||
. /lib/init/vars.sh
|
||||
|
||||
# Define LSB log_* functions.
|
||||
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
|
||||
# and status_of_proc is working.
|
||||
. /lib/lsb/init-functions
|
||||
|
||||
#
|
||||
# Function that starts the daemon/service
|
||||
#
|
||||
do_start()
|
||||
{
|
||||
# Return
|
||||
# 0 if daemon has been started
|
||||
# 1 if daemon was already running
|
||||
# 2 if daemon could not be started
|
||||
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|
||||
|| return 1
|
||||
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
|
||||
$DAEMON_ARGS \
|
||||
|| return 2
|
||||
# Add code here, if necessary, that waits for the process to be ready
|
||||
# to handle requests from services started subsequently which depend
|
||||
# on this one. As a last resort, sleep for some time.
|
||||
}
|
||||
|
||||
#
|
||||
# Function that stops the daemon/service
|
||||
#
|
||||
do_stop()
|
||||
{
|
||||
# Return
|
||||
# 0 if daemon has been stopped
|
||||
# 1 if daemon was already stopped
|
||||
# 2 if daemon could not be stopped
|
||||
# other if a failure occurred
|
||||
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE
|
||||
RETVAL="$?"
|
||||
[ "$RETVAL" = 2 ] && return 2
|
||||
|
||||
# Wait for children to finish too if this is a daemon that forks
|
||||
# and if the daemon is only ever run from this initscript.
|
||||
# If the above conditions are not satisfied then add some other code
|
||||
# that waits for the process to drop all resources that could be
|
||||
# needed by services started subsequently. A last resort is to
|
||||
# sleep for some time.
|
||||
#start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
|
||||
#[ "$?" = 2 ] && return 2
|
||||
# Many daemons don't delete their pidfiles when they exit.
|
||||
rm -f $PIDFILE
|
||||
return "$RETVAL"
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
|
||||
do_start
|
||||
case "$?" in
|
||||
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
||||
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
||||
esac
|
||||
;;
|
||||
stop)
|
||||
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
|
||||
do_stop
|
||||
case "$?" in
|
||||
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
||||
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
||||
esac
|
||||
;;
|
||||
status)
|
||||
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
|
||||
;;
|
||||
upgrade)
|
||||
log_daemon_msg "Upgrading $DESC" "$NAME"
|
||||
oldpid=`pidofproc -p $PIDFILE $NAME`
|
||||
case "$?" in
|
||||
0)
|
||||
log_progress_msg "Sending SIGUSR2 to $oldpid..."
|
||||
kill -USR2 $oldpid
|
||||
log_progress_msg "Waiting for new binary..."
|
||||
for i in 1 2 3 4 5 ; do
|
||||
sleep 1
|
||||
newpid=`pidofproc -p $PIDFILE $NAME`
|
||||
if [ "$newpid" != "$oldpid" ] ; then
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ "$newpid" != "$oldpid" ] ; then
|
||||
log_progress_msg "Sending SIGQUIT to $oldpid..."
|
||||
kill -QUIT $oldpid
|
||||
log_end_msg 0
|
||||
else
|
||||
log_progress_msg "New binary failed to start"
|
||||
log_end_msg 1
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
log_progress_msg "pidofproc() failed"
|
||||
log_end_msg 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
restart|force-reload)
|
||||
#
|
||||
# If the "reload" option is implemented then remove the
|
||||
# 'force-reload' alias
|
||||
#
|
||||
log_daemon_msg "Restarting $DESC" "$NAME"
|
||||
do_stop
|
||||
case "$?" in
|
||||
0|1)
|
||||
do_start
|
||||
case "$?" in
|
||||
0) log_end_msg 0 ;;
|
||||
1) log_end_msg 1 ;; # Old process is still running
|
||||
*) log_end_msg 1 ;; # Failed to start
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
# Failed to stop
|
||||
log_end_msg 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload|upgrade}" >&2
|
||||
exit 3
|
||||
;;
|
||||
esac
|
||||
|
||||
:
|
||||
11
contrib/nghttpx-logrotate
Normal file
11
contrib/nghttpx-logrotate
Normal file
@@ -0,0 +1,11 @@
|
||||
/var/log/nghttpx/*.log {
|
||||
weekly
|
||||
rotate 52
|
||||
missingok
|
||||
compress
|
||||
delaycompress
|
||||
notifempty
|
||||
postrotate
|
||||
[ -s /var/run/nghttpx.pid ] && kill -USR1 `cat /var/run/nghttpx.pid` 2> /dev/null || true
|
||||
endscript
|
||||
}
|
||||
8
contrib/nghttpx-upstart.conf.in
Normal file
8
contrib/nghttpx-upstart.conf.in
Normal file
@@ -0,0 +1,8 @@
|
||||
# vim: ft=upstart:
|
||||
|
||||
description "HTTP/2 reverse proxy"
|
||||
|
||||
start on runlevel [2]
|
||||
stop on runlevel [016]
|
||||
|
||||
exec @bindir@/nghttpx
|
||||
17
contrib/nghttpx.service.in
Normal file
17
contrib/nghttpx.service.in
Normal file
@@ -0,0 +1,17 @@
|
||||
[Unit]
|
||||
Description=HTTP/2 proxy
|
||||
Documentation=man:nghttpx
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=notify
|
||||
ExecStart=@bindir@/nghttpx --conf=/etc/nghttpx/nghttpx.conf
|
||||
ExecReload=/bin/kill --signal HUP $MAINPID
|
||||
KillSignal=SIGQUIT
|
||||
PrivateTmp=yes
|
||||
ProtectHome=yes
|
||||
ProtectSystem=full
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
112
contrib/tlsticketupdate.go
Normal file
112
contrib/tlsticketupdate.go
Normal file
@@ -0,0 +1,112 @@
|
||||
//
|
||||
// nghttp2 - HTTP/2 C Library
|
||||
//
|
||||
// Copyright (c) 2015 Tatsuhiro Tsujikawa
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/rand"
|
||||
"encoding/binary"
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/bradfitz/gomemcache/memcache"
|
||||
)
|
||||
|
||||
func makeKey(len int) []byte {
|
||||
b := make([]byte, len)
|
||||
if _, err := rand.Read(b); err != nil {
|
||||
log.Fatalf("rand.Read: %v", err)
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
func main() {
|
||||
var host = flag.String("host", "127.0.0.1", "memcached host")
|
||||
var port = flag.Int("port", 11211, "memcached port")
|
||||
var cipher = flag.String("cipher", "aes-128-cbc", "cipher for TLS ticket encryption")
|
||||
var interval = flag.Int("interval", 3600, "interval to update TLS ticket keys")
|
||||
|
||||
flag.Parse()
|
||||
|
||||
var keylen int
|
||||
switch *cipher {
|
||||
case "aes-128-cbc":
|
||||
keylen = 48
|
||||
case "aes-256-cbc":
|
||||
keylen = 80
|
||||
default:
|
||||
log.Fatalf("cipher: unknown cipher %v", cipher)
|
||||
}
|
||||
|
||||
mc := memcache.New(fmt.Sprintf("%v:%v", *host, *port))
|
||||
|
||||
keys := [][]byte{
|
||||
makeKey(keylen), // current encryption key
|
||||
makeKey(keylen), // next encryption key; now decryption only
|
||||
}
|
||||
|
||||
for {
|
||||
buf := new(bytes.Buffer)
|
||||
if err := binary.Write(buf, binary.BigEndian, uint32(1)); err != nil {
|
||||
log.Fatalf("failed to write version: %v", err)
|
||||
}
|
||||
|
||||
for _, key := range keys {
|
||||
if err := binary.Write(buf, binary.BigEndian, uint16(keylen)); err != nil {
|
||||
log.Fatalf("failed to write length: %v", err)
|
||||
}
|
||||
if _, err := buf.Write(key); err != nil {
|
||||
log.Fatalf("buf.Write: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
mc.Set(&memcache.Item{
|
||||
Key: "nghttpx:tls-ticket-key",
|
||||
Value: buf.Bytes(),
|
||||
Expiration: int32((*interval) + 300),
|
||||
})
|
||||
|
||||
<-time.After(time.Duration(*interval) * time.Second)
|
||||
|
||||
// rotate keys. the last key is now encryption key.
|
||||
// generate new key and append it to the last, so that
|
||||
// we can at least decrypt TLS ticket encrypted by new
|
||||
// key on the host which does not get new key yet.
|
||||
// keep at most past 11 keys as decryption only key
|
||||
n := len(keys) + 1
|
||||
if n > 13 {
|
||||
n = 13
|
||||
}
|
||||
newKeys := make([][]byte, n)
|
||||
newKeys[0] = keys[len(keys)-1]
|
||||
copy(newKeys[1:], keys[0:n-2])
|
||||
newKeys[n-1] = makeKey(keylen)
|
||||
|
||||
keys = newKeys
|
||||
}
|
||||
|
||||
}
|
||||
16
contrib/usr.sbin.nghttpx
Normal file
16
contrib/usr.sbin.nghttpx
Normal file
@@ -0,0 +1,16 @@
|
||||
#include <tunables/global>
|
||||
|
||||
/usr/sbin/nghttpx {
|
||||
#include <abstractions/base>
|
||||
#include <abstractions/nameservice>
|
||||
#include <abstractions/openssl>
|
||||
|
||||
capability setgid,
|
||||
capability setuid,
|
||||
|
||||
/usr/sbin/nghttpx rmix, # allow to run itself
|
||||
/etc/nghttpx/nghttpx.conf r, # allow to read the config file
|
||||
/etc/ssl/** r, # give access to ssl keys
|
||||
|
||||
/{,var/}run/nghttpx.pid lw, # allow to store a pid file
|
||||
}
|
||||
18
doc/.gitignore
vendored
18
doc/.gitignore
vendored
@@ -1,3 +1,19 @@
|
||||
# generated files
|
||||
apiref.rst
|
||||
building-android-binary.rst
|
||||
conf.py
|
||||
manual
|
||||
contribute.rst
|
||||
enums.rst
|
||||
h2load-howto.rst
|
||||
index.rst
|
||||
macros.rst
|
||||
manual/
|
||||
nghttp2.h.rst
|
||||
nghttp2_*.rst
|
||||
nghttp2ver.h.rst
|
||||
nghttpx-howto.rst
|
||||
package_README.rst
|
||||
tutorial-client.rst
|
||||
tutorial-hpack.rst
|
||||
tutorial-server.rst
|
||||
types.rst
|
||||
|
||||
352
doc/CMakeLists.txt
Normal file
352
doc/CMakeLists.txt
Normal file
@@ -0,0 +1,352 @@
|
||||
# Generated documents
|
||||
set(APIDOCS
|
||||
macros.rst
|
||||
enums.rst
|
||||
types.rst
|
||||
nghttp2_check_header_name.rst
|
||||
nghttp2_check_header_value.rst
|
||||
nghttp2_hd_deflate_bound.rst
|
||||
nghttp2_hd_deflate_change_table_size.rst
|
||||
nghttp2_hd_deflate_del.rst
|
||||
nghttp2_hd_deflate_get_dynamic_table_size.rst
|
||||
nghttp2_hd_deflate_get_max_dynamic_table_size.rst
|
||||
nghttp2_hd_deflate_get_num_table_entries.rst
|
||||
nghttp2_hd_deflate_get_table_entry.rst
|
||||
nghttp2_hd_deflate_hd.rst
|
||||
nghttp2_hd_deflate_hd_vec.rst
|
||||
nghttp2_hd_deflate_new.rst
|
||||
nghttp2_hd_deflate_new2.rst
|
||||
nghttp2_hd_inflate_change_table_size.rst
|
||||
nghttp2_hd_inflate_del.rst
|
||||
nghttp2_hd_inflate_end_headers.rst
|
||||
nghttp2_hd_inflate_get_dynamic_table_size.rst
|
||||
nghttp2_hd_inflate_get_max_dynamic_table_size.rst
|
||||
nghttp2_hd_inflate_get_num_table_entries.rst
|
||||
nghttp2_hd_inflate_get_table_entry.rst
|
||||
nghttp2_hd_inflate_hd.rst
|
||||
nghttp2_hd_inflate_hd2.rst
|
||||
nghttp2_hd_inflate_new.rst
|
||||
nghttp2_hd_inflate_new2.rst
|
||||
nghttp2_http2_strerror.rst
|
||||
nghttp2_is_fatal.rst
|
||||
nghttp2_nv_compare_name.rst
|
||||
nghttp2_option_del.rst
|
||||
nghttp2_option_new.rst
|
||||
nghttp2_option_set_builtin_recv_extension_type.rst
|
||||
nghttp2_option_set_max_deflate_dynamic_table_size.rst
|
||||
nghttp2_option_set_max_reserved_remote_streams.rst
|
||||
nghttp2_option_set_max_send_header_block_length.rst
|
||||
nghttp2_option_set_no_auto_ping_ack.rst
|
||||
nghttp2_option_set_no_auto_window_update.rst
|
||||
nghttp2_option_set_no_http_messaging.rst
|
||||
nghttp2_option_set_no_recv_client_magic.rst
|
||||
nghttp2_option_set_peer_max_concurrent_streams.rst
|
||||
nghttp2_option_set_user_recv_extension_type.rst
|
||||
nghttp2_option_set_max_settings.rst
|
||||
nghttp2_pack_settings_payload.rst
|
||||
nghttp2_priority_spec_check_default.rst
|
||||
nghttp2_priority_spec_default_init.rst
|
||||
nghttp2_priority_spec_init.rst
|
||||
nghttp2_rcbuf_decref.rst
|
||||
nghttp2_rcbuf_get_buf.rst
|
||||
nghttp2_rcbuf_incref.rst
|
||||
nghttp2_rcbuf_is_static.rst
|
||||
nghttp2_select_next_protocol.rst
|
||||
nghttp2_session_callbacks_del.rst
|
||||
nghttp2_session_callbacks_new.rst
|
||||
nghttp2_session_callbacks_set_before_frame_send_callback.rst
|
||||
nghttp2_session_callbacks_set_data_source_read_length_callback.rst
|
||||
nghttp2_session_callbacks_set_error_callback.rst
|
||||
nghttp2_session_callbacks_set_on_begin_frame_callback.rst
|
||||
nghttp2_session_callbacks_set_on_begin_headers_callback.rst
|
||||
nghttp2_session_callbacks_set_on_data_chunk_recv_callback.rst
|
||||
nghttp2_session_callbacks_set_on_extension_chunk_recv_callback.rst
|
||||
nghttp2_session_callbacks_set_on_frame_not_send_callback.rst
|
||||
nghttp2_session_callbacks_set_on_frame_recv_callback.rst
|
||||
nghttp2_session_callbacks_set_on_frame_send_callback.rst
|
||||
nghttp2_session_callbacks_set_on_header_callback.rst
|
||||
nghttp2_session_callbacks_set_on_header_callback2.rst
|
||||
nghttp2_session_callbacks_set_on_invalid_frame_recv_callback.rst
|
||||
nghttp2_session_callbacks_set_on_invalid_header_callback.rst
|
||||
nghttp2_session_callbacks_set_on_invalid_header_callback2.rst
|
||||
nghttp2_session_callbacks_set_on_stream_close_callback.rst
|
||||
nghttp2_session_callbacks_set_pack_extension_callback.rst
|
||||
nghttp2_session_callbacks_set_recv_callback.rst
|
||||
nghttp2_session_callbacks_set_select_padding_callback.rst
|
||||
nghttp2_session_callbacks_set_send_callback.rst
|
||||
nghttp2_session_callbacks_set_send_data_callback.rst
|
||||
nghttp2_session_callbacks_set_unpack_extension_callback.rst
|
||||
nghttp2_session_change_stream_priority.rst
|
||||
nghttp2_session_check_request_allowed.rst
|
||||
nghttp2_session_check_server_session.rst
|
||||
nghttp2_session_client_new.rst
|
||||
nghttp2_session_client_new2.rst
|
||||
nghttp2_session_client_new3.rst
|
||||
nghttp2_session_consume.rst
|
||||
nghttp2_session_consume_connection.rst
|
||||
nghttp2_session_consume_stream.rst
|
||||
nghttp2_session_create_idle_stream.rst
|
||||
nghttp2_session_del.rst
|
||||
nghttp2_session_find_stream.rst
|
||||
nghttp2_session_get_effective_local_window_size.rst
|
||||
nghttp2_session_get_effective_recv_data_length.rst
|
||||
nghttp2_session_get_hd_deflate_dynamic_table_size.rst
|
||||
nghttp2_session_get_hd_inflate_dynamic_table_size.rst
|
||||
nghttp2_session_get_last_proc_stream_id.rst
|
||||
nghttp2_session_get_local_settings.rst
|
||||
nghttp2_session_get_local_window_size.rst
|
||||
nghttp2_session_get_next_stream_id.rst
|
||||
nghttp2_session_get_outbound_queue_size.rst
|
||||
nghttp2_session_get_remote_settings.rst
|
||||
nghttp2_session_get_remote_window_size.rst
|
||||
nghttp2_session_get_root_stream.rst
|
||||
nghttp2_session_get_stream_effective_local_window_size.rst
|
||||
nghttp2_session_get_stream_effective_recv_data_length.rst
|
||||
nghttp2_session_get_stream_local_close.rst
|
||||
nghttp2_session_get_stream_local_window_size.rst
|
||||
nghttp2_session_get_stream_remote_close.rst
|
||||
nghttp2_session_get_stream_remote_window_size.rst
|
||||
nghttp2_session_get_stream_user_data.rst
|
||||
nghttp2_session_mem_recv.rst
|
||||
nghttp2_session_mem_send.rst
|
||||
nghttp2_session_recv.rst
|
||||
nghttp2_session_resume_data.rst
|
||||
nghttp2_session_send.rst
|
||||
nghttp2_session_server_new.rst
|
||||
nghttp2_session_server_new2.rst
|
||||
nghttp2_session_server_new3.rst
|
||||
nghttp2_session_set_local_window_size.rst
|
||||
nghttp2_session_set_next_stream_id.rst
|
||||
nghttp2_session_set_stream_user_data.rst
|
||||
nghttp2_session_terminate_session.rst
|
||||
nghttp2_session_terminate_session2.rst
|
||||
nghttp2_session_upgrade.rst
|
||||
nghttp2_session_upgrade2.rst
|
||||
nghttp2_session_want_read.rst
|
||||
nghttp2_session_want_write.rst
|
||||
nghttp2_set_debug_vprintf_callback.rst
|
||||
nghttp2_stream_get_first_child.rst
|
||||
nghttp2_stream_get_next_sibling.rst
|
||||
nghttp2_stream_get_parent.rst
|
||||
nghttp2_stream_get_previous_sibling.rst
|
||||
nghttp2_stream_get_state.rst
|
||||
nghttp2_stream_get_sum_dependency_weight.rst
|
||||
nghttp2_stream_get_weight.rst
|
||||
nghttp2_strerror.rst
|
||||
nghttp2_submit_altsvc.rst
|
||||
nghttp2_submit_data.rst
|
||||
nghttp2_submit_extension.rst
|
||||
nghttp2_submit_goaway.rst
|
||||
nghttp2_submit_headers.rst
|
||||
nghttp2_submit_ping.rst
|
||||
nghttp2_submit_priority.rst
|
||||
nghttp2_submit_push_promise.rst
|
||||
nghttp2_submit_request.rst
|
||||
nghttp2_submit_response.rst
|
||||
nghttp2_submit_rst_stream.rst
|
||||
nghttp2_submit_settings.rst
|
||||
nghttp2_submit_shutdown_notice.rst
|
||||
nghttp2_submit_trailer.rst
|
||||
nghttp2_submit_window_update.rst
|
||||
nghttp2_version.rst
|
||||
)
|
||||
|
||||
set(MAN_PAGES
|
||||
nghttp.1
|
||||
nghttpd.1
|
||||
nghttpx.1
|
||||
h2load.1
|
||||
)
|
||||
|
||||
# Other .rst files from the source tree that need to be copied
|
||||
# XXX move them to sources/ and create .in files?
|
||||
set(RST_FILES
|
||||
README.rst
|
||||
programmers-guide.rst
|
||||
nghttp.1.rst
|
||||
nghttpd.1.rst
|
||||
nghttpx.1.rst
|
||||
h2load.1.rst
|
||||
)
|
||||
|
||||
# XXX unused for now
|
||||
set(EXTRA_DIST
|
||||
mkapiref.py
|
||||
${RST_FILES}
|
||||
${APIDOCS}
|
||||
sources/index.rst
|
||||
sources/tutorial-client.rst
|
||||
sources/tutorial-server.rst
|
||||
sources/tutorial-hpack.rst
|
||||
sources/nghttpx-howto.rst
|
||||
sources/h2load-howto.rst
|
||||
sources/building-android-binary.rst
|
||||
sources/contribute.rst
|
||||
_exts/rubydomain/LICENSE.rubydomain
|
||||
_exts/rubydomain/__init__.py
|
||||
_exts/rubydomain/rubydomain.py
|
||||
_themes/sphinx_rtd_theme/__init__.py
|
||||
_themes/sphinx_rtd_theme/breadcrumbs.html
|
||||
_themes/sphinx_rtd_theme/footer.html
|
||||
_themes/sphinx_rtd_theme/layout.html
|
||||
_themes/sphinx_rtd_theme/layout_old.html
|
||||
_themes/sphinx_rtd_theme/search.html
|
||||
_themes/sphinx_rtd_theme/searchbox.html
|
||||
_themes/sphinx_rtd_theme/static/css/badge_only.css
|
||||
_themes/sphinx_rtd_theme/static/css/theme.css
|
||||
_themes/sphinx_rtd_theme/static/fonts/FontAwesome.otf
|
||||
_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.eot
|
||||
_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.svg
|
||||
_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.ttf
|
||||
_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.woff
|
||||
_themes/sphinx_rtd_theme/static/js/theme.js
|
||||
_themes/sphinx_rtd_theme/theme.conf
|
||||
_themes/sphinx_rtd_theme/versions.html
|
||||
${MAN_PAGES}
|
||||
bash_completion/nghttp
|
||||
bash_completion/nghttpd
|
||||
bash_completion/nghttpx
|
||||
bash_completion/h2load
|
||||
)
|
||||
|
||||
# Based on Makefile for Sphinx documentation
|
||||
|
||||
# You can set these variables from the command line.
|
||||
set(SPHINXOPTS)
|
||||
set(SPHINXBUILD sphinx-build)
|
||||
set(PAPER)
|
||||
set(BUILDDIR manual)
|
||||
|
||||
# Internal variables.
|
||||
set(PAPEROPT_a4 -D latex_paper_size=a4)
|
||||
set(PAPEROPT_letter -D latex_paper_size=letter)
|
||||
set(ALLSPHINXOPTS -d ${BUILDDIR}/doctrees ${PAPEROPT_${PAPER}} ${SPHINXOPTS} .)
|
||||
|
||||
# "Please use `make <target>' where <target> is one of"
|
||||
# " html to make standalone HTML files"
|
||||
# " dirhtml to make HTML files named index.html in directories"
|
||||
# " singlehtml to make a single large HTML file"
|
||||
# " pickle to make pickle files"
|
||||
# " json to make JSON files"
|
||||
# " htmlhelp to make HTML files and a HTML help project"
|
||||
# " qthelp to make HTML files and a qthelp project"
|
||||
# " devhelp to make HTML files and a Devhelp project"
|
||||
# " epub to make an epub"
|
||||
# " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
# " latexpdf to make LaTeX files and run them through pdflatex"
|
||||
# " text to make text files"
|
||||
# " man to make manual pages"
|
||||
# " changes to make an overview of all changed/added/deprecated items"
|
||||
# " linkcheck to check all external links for integrity"
|
||||
# " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||
|
||||
|
||||
# Copy files for out-of-tree builds
|
||||
if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
|
||||
set(RST_BUILD_FILES)
|
||||
foreach(rstfile IN LISTS RST_FILES)
|
||||
set(outfile "${CMAKE_CURRENT_BINARY_DIR}/${rstfile}")
|
||||
add_custom_command(OUTPUT "${outfile}"
|
||||
COMMAND ${CMAKE_COMMAND} -E copy
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/${rstfile}" "${outfile}"
|
||||
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${rstfile}"
|
||||
)
|
||||
list(APPEND RST_BUILD_FILES "${outfile}")
|
||||
endforeach()
|
||||
else()
|
||||
set(RST_BUILD_FILES "${RST_FILES}")
|
||||
endif()
|
||||
|
||||
set(apiref_SOURCES
|
||||
${CMAKE_BINARY_DIR}/lib/includes/nghttp2/nghttp2ver.h
|
||||
${CMAKE_SOURCE_DIR}/lib/includes/nghttp2/nghttp2.h
|
||||
)
|
||||
# Generates apiref.rst and other files
|
||||
add_custom_command(
|
||||
OUTPUT
|
||||
apiref.rst
|
||||
${APIDOCS}
|
||||
COMMAND
|
||||
"${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/mkapiref.py"
|
||||
apiref.rst macros.rst enums.rst types.rst .
|
||||
${apiref_SOURCES}
|
||||
DEPENDS
|
||||
${RST_BUILD_FILES}
|
||||
${apiref_SOURCES}
|
||||
)
|
||||
|
||||
|
||||
|
||||
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${BUILDDIR}")
|
||||
|
||||
# Invokes sphinx-build and prints the given messages when completed
|
||||
function(sphinxbuild builder)
|
||||
set(echo_commands)
|
||||
foreach(message IN LISTS ARGN)
|
||||
list(APPEND echo_commands COMMAND ${CMAKE_COMMAND} -E echo "${message}")
|
||||
endforeach()
|
||||
add_custom_target(${builder}
|
||||
COMMAND "${SPHINXBUILD}" -b ${builder} ${ALLSPHINXOPTS} "${BUILDDIR}/${builder}"
|
||||
COMMAND ${CMAKE_COMMAND} -E echo
|
||||
${echo_commands}
|
||||
VERBATIM
|
||||
DEPENDS apiref.rst
|
||||
)
|
||||
endfunction()
|
||||
|
||||
foreach(builder html dirhtml singlehtml)
|
||||
sphinxbuild(${builder}
|
||||
"Build finished. The HTML pages are in ${BUILDDIR}/${builder}.")
|
||||
endforeach()
|
||||
sphinxbuild(pickle "Build finished; now you can process the pickle files.")
|
||||
sphinxbuild(json "Build finished; now you can process the JSON files.")
|
||||
sphinxbuild(htmlhelp
|
||||
"Build finished; now you can run HTML Help Workshop with the"
|
||||
".hhp project file in ${BUILDDIR}/htmlhelp."
|
||||
)
|
||||
sphinxbuild(qthelp
|
||||
"Build finished; now you can run \"qcollectiongenerator\" with the"
|
||||
".qhcp project file in ${BUILDDIR}/qthelp, like this:"
|
||||
"# qcollectiongenerator ${BUILDDIR}/qthelp/nghttp2.qhcp"
|
||||
"To view the help file:"
|
||||
"# assistant -collectionFile ${BUILDDIR}/qthelp/nghttp2.qhc"
|
||||
)
|
||||
sphinxbuild(devhelp
|
||||
"Build finished."
|
||||
"To view the help file:"
|
||||
"# mkdir -p ~/.local/share/devhelp/nghttp2"
|
||||
"# ln -s ${BUILDDIR}/devhelp ~/.local/share/devhelp/nghttp2"
|
||||
"# devhelp"
|
||||
)
|
||||
sphinxbuild(epub "Build finished. The epub file is in ${BUILDDIR}/epub.")
|
||||
sphinxbuild(latex
|
||||
"Build finished; the LaTeX files are in ${BUILDDIR}/latex."
|
||||
"Run `make' in that directory to run these through (pdf)latex"
|
||||
"(use `make latexpdf' here to do that automatically)."
|
||||
)
|
||||
|
||||
# Invoke the Makefile generated by sphinx
|
||||
add_custom_target(latexpdf
|
||||
COMMAND ${CMAKE_COMMAND} -E echo "Running LaTeX files through pdflatex..."
|
||||
COMMAND make -C "${BUILDDIR}/latex" all-pdf
|
||||
COMMAND ${CMAKE_COMMAND} -E echo "pdflatex finished; the PDF files are in ${BUILDDIR}/latex."
|
||||
DEPENDS latex
|
||||
)
|
||||
|
||||
sphinxbuild(text "Build finished. The text files are in ${BUILDDIR}/text.")
|
||||
sphinxbuild(man "Build finished. The manual pages are in ${BUILDDIR}/man.")
|
||||
sphinxbuild(changes "The overview file is in ${BUILDDIR}/changes.")
|
||||
sphinxbuild(linkcheck
|
||||
"Link check complete; look for any errors in the above output"
|
||||
"or in ${BUILDDIR}/linkcheck/output.txt."
|
||||
)
|
||||
sphinxbuild(doctest
|
||||
"Testing of doctests in the sources finished, look at the"
|
||||
"results in ${BUILDDIR}/doctest/output.txt."
|
||||
)
|
||||
|
||||
foreach(_man_page IN LISTS MAN_PAGES)
|
||||
install(FILES ${_man_page}
|
||||
DESTINATION "${CMAKE_INSTALL_MANDIR}/man1"
|
||||
)
|
||||
endforeach()
|
||||
243
doc/Makefile.am
243
doc/Makefile.am
@@ -1,4 +1,4 @@
|
||||
# nghttp2 - HTTP/2.0 C Library
|
||||
# nghttp2 - HTTP/2 C Library
|
||||
|
||||
# Copyright (c) 2012 Tatsuhiro Tsujikawa
|
||||
|
||||
@@ -21,15 +21,229 @@
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
EXTRA_DIST = README.rst apiref-header.rst index.rst mkapiref.py \
|
||||
package_README.rst _static/default2.css _templates/menu.html
|
||||
man_MANS = nghttp.1 nghttpd.1 nghttpx.1 h2load.1
|
||||
|
||||
APIDOCS= \
|
||||
macros.rst \
|
||||
enums.rst \
|
||||
types.rst \
|
||||
nghttp2_check_authority.rst \
|
||||
nghttp2_check_header_name.rst \
|
||||
nghttp2_check_header_value.rst \
|
||||
nghttp2_check_header_value_rfc9113.rst \
|
||||
nghttp2_check_method.rst \
|
||||
nghttp2_check_path.rst \
|
||||
nghttp2_extpri_parse_priority.rst \
|
||||
nghttp2_hd_deflate_bound.rst \
|
||||
nghttp2_hd_deflate_change_table_size.rst \
|
||||
nghttp2_hd_deflate_del.rst \
|
||||
nghttp2_hd_deflate_get_dynamic_table_size.rst \
|
||||
nghttp2_hd_deflate_get_max_dynamic_table_size.rst \
|
||||
nghttp2_hd_deflate_get_num_table_entries.rst \
|
||||
nghttp2_hd_deflate_get_table_entry.rst \
|
||||
nghttp2_hd_deflate_hd.rst \
|
||||
nghttp2_hd_deflate_hd2.rst \
|
||||
nghttp2_hd_deflate_hd_vec.rst \
|
||||
nghttp2_hd_deflate_hd_vec2.rst \
|
||||
nghttp2_hd_deflate_new.rst \
|
||||
nghttp2_hd_deflate_new2.rst \
|
||||
nghttp2_hd_inflate_change_table_size.rst \
|
||||
nghttp2_hd_inflate_del.rst \
|
||||
nghttp2_hd_inflate_end_headers.rst \
|
||||
nghttp2_hd_inflate_get_dynamic_table_size.rst \
|
||||
nghttp2_hd_inflate_get_max_dynamic_table_size.rst \
|
||||
nghttp2_hd_inflate_get_num_table_entries.rst \
|
||||
nghttp2_hd_inflate_get_table_entry.rst \
|
||||
nghttp2_hd_inflate_hd.rst \
|
||||
nghttp2_hd_inflate_hd2.rst \
|
||||
nghttp2_hd_inflate_hd3.rst \
|
||||
nghttp2_hd_inflate_new.rst \
|
||||
nghttp2_hd_inflate_new2.rst \
|
||||
nghttp2_http2_strerror.rst \
|
||||
nghttp2_is_fatal.rst \
|
||||
nghttp2_nv_compare_name.rst \
|
||||
nghttp2_option_del.rst \
|
||||
nghttp2_option_new.rst \
|
||||
nghttp2_option_set_builtin_recv_extension_type.rst \
|
||||
nghttp2_option_set_max_deflate_dynamic_table_size.rst \
|
||||
nghttp2_option_set_max_reserved_remote_streams.rst \
|
||||
nghttp2_option_set_max_send_header_block_length.rst \
|
||||
nghttp2_option_set_no_auto_ping_ack.rst \
|
||||
nghttp2_option_set_no_auto_window_update.rst \
|
||||
nghttp2_option_set_no_closed_streams.rst \
|
||||
nghttp2_option_set_no_http_messaging.rst \
|
||||
nghttp2_option_set_no_recv_client_magic.rst \
|
||||
nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation.rst \
|
||||
nghttp2_option_set_peer_max_concurrent_streams.rst \
|
||||
nghttp2_option_set_server_fallback_rfc7540_priorities.rst \
|
||||
nghttp2_option_set_user_recv_extension_type.rst \
|
||||
nghttp2_option_set_max_continuations.rst \
|
||||
nghttp2_option_set_max_outbound_ack.rst \
|
||||
nghttp2_option_set_max_settings.rst \
|
||||
nghttp2_option_set_stream_reset_rate_limit.rst \
|
||||
nghttp2_option_set_glitch_rate_limit.rst \
|
||||
nghttp2_pack_settings_payload.rst \
|
||||
nghttp2_pack_settings_payload2.rst \
|
||||
nghttp2_priority_spec_check_default.rst \
|
||||
nghttp2_priority_spec_default_init.rst \
|
||||
nghttp2_priority_spec_init.rst \
|
||||
nghttp2_rcbuf_decref.rst \
|
||||
nghttp2_rcbuf_get_buf.rst \
|
||||
nghttp2_rcbuf_incref.rst \
|
||||
nghttp2_rcbuf_is_static.rst \
|
||||
nghttp2_select_next_protocol.rst \
|
||||
nghttp2_select_alpn.rst \
|
||||
nghttp2_session_callbacks_del.rst \
|
||||
nghttp2_session_callbacks_new.rst \
|
||||
nghttp2_session_callbacks_set_before_frame_send_callback.rst \
|
||||
nghttp2_session_callbacks_set_data_source_read_length_callback.rst \
|
||||
nghttp2_session_callbacks_set_data_source_read_length_callback2.rst \
|
||||
nghttp2_session_callbacks_set_error_callback.rst \
|
||||
nghttp2_session_callbacks_set_error_callback2.rst \
|
||||
nghttp2_session_callbacks_set_on_begin_frame_callback.rst \
|
||||
nghttp2_session_callbacks_set_on_begin_headers_callback.rst \
|
||||
nghttp2_session_callbacks_set_on_data_chunk_recv_callback.rst \
|
||||
nghttp2_session_callbacks_set_on_extension_chunk_recv_callback.rst \
|
||||
nghttp2_session_callbacks_set_on_frame_not_send_callback.rst \
|
||||
nghttp2_session_callbacks_set_on_frame_recv_callback.rst \
|
||||
nghttp2_session_callbacks_set_on_frame_send_callback.rst \
|
||||
nghttp2_session_callbacks_set_on_header_callback.rst \
|
||||
nghttp2_session_callbacks_set_on_header_callback2.rst \
|
||||
nghttp2_session_callbacks_set_on_invalid_frame_recv_callback.rst \
|
||||
nghttp2_session_callbacks_set_on_invalid_header_callback.rst \
|
||||
nghttp2_session_callbacks_set_on_invalid_header_callback2.rst \
|
||||
nghttp2_session_callbacks_set_on_stream_close_callback.rst \
|
||||
nghttp2_session_callbacks_set_pack_extension_callback.rst \
|
||||
nghttp2_session_callbacks_set_pack_extension_callback2.rst \
|
||||
nghttp2_session_callbacks_set_rand_callback.rst \
|
||||
nghttp2_session_callbacks_set_recv_callback.rst \
|
||||
nghttp2_session_callbacks_set_recv_callback2.rst \
|
||||
nghttp2_session_callbacks_set_select_padding_callback.rst \
|
||||
nghttp2_session_callbacks_set_select_padding_callback2.rst \
|
||||
nghttp2_session_callbacks_set_send_callback.rst \
|
||||
nghttp2_session_callbacks_set_send_callback2.rst \
|
||||
nghttp2_session_callbacks_set_send_data_callback.rst \
|
||||
nghttp2_session_callbacks_set_unpack_extension_callback.rst \
|
||||
nghttp2_session_change_extpri_stream_priority.rst \
|
||||
nghttp2_session_change_stream_priority.rst \
|
||||
nghttp2_session_check_request_allowed.rst \
|
||||
nghttp2_session_check_server_session.rst \
|
||||
nghttp2_session_client_new.rst \
|
||||
nghttp2_session_client_new2.rst \
|
||||
nghttp2_session_client_new3.rst \
|
||||
nghttp2_session_consume.rst \
|
||||
nghttp2_session_consume_connection.rst \
|
||||
nghttp2_session_consume_stream.rst \
|
||||
nghttp2_session_create_idle_stream.rst \
|
||||
nghttp2_session_del.rst \
|
||||
nghttp2_session_find_stream.rst \
|
||||
nghttp2_session_get_effective_local_window_size.rst \
|
||||
nghttp2_session_get_effective_recv_data_length.rst \
|
||||
nghttp2_session_get_extpri_stream_priority.rst \
|
||||
nghttp2_session_get_hd_deflate_dynamic_table_size.rst \
|
||||
nghttp2_session_get_hd_inflate_dynamic_table_size.rst \
|
||||
nghttp2_session_get_last_proc_stream_id.rst \
|
||||
nghttp2_session_get_local_settings.rst \
|
||||
nghttp2_session_get_local_window_size.rst \
|
||||
nghttp2_session_get_next_stream_id.rst \
|
||||
nghttp2_session_get_outbound_queue_size.rst \
|
||||
nghttp2_session_get_remote_settings.rst \
|
||||
nghttp2_session_get_remote_window_size.rst \
|
||||
nghttp2_session_get_root_stream.rst \
|
||||
nghttp2_session_get_stream_effective_local_window_size.rst \
|
||||
nghttp2_session_get_stream_effective_recv_data_length.rst \
|
||||
nghttp2_session_get_stream_local_close.rst \
|
||||
nghttp2_session_get_stream_local_window_size.rst \
|
||||
nghttp2_session_get_stream_remote_close.rst \
|
||||
nghttp2_session_get_stream_remote_window_size.rst \
|
||||
nghttp2_session_get_stream_user_data.rst \
|
||||
nghttp2_session_mem_recv.rst \
|
||||
nghttp2_session_mem_recv2.rst \
|
||||
nghttp2_session_mem_send.rst \
|
||||
nghttp2_session_mem_send2.rst \
|
||||
nghttp2_session_recv.rst \
|
||||
nghttp2_session_resume_data.rst \
|
||||
nghttp2_session_send.rst \
|
||||
nghttp2_session_server_new.rst \
|
||||
nghttp2_session_server_new2.rst \
|
||||
nghttp2_session_server_new3.rst \
|
||||
nghttp2_session_set_local_window_size.rst \
|
||||
nghttp2_session_set_next_stream_id.rst \
|
||||
nghttp2_session_set_stream_user_data.rst \
|
||||
nghttp2_session_set_user_data.rst \
|
||||
nghttp2_session_terminate_session.rst \
|
||||
nghttp2_session_terminate_session2.rst \
|
||||
nghttp2_session_upgrade.rst \
|
||||
nghttp2_session_upgrade2.rst \
|
||||
nghttp2_session_want_read.rst \
|
||||
nghttp2_session_want_write.rst \
|
||||
nghttp2_set_debug_vprintf_callback.rst \
|
||||
nghttp2_stream_get_first_child.rst \
|
||||
nghttp2_stream_get_next_sibling.rst \
|
||||
nghttp2_stream_get_parent.rst \
|
||||
nghttp2_stream_get_previous_sibling.rst \
|
||||
nghttp2_stream_get_state.rst \
|
||||
nghttp2_stream_get_sum_dependency_weight.rst \
|
||||
nghttp2_stream_get_weight.rst \
|
||||
nghttp2_strerror.rst \
|
||||
nghttp2_submit_altsvc.rst \
|
||||
nghttp2_submit_data.rst \
|
||||
nghttp2_submit_data2.rst \
|
||||
nghttp2_submit_extension.rst \
|
||||
nghttp2_submit_goaway.rst \
|
||||
nghttp2_submit_headers.rst \
|
||||
nghttp2_submit_origin.rst \
|
||||
nghttp2_submit_ping.rst \
|
||||
nghttp2_submit_priority.rst \
|
||||
nghttp2_submit_priority_update.rst \
|
||||
nghttp2_submit_push_promise.rst \
|
||||
nghttp2_submit_request.rst \
|
||||
nghttp2_submit_request2.rst \
|
||||
nghttp2_submit_response.rst \
|
||||
nghttp2_submit_response2.rst \
|
||||
nghttp2_submit_rst_stream.rst \
|
||||
nghttp2_submit_settings.rst \
|
||||
nghttp2_submit_shutdown_notice.rst \
|
||||
nghttp2_submit_trailer.rst \
|
||||
nghttp2_submit_window_update.rst \
|
||||
nghttp2_version.rst
|
||||
|
||||
RST_FILES = \
|
||||
README.rst \
|
||||
programmers-guide.rst \
|
||||
nghttp.1.rst \
|
||||
nghttpd.1.rst \
|
||||
nghttpx.1.rst \
|
||||
h2load.1.rst
|
||||
|
||||
EXTRA_DIST = \
|
||||
CMakeLists.txt \
|
||||
mkapiref.py \
|
||||
$(RST_FILES) \
|
||||
$(APIDOCS) \
|
||||
sources/index.rst \
|
||||
sources/tutorial-client.rst \
|
||||
sources/tutorial-server.rst \
|
||||
sources/tutorial-hpack.rst \
|
||||
sources/nghttpx-howto.rst \
|
||||
sources/h2load-howto.rst \
|
||||
sources/building-android-binary.rst \
|
||||
sources/contribute.rst \
|
||||
_exts/rubydomain/LICENSE.rubydomain \
|
||||
_exts/rubydomain/__init__.py \
|
||||
_exts/rubydomain/rubydomain.py \
|
||||
$(man_MANS) \
|
||||
bash_completion/nghttp \
|
||||
bash_completion/nghttpd \
|
||||
bash_completion/nghttpx \
|
||||
bash_completion/h2load
|
||||
|
||||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
SPHINXBUILD ?= sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = manual
|
||||
|
||||
@@ -59,15 +273,22 @@ help:
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||
|
||||
apiref.rst: $(top_builddir)/lib/includes/nghttp2/nghttp2ver.h \
|
||||
$(top_builddir)/lib/includes/nghttp2/nghttp2.h
|
||||
$(PYTHON) $(builddir)/mkapiref.py --header apiref-header.rst $^ > $@
|
||||
apiref.rst: \
|
||||
$(top_builddir)/lib/includes/nghttp2/nghttp2ver.h \
|
||||
$(top_srcdir)/lib/includes/nghttp2/nghttp2.h
|
||||
for i in $(RST_FILES); do [ -e $(builddir)/$$i ] || cp $(srcdir)/$$i $(builddir); done
|
||||
$(PYTHON) $(top_srcdir)/doc/mkapiref.py \
|
||||
apiref.rst macros.rst enums.rst types.rst . $^
|
||||
|
||||
clean:
|
||||
-rm apiref.rst
|
||||
$(APIDOCS): apiref.rst
|
||||
|
||||
clean-local:
|
||||
if [ $(srcdir) != $(builddir) ]; then for i in $(RST_FILES); do rm -f $(builddir)/$$i; done fi
|
||||
-rm -f apiref.rst
|
||||
-rm -f $(APIDOCS)
|
||||
-rm -rf $(BUILDDIR)/*
|
||||
|
||||
html: apiref.rst
|
||||
html-local: apiref.rst
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
@@ -139,7 +360,7 @@ text:
|
||||
@echo
|
||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||
|
||||
man:
|
||||
man: apiref.rst
|
||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||
@echo
|
||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||
|
||||
@@ -22,7 +22,7 @@ starts with ``/**``. In other words, it only processes the comment
|
||||
block starting ``/**``. The comment block must end with ``*/``. The
|
||||
``mkapiref.py`` requires that which type of the object this comment
|
||||
block refers to. To specify the type of the object, the next line
|
||||
must contain the so-caled action keyword. Currently, the following
|
||||
must contain the so-called action keyword. Currently, the following
|
||||
action keywords are supported: ``@function``, ``@functypedef``,
|
||||
``@enum``, ``@struct`` and ``@union``. The following sections
|
||||
describes each action keyword.
|
||||
@@ -68,7 +68,7 @@ The example follows::
|
||||
* Callback function invoked when |session| wants to send data to
|
||||
* remote peer.
|
||||
*/
|
||||
typedef ssize_t (*nghttp2_send_callback)
|
||||
typedef nghttp2_ssize (*nghttp2_send_callback2)
|
||||
(nghttp2_session *session,
|
||||
const uint8_t *data, size_t length, int flags, void *user_data);
|
||||
|
||||
@@ -111,7 +111,7 @@ The example follows::
|
||||
|
||||
``@struct`` is used to refer to the struct. Currently, only struct
|
||||
typedefs are supported. The comment block is used for the document for
|
||||
the struct type itself.To document each member, put comment block
|
||||
the struct type itself. To document each member, put comment block
|
||||
starting with the line ``/**`` and ending with the ``*/`` just before
|
||||
the member. When the line starts with ``}`` is encountered, the
|
||||
``mkapiref.py`` extracts strings next to ``}`` as the name of struct.
|
||||
|
||||
28
doc/_exts/rubydomain/LICENSE.rubydomain
Normal file
28
doc/_exts/rubydomain/LICENSE.rubydomain
Normal file
@@ -0,0 +1,28 @@
|
||||
If not otherwise noted, the extensions in this package are licensed
|
||||
under the following license.
|
||||
|
||||
Copyright (c) 2010 by the contributors (see AUTHORS file).
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
0
doc/_exts/rubydomain/__init__.py
Normal file
0
doc/_exts/rubydomain/__init__.py
Normal file
703
doc/_exts/rubydomain/rubydomain.py
Normal file
703
doc/_exts/rubydomain/rubydomain.py
Normal file
@@ -0,0 +1,703 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
sphinx.domains.ruby
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The Ruby domain.
|
||||
|
||||
:copyright: Copyright 2010 by SHIBUKAWA Yoshiki
|
||||
:license: BSD, see LICENSE for details.
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
from docutils import nodes
|
||||
from docutils.parsers.rst import directives
|
||||
from docutils.parsers.rst import Directive
|
||||
|
||||
from sphinx import addnodes
|
||||
from sphinx import version_info
|
||||
from sphinx.roles import XRefRole
|
||||
from sphinx.locale import _
|
||||
from sphinx.domains import Domain, ObjType, Index
|
||||
from sphinx.directives import ObjectDescription
|
||||
from sphinx.util.nodes import make_refnode
|
||||
from sphinx.util.docfields import Field, GroupedField, TypedField
|
||||
|
||||
# REs for Ruby signatures
|
||||
rb_sig_re = re.compile(
|
||||
r'''^ ([\w.]*\.)? # class name(s)
|
||||
(\$?\w+\??!?) \s* # thing name
|
||||
(?: \((.*)\) # optional: arguments
|
||||
(?:\s* -> \s* (.*))? # return annotation
|
||||
)? $ # and nothing more
|
||||
''', re.VERBOSE)
|
||||
|
||||
rb_paramlist_re = re.compile(r'([\[\],])') # split at '[', ']' and ','
|
||||
|
||||
separators = {
|
||||
'method':'#', 'attr_reader':'#', 'attr_writer':'#', 'attr_accessor':'#',
|
||||
'function':'.', 'classmethod':'.', 'class':'::', 'module':'::',
|
||||
'global':'', 'const':'::'}
|
||||
|
||||
rb_separator = re.compile(r"(?:\w+)?(?:::)?(?:\.)?(?:#)?")
|
||||
|
||||
|
||||
def _iteritems(d):
|
||||
|
||||
for k in d:
|
||||
yield k, d[k]
|
||||
|
||||
|
||||
def ruby_rsplit(fullname):
|
||||
items = [item for item in rb_separator.findall(fullname)]
|
||||
return ''.join(items[:-2]), items[-1]
|
||||
|
||||
|
||||
class RubyObject(ObjectDescription):
|
||||
"""
|
||||
Description of a general Ruby object.
|
||||
"""
|
||||
option_spec = {
|
||||
'noindex': directives.flag,
|
||||
'module': directives.unchanged,
|
||||
}
|
||||
|
||||
doc_field_types = [
|
||||
TypedField('parameter', label=_('Parameters'),
|
||||
names=('param', 'parameter', 'arg', 'argument'),
|
||||
typerolename='obj', typenames=('paramtype', 'type')),
|
||||
TypedField('variable', label=_('Variables'), rolename='obj',
|
||||
names=('var', 'ivar', 'cvar'),
|
||||
typerolename='obj', typenames=('vartype',)),
|
||||
GroupedField('exceptions', label=_('Raises'), rolename='exc',
|
||||
names=('raises', 'raise', 'exception', 'except'),
|
||||
can_collapse=True),
|
||||
Field('returnvalue', label=_('Returns'), has_arg=False,
|
||||
names=('returns', 'return')),
|
||||
Field('returntype', label=_('Return type'), has_arg=False,
|
||||
names=('rtype',)),
|
||||
]
|
||||
|
||||
def get_signature_prefix(self, sig):
|
||||
"""
|
||||
May return a prefix to put before the object name in the signature.
|
||||
"""
|
||||
return ''
|
||||
|
||||
def needs_arglist(self):
|
||||
"""
|
||||
May return true if an empty argument list is to be generated even if
|
||||
the document contains none.
|
||||
"""
|
||||
return False
|
||||
|
||||
def handle_signature(self, sig, signode):
|
||||
"""
|
||||
Transform a Ruby signature into RST nodes.
|
||||
Returns (fully qualified name of the thing, classname if any).
|
||||
|
||||
If inside a class, the current class name is handled intelligently:
|
||||
* it is stripped from the displayed name if present
|
||||
* it is added to the full name (return value) if not present
|
||||
"""
|
||||
m = rb_sig_re.match(sig)
|
||||
if m is None:
|
||||
raise ValueError
|
||||
name_prefix, name, arglist, retann = m.groups()
|
||||
if not name_prefix:
|
||||
name_prefix = ""
|
||||
# determine module and class name (if applicable), as well as full name
|
||||
modname = self.options.get(
|
||||
'module', self.env.temp_data.get('rb:module'))
|
||||
classname = self.env.temp_data.get('rb:class')
|
||||
if self.objtype == 'global':
|
||||
add_module = False
|
||||
modname = None
|
||||
classname = None
|
||||
fullname = name
|
||||
elif classname:
|
||||
add_module = False
|
||||
if name_prefix and name_prefix.startswith(classname):
|
||||
fullname = name_prefix + name
|
||||
# class name is given again in the signature
|
||||
name_prefix = name_prefix[len(classname):].lstrip('.')
|
||||
else:
|
||||
separator = separators[self.objtype]
|
||||
fullname = classname + separator + name_prefix + name
|
||||
else:
|
||||
add_module = True
|
||||
if name_prefix:
|
||||
classname = name_prefix.rstrip('.')
|
||||
fullname = name_prefix + name
|
||||
else:
|
||||
classname = ''
|
||||
fullname = name
|
||||
|
||||
signode['module'] = modname
|
||||
signode['class'] = self.class_name = classname
|
||||
signode['fullname'] = fullname
|
||||
|
||||
sig_prefix = self.get_signature_prefix(sig)
|
||||
if sig_prefix:
|
||||
signode += addnodes.desc_annotation(sig_prefix, sig_prefix)
|
||||
|
||||
if name_prefix:
|
||||
signode += addnodes.desc_addname(name_prefix, name_prefix)
|
||||
# exceptions are a special case, since they are documented in the
|
||||
# 'exceptions' module.
|
||||
elif add_module and self.env.config.add_module_names:
|
||||
if self.objtype == 'global':
|
||||
nodetext = ''
|
||||
signode += addnodes.desc_addname(nodetext, nodetext)
|
||||
else:
|
||||
modname = self.options.get(
|
||||
'module', self.env.temp_data.get('rb:module'))
|
||||
if modname and modname != 'exceptions':
|
||||
nodetext = modname + separators[self.objtype]
|
||||
signode += addnodes.desc_addname(nodetext, nodetext)
|
||||
|
||||
signode += addnodes.desc_name(name, name)
|
||||
if not arglist:
|
||||
if self.needs_arglist():
|
||||
# for callables, add an empty parameter list
|
||||
signode += addnodes.desc_parameterlist()
|
||||
if retann:
|
||||
signode += addnodes.desc_returns(retann, retann)
|
||||
return fullname, name_prefix
|
||||
signode += addnodes.desc_parameterlist()
|
||||
|
||||
stack = [signode[-1]]
|
||||
for token in rb_paramlist_re.split(arglist):
|
||||
if token == '[':
|
||||
opt = addnodes.desc_optional()
|
||||
stack[-1] += opt
|
||||
stack.append(opt)
|
||||
elif token == ']':
|
||||
try:
|
||||
stack.pop()
|
||||
except IndexError:
|
||||
raise ValueError
|
||||
elif not token or token == ',' or token.isspace():
|
||||
pass
|
||||
else:
|
||||
token = token.strip()
|
||||
stack[-1] += addnodes.desc_parameter(token, token)
|
||||
if len(stack) != 1:
|
||||
raise ValueError
|
||||
if retann:
|
||||
signode += addnodes.desc_returns(retann, retann)
|
||||
return fullname, name_prefix
|
||||
|
||||
def get_index_text(self, modname, name):
|
||||
"""
|
||||
Return the text for the index entry of the object.
|
||||
"""
|
||||
raise NotImplementedError('must be implemented in subclasses')
|
||||
|
||||
def _is_class_member(self):
|
||||
return self.objtype.endswith('method') or self.objtype.startswith('attr')
|
||||
|
||||
def add_target_and_index(self, name_cls, sig, signode):
|
||||
if self.objtype == 'global':
|
||||
modname = ''
|
||||
else:
|
||||
modname = self.options.get(
|
||||
'module', self.env.temp_data.get('rb:module'))
|
||||
separator = separators[self.objtype]
|
||||
if self._is_class_member():
|
||||
if signode['class']:
|
||||
prefix = modname and modname + '::' or ''
|
||||
else:
|
||||
prefix = modname and modname + separator or ''
|
||||
else:
|
||||
prefix = modname and modname + separator or ''
|
||||
fullname = prefix + name_cls[0]
|
||||
# note target
|
||||
if fullname not in self.state.document.ids:
|
||||
signode['names'].append(fullname)
|
||||
signode['ids'].append(fullname)
|
||||
signode['first'] = (not self.names)
|
||||
self.state.document.note_explicit_target(signode)
|
||||
objects = self.env.domaindata['rb']['objects']
|
||||
if fullname in objects:
|
||||
self.env.warn(
|
||||
self.env.docname,
|
||||
'duplicate object description of %s, ' % fullname +
|
||||
'other instance in ' +
|
||||
self.env.doc2path(objects[fullname][0]),
|
||||
self.lineno)
|
||||
objects[fullname] = (self.env.docname, self.objtype)
|
||||
|
||||
indextext = self.get_index_text(modname, name_cls)
|
||||
if indextext:
|
||||
self.indexnode['entries'].append(
|
||||
_make_index('single', indextext, fullname, fullname))
|
||||
|
||||
def before_content(self):
|
||||
# needed for automatic qualification of members (reset in subclasses)
|
||||
self.clsname_set = False
|
||||
|
||||
def after_content(self):
|
||||
if self.clsname_set:
|
||||
self.env.temp_data['rb:class'] = None
|
||||
|
||||
|
||||
class RubyModulelevel(RubyObject):
|
||||
"""
|
||||
Description of an object on module level (functions, data).
|
||||
"""
|
||||
|
||||
def needs_arglist(self):
|
||||
return self.objtype == 'function'
|
||||
|
||||
def get_index_text(self, modname, name_cls):
|
||||
if self.objtype == 'function':
|
||||
if not modname:
|
||||
return _('%s() (global function)') % name_cls[0]
|
||||
return _('%s() (module function in %s)') % (name_cls[0], modname)
|
||||
else:
|
||||
return ''
|
||||
|
||||
|
||||
class RubyGloballevel(RubyObject):
|
||||
"""
|
||||
Description of an object on module level (functions, data).
|
||||
"""
|
||||
|
||||
def get_index_text(self, modname, name_cls):
|
||||
if self.objtype == 'global':
|
||||
return _('%s (global variable)') % name_cls[0]
|
||||
else:
|
||||
return ''
|
||||
|
||||
|
||||
class RubyEverywhere(RubyObject):
|
||||
"""
|
||||
Description of a class member (methods, attributes).
|
||||
"""
|
||||
|
||||
def needs_arglist(self):
|
||||
return self.objtype == 'method'
|
||||
|
||||
def get_index_text(self, modname, name_cls):
|
||||
name, cls = name_cls
|
||||
add_modules = self.env.config.add_module_names
|
||||
if self.objtype == 'method':
|
||||
try:
|
||||
clsname, methname = ruby_rsplit(name)
|
||||
except ValueError:
|
||||
if modname:
|
||||
return _('%s() (in module %s)') % (name, modname)
|
||||
else:
|
||||
return '%s()' % name
|
||||
if modname and add_modules:
|
||||
return _('%s() (%s::%s method)') % (methname, modname,
|
||||
clsname)
|
||||
else:
|
||||
return _('%s() (%s method)') % (methname, clsname)
|
||||
else:
|
||||
return ''
|
||||
|
||||
|
||||
class RubyClasslike(RubyObject):
|
||||
"""
|
||||
Description of a class-like object (classes, exceptions).
|
||||
"""
|
||||
|
||||
def get_signature_prefix(self, sig):
|
||||
return self.objtype + ' '
|
||||
|
||||
def get_index_text(self, modname, name_cls):
|
||||
if self.objtype == 'class':
|
||||
if not modname:
|
||||
return _('%s (class)') % name_cls[0]
|
||||
return _('%s (class in %s)') % (name_cls[0], modname)
|
||||
elif self.objtype == 'exception':
|
||||
return name_cls[0]
|
||||
else:
|
||||
return ''
|
||||
|
||||
def before_content(self):
|
||||
RubyObject.before_content(self)
|
||||
if self.names:
|
||||
self.env.temp_data['rb:class'] = self.names[0][0]
|
||||
self.clsname_set = True
|
||||
|
||||
|
||||
class RubyClassmember(RubyObject):
|
||||
"""
|
||||
Description of a class member (methods, attributes).
|
||||
"""
|
||||
|
||||
def needs_arglist(self):
|
||||
return self.objtype.endswith('method')
|
||||
|
||||
def get_signature_prefix(self, sig):
|
||||
if self.objtype == 'classmethod':
|
||||
return "classmethod %s." % self.class_name
|
||||
elif self.objtype == 'attr_reader':
|
||||
return "attribute [R] "
|
||||
elif self.objtype == 'attr_writer':
|
||||
return "attribute [W] "
|
||||
elif self.objtype == 'attr_accessor':
|
||||
return "attribute [R/W] "
|
||||
return ''
|
||||
|
||||
def get_index_text(self, modname, name_cls):
|
||||
name, cls = name_cls
|
||||
add_modules = self.env.config.add_module_names
|
||||
if self.objtype == 'classmethod':
|
||||
try:
|
||||
clsname, methname = ruby_rsplit(name)
|
||||
except ValueError:
|
||||
return '%s()' % name
|
||||
if modname:
|
||||
return _('%s() (%s.%s class method)') % (methname, modname,
|
||||
clsname)
|
||||
else:
|
||||
return _('%s() (%s class method)') % (methname, clsname)
|
||||
elif self.objtype.startswith('attr'):
|
||||
try:
|
||||
clsname, attrname = ruby_rsplit(name)
|
||||
except ValueError:
|
||||
return name
|
||||
if modname and add_modules:
|
||||
return _('%s (%s.%s attribute)') % (attrname, modname, clsname)
|
||||
else:
|
||||
return _('%s (%s attribute)') % (attrname, clsname)
|
||||
else:
|
||||
return ''
|
||||
|
||||
def before_content(self):
|
||||
RubyObject.before_content(self)
|
||||
lastname = self.names and self.names[-1][1]
|
||||
if lastname and not self.env.temp_data.get('rb:class'):
|
||||
self.env.temp_data['rb:class'] = lastname.strip('.')
|
||||
self.clsname_set = True
|
||||
|
||||
|
||||
class RubyModule(Directive):
|
||||
"""
|
||||
Directive to mark description of a new module.
|
||||
"""
|
||||
|
||||
has_content = False
|
||||
required_arguments = 1
|
||||
optional_arguments = 0
|
||||
final_argument_whitespace = False
|
||||
option_spec = {
|
||||
'platform': lambda x: x,
|
||||
'synopsis': lambda x: x,
|
||||
'noindex': directives.flag,
|
||||
'deprecated': directives.flag,
|
||||
}
|
||||
|
||||
def run(self):
|
||||
env = self.state.document.settings.env
|
||||
modname = self.arguments[0].strip()
|
||||
noindex = 'noindex' in self.options
|
||||
env.temp_data['rb:module'] = modname
|
||||
env.domaindata['rb']['modules'][modname] = \
|
||||
(env.docname, self.options.get('synopsis', ''),
|
||||
self.options.get('platform', ''), 'deprecated' in self.options)
|
||||
targetnode = nodes.target('', '', ids=['module-' + modname], ismod=True)
|
||||
self.state.document.note_explicit_target(targetnode)
|
||||
ret = [targetnode]
|
||||
# XXX this behavior of the module directive is a mess...
|
||||
if 'platform' in self.options:
|
||||
platform = self.options['platform']
|
||||
node = nodes.paragraph()
|
||||
node += nodes.emphasis('', _('Platforms: '))
|
||||
node += nodes.Text(platform, platform)
|
||||
ret.append(node)
|
||||
# the synopsis isn't printed; in fact, it is only used in the
|
||||
# modindex currently
|
||||
if not noindex:
|
||||
indextext = _('%s (module)') % modname
|
||||
inode = addnodes.index(entries=[_make_index(
|
||||
'single', indextext, 'module-' + modname, modname)])
|
||||
ret.append(inode)
|
||||
return ret
|
||||
|
||||
def _make_index(entrytype, entryname, target, ignored, key=None):
|
||||
# Sphinx 1.4 introduced backward incompatible changes, it now
|
||||
# requires 5 tuples. Last one is categorization key. See
|
||||
# http://www.sphinx-doc.org/en/stable/extdev/nodes.html#sphinx.addnodes.index
|
||||
if version_info >= (1, 4, 0, '', 0):
|
||||
return (entrytype, entryname, target, ignored, key)
|
||||
else:
|
||||
return (entrytype, entryname, target, ignored)
|
||||
|
||||
class RubyCurrentModule(Directive):
|
||||
"""
|
||||
This directive is just to tell Sphinx that we're documenting
|
||||
stuff in module foo, but links to module foo won't lead here.
|
||||
"""
|
||||
|
||||
has_content = False
|
||||
required_arguments = 1
|
||||
optional_arguments = 0
|
||||
final_argument_whitespace = False
|
||||
option_spec = {}
|
||||
|
||||
def run(self):
|
||||
env = self.state.document.settings.env
|
||||
modname = self.arguments[0].strip()
|
||||
if modname == 'None':
|
||||
env.temp_data['rb:module'] = None
|
||||
else:
|
||||
env.temp_data['rb:module'] = modname
|
||||
return []
|
||||
|
||||
|
||||
class RubyXRefRole(XRefRole):
|
||||
def process_link(self, env, refnode, has_explicit_title, title, target):
|
||||
if not has_explicit_title:
|
||||
title = title.lstrip('.') # only has a meaning for the target
|
||||
title = title.lstrip('#')
|
||||
if title.startswith("::"):
|
||||
title = title[2:]
|
||||
target = target.lstrip('~') # only has a meaning for the title
|
||||
# if the first character is a tilde, don't display the module/class
|
||||
# parts of the contents
|
||||
if title[0:1] == '~':
|
||||
m = re.search(r"(?:\.)?(?:#)?(?:::)?(.*)\Z", title)
|
||||
if m:
|
||||
title = m.group(1)
|
||||
if not title.startswith("$"):
|
||||
refnode['rb:module'] = env.temp_data.get('rb:module')
|
||||
refnode['rb:class'] = env.temp_data.get('rb:class')
|
||||
# if the first character is a dot, search more specific namespaces first
|
||||
# else search builtins first
|
||||
if target[0:1] == '.':
|
||||
target = target[1:]
|
||||
refnode['refspecific'] = True
|
||||
return title, target
|
||||
|
||||
|
||||
class RubyModuleIndex(Index):
|
||||
"""
|
||||
Index subclass to provide the Ruby module index.
|
||||
"""
|
||||
|
||||
name = 'modindex'
|
||||
localname = _('Ruby Module Index')
|
||||
shortname = _('modules')
|
||||
|
||||
def generate(self, docnames=None):
|
||||
content = {}
|
||||
# list of prefixes to ignore
|
||||
ignores = self.domain.env.config['modindex_common_prefix']
|
||||
ignores = sorted(ignores, key=len, reverse=True)
|
||||
# list of all modules, sorted by module name
|
||||
modules = sorted(_iteritems(self.domain.data['modules']),
|
||||
key=lambda x: x[0].lower())
|
||||
# sort out collapsible modules
|
||||
prev_modname = ''
|
||||
num_toplevels = 0
|
||||
for modname, (docname, synopsis, platforms, deprecated) in modules:
|
||||
if docnames and docname not in docnames:
|
||||
continue
|
||||
|
||||
for ignore in ignores:
|
||||
if modname.startswith(ignore):
|
||||
modname = modname[len(ignore):]
|
||||
stripped = ignore
|
||||
break
|
||||
else:
|
||||
stripped = ''
|
||||
|
||||
# we stripped the whole module name?
|
||||
if not modname:
|
||||
modname, stripped = stripped, ''
|
||||
|
||||
entries = content.setdefault(modname[0].lower(), [])
|
||||
|
||||
package = modname.split('::')[0]
|
||||
if package != modname:
|
||||
# it's a submodule
|
||||
if prev_modname == package:
|
||||
# first submodule - make parent a group head
|
||||
entries[-1][1] = 1
|
||||
elif not prev_modname.startswith(package):
|
||||
# submodule without parent in list, add dummy entry
|
||||
entries.append([stripped + package, 1, '', '', '', '', ''])
|
||||
subtype = 2
|
||||
else:
|
||||
num_toplevels += 1
|
||||
subtype = 0
|
||||
|
||||
qualifier = deprecated and _('Deprecated') or ''
|
||||
entries.append([stripped + modname, subtype, docname,
|
||||
'module-' + stripped + modname, platforms,
|
||||
qualifier, synopsis])
|
||||
prev_modname = modname
|
||||
|
||||
# apply heuristics when to collapse modindex at page load:
|
||||
# only collapse if number of toplevel modules is larger than
|
||||
# number of submodules
|
||||
collapse = len(modules) - num_toplevels < num_toplevels
|
||||
|
||||
# sort by first letter
|
||||
content = sorted(_iteritems(content))
|
||||
|
||||
return content, collapse
|
||||
|
||||
|
||||
class RubyDomain(Domain):
|
||||
"""Ruby language domain."""
|
||||
name = 'rb'
|
||||
label = 'Ruby'
|
||||
object_types = {
|
||||
'function': ObjType(_('function'), 'func', 'obj'),
|
||||
'global': ObjType(_('global variable'), 'global', 'obj'),
|
||||
'method': ObjType(_('method'), 'meth', 'obj'),
|
||||
'class': ObjType(_('class'), 'class', 'obj'),
|
||||
'exception': ObjType(_('exception'), 'exc', 'obj'),
|
||||
'classmethod': ObjType(_('class method'), 'meth', 'obj'),
|
||||
'attr_reader': ObjType(_('attribute'), 'attr', 'obj'),
|
||||
'attr_writer': ObjType(_('attribute'), 'attr', 'obj'),
|
||||
'attr_accessor': ObjType(_('attribute'), 'attr', 'obj'),
|
||||
'const': ObjType(_('const'), 'const', 'obj'),
|
||||
'module': ObjType(_('module'), 'mod', 'obj'),
|
||||
}
|
||||
|
||||
directives = {
|
||||
'function': RubyModulelevel,
|
||||
'global': RubyGloballevel,
|
||||
'method': RubyEverywhere,
|
||||
'const': RubyEverywhere,
|
||||
'class': RubyClasslike,
|
||||
'exception': RubyClasslike,
|
||||
'classmethod': RubyClassmember,
|
||||
'attr_reader': RubyClassmember,
|
||||
'attr_writer': RubyClassmember,
|
||||
'attr_accessor': RubyClassmember,
|
||||
'module': RubyModule,
|
||||
'currentmodule': RubyCurrentModule,
|
||||
}
|
||||
|
||||
roles = {
|
||||
'func': RubyXRefRole(fix_parens=False),
|
||||
'global':RubyXRefRole(),
|
||||
'class': RubyXRefRole(),
|
||||
'exc': RubyXRefRole(),
|
||||
'meth': RubyXRefRole(fix_parens=False),
|
||||
'attr': RubyXRefRole(),
|
||||
'const': RubyXRefRole(),
|
||||
'mod': RubyXRefRole(),
|
||||
'obj': RubyXRefRole(),
|
||||
}
|
||||
initial_data = {
|
||||
'objects': {}, # fullname -> docname, objtype
|
||||
'modules': {}, # modname -> docname, synopsis, platform, deprecated
|
||||
}
|
||||
indices = [
|
||||
RubyModuleIndex,
|
||||
]
|
||||
|
||||
def clear_doc(self, docname):
|
||||
for fullname, (fn, _) in list(self.data['objects'].items()):
|
||||
if fn == docname:
|
||||
del self.data['objects'][fullname]
|
||||
for modname, (fn, _, _, _) in list(self.data['modules'].items()):
|
||||
if fn == docname:
|
||||
del self.data['modules'][modname]
|
||||
|
||||
def find_obj(self, env, modname, classname, name, type, searchorder=0):
|
||||
"""
|
||||
Find a Ruby object for "name", perhaps using the given module and/or
|
||||
classname.
|
||||
"""
|
||||
# skip parens
|
||||
if name[-2:] == '()':
|
||||
name = name[:-2]
|
||||
|
||||
if not name:
|
||||
return None, None
|
||||
|
||||
objects = self.data['objects']
|
||||
|
||||
newname = None
|
||||
if searchorder == 1:
|
||||
if modname and classname and \
|
||||
modname + '::' + classname + '#' + name in objects:
|
||||
newname = modname + '::' + classname + '#' + name
|
||||
elif modname and classname and \
|
||||
modname + '::' + classname + '.' + name in objects:
|
||||
newname = modname + '::' + classname + '.' + name
|
||||
elif modname and modname + '::' + name in objects:
|
||||
newname = modname + '::' + name
|
||||
elif modname and modname + '#' + name in objects:
|
||||
newname = modname + '#' + name
|
||||
elif modname and modname + '.' + name in objects:
|
||||
newname = modname + '.' + name
|
||||
elif classname and classname + '.' + name in objects:
|
||||
newname = classname + '.' + name
|
||||
elif classname and classname + '#' + name in objects:
|
||||
newname = classname + '#' + name
|
||||
elif name in objects:
|
||||
newname = name
|
||||
else:
|
||||
if name in objects:
|
||||
newname = name
|
||||
elif classname and classname + '.' + name in objects:
|
||||
newname = classname + '.' + name
|
||||
elif classname and classname + '#' + name in objects:
|
||||
newname = classname + '#' + name
|
||||
elif modname and modname + '::' + name in objects:
|
||||
newname = modname + '::' + name
|
||||
elif modname and modname + '#' + name in objects:
|
||||
newname = modname + '#' + name
|
||||
elif modname and modname + '.' + name in objects:
|
||||
newname = modname + '.' + name
|
||||
elif modname and classname and \
|
||||
modname + '::' + classname + '#' + name in objects:
|
||||
newname = modname + '::' + classname + '#' + name
|
||||
elif modname and classname and \
|
||||
modname + '::' + classname + '.' + name in objects:
|
||||
newname = modname + '::' + classname + '.' + name
|
||||
# special case: object methods
|
||||
elif type in ('func', 'meth') and '.' not in name and \
|
||||
'object.' + name in objects:
|
||||
newname = 'object.' + name
|
||||
if newname is None:
|
||||
return None, None
|
||||
return newname, objects[newname]
|
||||
|
||||
def resolve_xref(self, env, fromdocname, builder,
|
||||
typ, target, node, contnode):
|
||||
if (typ == 'mod' or
|
||||
typ == 'obj' and target in self.data['modules']):
|
||||
docname, synopsis, platform, deprecated = \
|
||||
self.data['modules'].get(target, ('','','', ''))
|
||||
if not docname:
|
||||
return None
|
||||
else:
|
||||
title = '%s%s%s' % ((platform and '(%s) ' % platform),
|
||||
synopsis,
|
||||
(deprecated and ' (deprecated)' or ''))
|
||||
return make_refnode(builder, fromdocname, docname,
|
||||
'module-' + target, contnode, title)
|
||||
else:
|
||||
modname = node.get('rb:module')
|
||||
clsname = node.get('rb:class')
|
||||
searchorder = node.hasattr('refspecific') and 1 or 0
|
||||
name, obj = self.find_obj(env, modname, clsname,
|
||||
target, typ, searchorder)
|
||||
if not obj:
|
||||
return None
|
||||
else:
|
||||
return make_refnode(builder, fromdocname, obj[0], name,
|
||||
contnode, name)
|
||||
|
||||
def get_objects(self):
|
||||
for modname, info in _iteritems(self.data['modules']):
|
||||
yield (modname, modname, 'module', info[0], 'module-' + modname, 0)
|
||||
for refname, (docname, type) in _iteritems(self.data['objects']):
|
||||
yield (refname, refname, type, docname, refname, 1)
|
||||
|
||||
|
||||
def setup(app):
|
||||
app.add_domain(RubyDomain)
|
||||
15
doc/_static/default2.css
vendored
15
doc/_static/default2.css
vendored
@@ -1,15 +0,0 @@
|
||||
@import url(//fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic);
|
||||
|
||||
pre, tt {
|
||||
font-family: monospace, sans-serif;
|
||||
}
|
||||
|
||||
tt {
|
||||
font-size: 100%;
|
||||
}
|
||||
|
||||
div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 {
|
||||
border: 0;
|
||||
margin: 0;
|
||||
padding: 0.3em 0;
|
||||
}
|
||||
5
doc/_templates/menu.html
vendored
5
doc/_templates/menu.html
vendored
@@ -1,5 +0,0 @@
|
||||
<h3>Menu</h3>
|
||||
<ul>
|
||||
<li><a href="https://github.com/tatsuhiro-t/nghttp2/issues">Issues</a></li>
|
||||
<li><a href="https://github.com/tatsuhiro-t/nghttp2">Source</a></li>
|
||||
</ul>
|
||||
@@ -1,22 +0,0 @@
|
||||
API Reference
|
||||
=============
|
||||
|
||||
Includes
|
||||
--------
|
||||
|
||||
To use the public APIs, include ``nghttp2/nghttp2.h``::
|
||||
|
||||
#include <nghttp2/nghttp2.h>
|
||||
|
||||
The header files are also available online: :doc:`nghttp2.h` and
|
||||
:doc:`nghttp2ver.h`.
|
||||
|
||||
Remarks
|
||||
-------
|
||||
|
||||
Do not call `nghttp2_session_send`, `nghttp2_session_recv` or
|
||||
`nghttp2_session_mem_recv` from the nghttp2 callback functions
|
||||
directly or indirectly. It will lead to the crash. You can submit
|
||||
requests or frames in the callbacks then call `nghttp2_session_send`,
|
||||
`nghttp2_session_recv` or `nghttp2_session_mem_recv` outside of the
|
||||
callbacks.
|
||||
19
doc/bash_completion/h2load
Normal file
19
doc/bash_completion/h2load
Normal file
@@ -0,0 +1,19 @@
|
||||
_h2load()
|
||||
{
|
||||
local cur prev split=false
|
||||
COMPREPLY=()
|
||||
COMP_WORDBREAKS=${COMP_WORDBREAKS//=}
|
||||
|
||||
cmd=${COMP_WORDS[0]}
|
||||
_get_comp_words_by_ref cur prev
|
||||
case $cur in
|
||||
-*)
|
||||
COMPREPLY=( $( compgen -W '--requests --clients --threads --input-file --max-concurrent-streams --max-frame-size --window-bits --connection-window-bits --header --ciphers --tls13-ciphers --no-tls-proto --data --rate --rate-period --duration --warm-up-time --connection-active-timeout --connection-inactivity-timeout --timing-script-file --base-uri --alpn-list --h1 --header-table-size --encoder-header-table-size --log-file --qlog-file-base --connect-to --rps --groups --no-udp-gso --max-udp-payload-size --ktls --sni --verbose --version --help ' -- "$cur" ) )
|
||||
;;
|
||||
*)
|
||||
_filedir
|
||||
return 0
|
||||
esac
|
||||
return 0
|
||||
}
|
||||
complete -F _h2load h2load
|
||||
75
doc/bash_completion/make_bash_completion.py
Executable file
75
doc/bash_completion/make_bash_completion.py
Executable file
@@ -0,0 +1,75 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import subprocess
|
||||
import io
|
||||
import re
|
||||
import sys
|
||||
import os.path
|
||||
|
||||
class Option:
|
||||
def __init__(self, long_opt, short_opt):
|
||||
self.long_opt = long_opt
|
||||
self.short_opt = short_opt
|
||||
|
||||
def get_all_options(cmd):
|
||||
opt_pattern = re.compile(r' (?:(-.), )?(--[^\s\[=]+)(\[)?')
|
||||
proc = subprocess.Popen([cmd, "--help"], stdout=subprocess.PIPE)
|
||||
stdoutdata, _ = proc.communicate()
|
||||
cur_option = None
|
||||
opts = {}
|
||||
for line in io.StringIO(stdoutdata.decode('utf-8')):
|
||||
match = opt_pattern.match(line)
|
||||
if not match:
|
||||
continue
|
||||
long_opt = match.group(2)
|
||||
short_opt = match.group(1)
|
||||
opts[long_opt] = Option(long_opt, short_opt)
|
||||
|
||||
return opts
|
||||
|
||||
def output_case(out, name, opts):
|
||||
out.write('''\
|
||||
_{name}()
|
||||
{{
|
||||
local cur prev split=false
|
||||
COMPREPLY=()
|
||||
COMP_WORDBREAKS=${{COMP_WORDBREAKS//=}}
|
||||
|
||||
cmd=${{COMP_WORDS[0]}}
|
||||
_get_comp_words_by_ref cur prev
|
||||
'''.format(name=name))
|
||||
|
||||
# Complete option name.
|
||||
out.write('''\
|
||||
case $cur in
|
||||
-*)
|
||||
COMPREPLY=( $( compgen -W '\
|
||||
''')
|
||||
for opt in opts.values():
|
||||
out.write(opt.long_opt)
|
||||
out.write(' ')
|
||||
|
||||
out.write('''\
|
||||
' -- "$cur" ) )
|
||||
;;
|
||||
''')
|
||||
# If no option found for completion then complete with files.
|
||||
out.write('''\
|
||||
*)
|
||||
_filedir
|
||||
return 0
|
||||
esac
|
||||
return 0
|
||||
}}
|
||||
complete -F _{name} {name}
|
||||
'''.format(name=name))
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) < 2:
|
||||
print("Generates bash_completion using `/path/to/cmd --help'")
|
||||
print("Usage: make_bash_completion.py /path/to/cmd")
|
||||
exit(1)
|
||||
name = os.path.basename(sys.argv[1])
|
||||
opts = get_all_options(sys.argv[1])
|
||||
output_case(sys.stdout, name, opts)
|
||||
19
doc/bash_completion/nghttp
Normal file
19
doc/bash_completion/nghttp
Normal file
@@ -0,0 +1,19 @@
|
||||
_nghttp()
|
||||
{
|
||||
local cur prev split=false
|
||||
COMPREPLY=()
|
||||
COMP_WORDBREAKS=${COMP_WORDBREAKS//=}
|
||||
|
||||
cmd=${COMP_WORDS[0]}
|
||||
_get_comp_words_by_ref cur prev
|
||||
case $cur in
|
||||
-*)
|
||||
COMPREPLY=( $( compgen -W '--verbose --null-out --remote-name --timeout --window-bits --connection-window-bits --get-assets --stat --header --trailer --cert --key --data --multiply --upgrade --extpri --peer-max-concurrent-streams --header-table-size --encoder-header-table-size --padding --har --color --continuation --no-content-length --hexdump --no-push --max-concurrent-streams --expect-continue --no-verify-peer --ktls --version --help ' -- "$cur" ) )
|
||||
;;
|
||||
*)
|
||||
_filedir
|
||||
return 0
|
||||
esac
|
||||
return 0
|
||||
}
|
||||
complete -F _nghttp nghttp
|
||||
19
doc/bash_completion/nghttpd
Normal file
19
doc/bash_completion/nghttpd
Normal file
@@ -0,0 +1,19 @@
|
||||
_nghttpd()
|
||||
{
|
||||
local cur prev split=false
|
||||
COMPREPLY=()
|
||||
COMP_WORDBREAKS=${COMP_WORDBREAKS//=}
|
||||
|
||||
cmd=${COMP_WORDS[0]}
|
||||
_get_comp_words_by_ref cur prev
|
||||
case $cur in
|
||||
-*)
|
||||
COMPREPLY=( $( compgen -W '--address --daemon --verify-client --htdocs --verbose --no-tls --header-table-size --encoder-header-table-size --color --push --padding --max-concurrent-streams --workers --error-gzip --window-bits --connection-window-bits --dh-param-file --early-response --trailer --hexdump --echo-upload --mime-types-file --no-content-length --groups --ktls --version --help ' -- "$cur" ) )
|
||||
;;
|
||||
*)
|
||||
_filedir
|
||||
return 0
|
||||
esac
|
||||
return 0
|
||||
}
|
||||
complete -F _nghttpd nghttpd
|
||||
19
doc/bash_completion/nghttpx
Normal file
19
doc/bash_completion/nghttpx
Normal file
@@ -0,0 +1,19 @@
|
||||
_nghttpx()
|
||||
{
|
||||
local cur prev split=false
|
||||
COMPREPLY=()
|
||||
COMP_WORDBREAKS=${COMP_WORDBREAKS//=}
|
||||
|
||||
cmd=${COMP_WORDS[0]}
|
||||
_get_comp_words_by_ref cur prev
|
||||
case $cur in
|
||||
-*)
|
||||
COMPREPLY=( $( compgen -W '--backend --frontend --backlog --backend-address-family --backend-http-proxy-uri --workers --single-thread --read-rate --read-burst --write-rate --write-burst --worker-read-rate --worker-read-burst --worker-write-rate --worker-write-burst --worker-frontend-connections --backend-connections-per-host --backend-connections-per-frontend --rlimit-nofile --rlimit-memlock --backend-request-buffer --backend-response-buffer --fastopen --no-kqueue --frontend-http2-idle-timeout --frontend-http3-idle-timeout --frontend-write-timeout --frontend-keep-alive-timeout --frontend-header-timeout --stream-read-timeout --stream-write-timeout --backend-read-timeout --backend-write-timeout --backend-connect-timeout --backend-keep-alive-timeout --listener-disable-timeout --frontend-http2-setting-timeout --backend-http2-settings-timeout --backend-max-backoff --ciphers --tls13-ciphers --client-ciphers --tls13-client-ciphers --groups --insecure --cacert --private-key-passwd-file --subcert --dh-param-file --alpn-list --verify-client --verify-client-cacert --verify-client-tolerate-expired --client-private-key-file --client-cert-file --tls-min-proto-version --tls-max-proto-version --tls-ticket-key-file --tls-ticket-key-memcached --tls-ticket-key-memcached-address-family --tls-ticket-key-memcached-interval --tls-ticket-key-memcached-max-retry --tls-ticket-key-memcached-max-fail --tls-ticket-key-cipher --tls-ticket-key-memcached-cert-file --tls-ticket-key-memcached-private-key-file --tls-dyn-rec-warmup-threshold --tls-dyn-rec-idle-timeout --no-http2-cipher-block-list --client-no-http2-cipher-block-list --tls-sct-dir --psk-secrets --client-psk-secrets --tls-no-postpone-early-data --tls-max-early-data --tls-ktls --frontend-http2-max-concurrent-streams --backend-http2-max-concurrent-streams --frontend-http2-window-size --frontend-http2-connection-window-size --backend-http2-window-size --backend-http2-connection-window-size --http2-no-cookie-crumbling --padding --no-server-push --frontend-http2-optimize-write-buffer-size --frontend-http2-optimize-window-size --frontend-http2-encoder-dynamic-table-size --frontend-http2-decoder-dynamic-table-size --backend-http2-encoder-dynamic-table-size --backend-http2-decoder-dynamic-table-size --http2-proxy --log-level --accesslog-file --accesslog-syslog --accesslog-format --accesslog-write-early --errorlog-file --errorlog-syslog --syslog-facility --add-x-forwarded-for --strip-incoming-x-forwarded-for --no-add-x-forwarded-proto --no-strip-incoming-x-forwarded-proto --add-forwarded --strip-incoming-forwarded --forwarded-by --forwarded-for --no-via --no-strip-incoming-early-data --no-location-rewrite --host-rewrite --altsvc --http2-altsvc --add-request-header --add-response-header --request-header-field-buffer --max-request-header-fields --response-header-field-buffer --max-response-header-fields --error-page --server-name --no-server-rewrite --redirect-https-port --require-http-scheme --api-max-request-body --dns-cache-timeout --dns-lookup-timeout --dns-max-try --frontend-max-requests --frontend-http2-dump-request-header --frontend-http2-dump-response-header --frontend-frame-debug --daemon --pid-file --user --single-process --max-worker-processes --worker-process-grace-shutdown-period --mruby-file --ignore-per-pattern-mruby-error --frontend-quic-idle-timeout --frontend-quic-debug-log --quic-bpf-program-file --frontend-quic-early-data --frontend-quic-qlog-dir --frontend-quic-require-token --frontend-quic-congestion-controller --frontend-quic-secret-file --quic-server-id --frontend-quic-initial-rtt --no-quic-bpf --frontend-http3-window-size --frontend-http3-connection-window-size --frontend-http3-max-window-size --frontend-http3-max-connection-window-size --frontend-http3-max-concurrent-streams --conf --include --version --help ' -- "$cur" ) )
|
||||
;;
|
||||
*)
|
||||
_filedir
|
||||
return 0
|
||||
esac
|
||||
return 0
|
||||
}
|
||||
complete -F _nghttpx nghttpx
|
||||
1
doc/building-android-binary.rst.in
Normal file
1
doc/building-android-binary.rst.in
Normal file
@@ -0,0 +1 @@
|
||||
.. include:: @top_srcdir@/doc/sources/building-android-binary.rst
|
||||
@@ -1,5 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# nghttp2 - HTTP/2.0 C Library
|
||||
# nghttp2 - HTTP/2 C Library
|
||||
|
||||
# Copyright (c) 2012 Tatsuhiro Tsujikawa
|
||||
|
||||
@@ -41,6 +41,8 @@ import sys, os
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
#sys.path.insert(0, os.path.abspath('.'))
|
||||
|
||||
sys.path.insert(0, os.path.abspath('@top_srcdir@/doc/_exts'))
|
||||
|
||||
# -- General configuration -----------------------------------------------------
|
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here.
|
||||
@@ -48,10 +50,10 @@ import sys, os
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||
extensions = []
|
||||
extensions = ['rubydomain.rubydomain']
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
templates_path = ['@top_srcdir@/_templates']
|
||||
|
||||
# The suffix of source filenames.
|
||||
source_suffix = '.rst'
|
||||
@@ -64,7 +66,7 @@ master_doc = 'index'
|
||||
|
||||
# General information about the project.
|
||||
project = u'nghttp2'
|
||||
copyright = u'2012, 2013, Tatsuhiro Tsujikawa'
|
||||
copyright = u'2012, 2015, 2016, Tatsuhiro Tsujikawa'
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
@@ -87,7 +89,7 @@ release = '@PACKAGE_VERSION@'
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
exclude_patterns = ['manual', 'README.rst', '*-header.rst']
|
||||
exclude_patterns = ['manual', 'README.rst', '*-header.rst', 'sources']
|
||||
|
||||
# The reST default role (used for this markup: `text`) to use for all documents.
|
||||
default_role = 'c:func'
|
||||
@@ -118,25 +120,15 @@ pygments_style = 'sphinx'
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
html_theme = 'default'
|
||||
html_theme = 'sphinx_rtd_theme'
|
||||
|
||||
# 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 = {'bodyfont':'roboto, sans-serif',
|
||||
'headfont':'roboto, "Trebuchet MS", sans-serif',
|
||||
'relbarbgcolor':'#fff',
|
||||
'relbartextcolor':'#444',
|
||||
'relbarlinkcolor':'#444',
|
||||
'sidebarbgcolor':'none',
|
||||
'sidebartextcolor':'#444',
|
||||
'sidebarlinkcolor':'#444',
|
||||
'headbgcolor':'none',
|
||||
'footerbgcolor':'none',
|
||||
'footertextcolor':'#444'}
|
||||
#html_theme_options = {}
|
||||
|
||||
# Add any paths that contain custom themes here, relative to this directory.
|
||||
#html_theme_path = []
|
||||
#html_theme_path = ['@top_srcdir@/doc/_themes']
|
||||
|
||||
# The name for this set of Sphinx documents. If None, it defaults to
|
||||
# "<project> v<release> documentation".
|
||||
@@ -157,7 +149,7 @@ html_theme_options = {'bodyfont':'roboto, sans-serif',
|
||||
# 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/default2.css']
|
||||
#html_static_path = []
|
||||
|
||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||
# using the given strftime format.
|
||||
@@ -165,7 +157,7 @@ html_static_path = ['_static/default2.css']
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
#html_use_smartypants = True
|
||||
#html_use_smartypants = False
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
html_sidebars = {
|
||||
@@ -187,7 +179,8 @@ html_sidebars = {
|
||||
#html_split_index = False
|
||||
|
||||
# If true, links to the reST sources are added to the pages.
|
||||
#html_show_sourcelink = True
|
||||
html_show_sourcelink = False
|
||||
html_copy_source = False
|
||||
|
||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||
#html_show_sphinx = True
|
||||
@@ -251,9 +244,9 @@ latex_documents = [
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [
|
||||
('index', 'nghttp2', u'nghttp2 Documentation',
|
||||
('nghttp.1', 'nghttp', u'HTTP/2 client', [u'Tatsuhiro Tsujikawa'], 1),
|
||||
('nghttpd.1', 'nghttpd', u'HTTP/2 server', [u'Tatsuhiro Tsujikawa'], 1),
|
||||
('nghttpx.1', 'nghttpx', u'HTTP/2 proxy', [u'Tatsuhiro Tsujikawa'], 1),
|
||||
('h2load.1', 'h2load', u'HTTP/2 benchmarking tool',
|
||||
[u'Tatsuhiro Tsujikawa'], 1)
|
||||
]
|
||||
|
||||
def setup(app):
|
||||
app.add_stylesheet('default2.css')
|
||||
|
||||
1
doc/contribute.rst.in
Normal file
1
doc/contribute.rst.in
Normal file
@@ -0,0 +1 @@
|
||||
.. include:: @top_srcdir@/doc/sources/contribute.rst
|
||||
2
doc/docutils.conf
Normal file
2
doc/docutils.conf
Normal file
@@ -0,0 +1,2 @@
|
||||
[parsers]
|
||||
smart_quotes=no
|
||||
1
doc/h2load-howto.rst.in
Normal file
1
doc/h2load-howto.rst.in
Normal file
@@ -0,0 +1 @@
|
||||
.. include:: @top_srcdir@/doc/sources/h2load-howto.rst
|
||||
536
doc/h2load.1
Normal file
536
doc/h2load.1
Normal file
@@ -0,0 +1,536 @@
|
||||
.\" Man page generated from reStructuredText.
|
||||
.
|
||||
.
|
||||
.nr rst2man-indent-level 0
|
||||
.
|
||||
.de1 rstReportMargin
|
||||
\\$1 \\n[an-margin]
|
||||
level \\n[rst2man-indent-level]
|
||||
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
-
|
||||
\\n[rst2man-indent0]
|
||||
\\n[rst2man-indent1]
|
||||
\\n[rst2man-indent2]
|
||||
..
|
||||
.de1 INDENT
|
||||
.\" .rstReportMargin pre:
|
||||
. RS \\$1
|
||||
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
|
||||
. nr rst2man-indent-level +1
|
||||
.\" .rstReportMargin post:
|
||||
..
|
||||
.de UNINDENT
|
||||
. RE
|
||||
.\" indent \\n[an-margin]
|
||||
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.nr rst2man-indent-level -1
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "H2LOAD" "1" "Oct 25, 2025" "1.68.0" "nghttp2"
|
||||
.SH NAME
|
||||
h2load \- HTTP/2 benchmarking tool
|
||||
.SH SYNOPSIS
|
||||
.sp
|
||||
\fBh2load\fP [OPTIONS]... [URI]...
|
||||
.SH DESCRIPTION
|
||||
.sp
|
||||
benchmarking tool for HTTP/2 server
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B <URI>
|
||||
Specify URI to access. Multiple URIs can be specified.
|
||||
URIs are used in this order for each client. All URIs
|
||||
are used, then first URI is used and then 2nd URI, and
|
||||
so on. The scheme, host and port in the subsequent
|
||||
URIs, if present, are ignored. Those in the first URI
|
||||
are used solely. Definition of a base URI overrides all
|
||||
scheme, host or port values.
|
||||
.UNINDENT
|
||||
.SH OPTIONS
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-n, \-\-requests=<N>
|
||||
Number of requests across all clients. If it is used
|
||||
with \fI\%\-\-timing\-script\-file\fP option, this option specifies
|
||||
the number of requests each client performs rather than
|
||||
the number of requests across all clients. This option
|
||||
is ignored if timing\-based benchmarking is enabled (see
|
||||
\fI\%\-\-duration\fP option).
|
||||
.sp
|
||||
Default: \fB1\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-c, \-\-clients=<N>
|
||||
Number of concurrent clients. With \fI\%\-r\fP option, this
|
||||
specifies the maximum number of connections to be made.
|
||||
.sp
|
||||
Default: \fB1\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-t, \-\-threads=<N>
|
||||
Number of native threads.
|
||||
.sp
|
||||
Default: \fB1\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-i, \-\-input\-file=<PATH>
|
||||
Path of a file with multiple URIs are separated by EOLs.
|
||||
This option will disable URIs getting from command\-line.
|
||||
If \(aq\-\(aq is given as <PATH>, URIs will be read from stdin.
|
||||
URIs are used in this order for each client. All URIs
|
||||
are used, then first URI is used and then 2nd URI, and
|
||||
so on. The scheme, host and port in the subsequent
|
||||
URIs, if present, are ignored. Those in the first URI
|
||||
are used solely. Definition of a base URI overrides all
|
||||
scheme, host or port values.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-m, \-\-max\-concurrent\-streams=<N>
|
||||
Max concurrent streams to issue per session. When
|
||||
http/1.1 is used, this specifies the number of HTTP
|
||||
pipelining requests in\-flight.
|
||||
.sp
|
||||
Default: \fB1\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-f, \-\-max\-frame\-size=<SIZE>
|
||||
Maximum frame size that the local endpoint is willing to
|
||||
receive.
|
||||
.sp
|
||||
Default: \fB16K\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-w, \-\-window\-bits=<N>
|
||||
Sets the stream level initial window size to (2**<N>)\-1.
|
||||
For QUIC, <N> is capped to 26 (roughly 64MiB). It
|
||||
defaults to 24 (16MiB) for QUIC, and 30 for other
|
||||
protocols.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-W, \-\-connection\-window\-bits=<N>
|
||||
Sets the connection level initial window size to
|
||||
(2**<N>)\-1.
|
||||
.sp
|
||||
Default: \fB30\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-H, \-\-header=<HEADER>
|
||||
Add/Override a header to the requests.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-ciphers=<SUITE>
|
||||
Set allowed cipher list for TLSv1.2 or earlier. The
|
||||
format of the string is described in OpenSSL ciphers(1).
|
||||
.sp
|
||||
Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-tls13\-ciphers=<SUITE>
|
||||
Set allowed cipher list for TLSv1.3. The format of the
|
||||
string is described in OpenSSL ciphers(1).
|
||||
.sp
|
||||
Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-p, \-\-no\-tls\-proto=<PROTOID>
|
||||
Specify ALPN identifier of the protocol to be used when
|
||||
accessing http URI without SSL/TLS.
|
||||
Available protocols: h2c and http/1.1
|
||||
.sp
|
||||
Default: \fBh2c\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-d, \-\-data=<PATH>
|
||||
Post FILE to server. The request method is changed to
|
||||
POST. For http/1.1 connection, if \fI\%\-d\fP is used, the
|
||||
maximum number of in\-flight pipelined requests is set to
|
||||
1.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-r, \-\-rate=<N>
|
||||
Specifies the fixed rate at which connections are
|
||||
created. The rate must be a positive integer,
|
||||
representing the number of connections to be made per
|
||||
rate period. The maximum number of connections to be
|
||||
made is given in \fI\%\-c\fP option. This rate will be
|
||||
distributed among threads as evenly as possible. For
|
||||
example, with \fI\%\-t\fP2 and \fI\%\-r\fP4, each thread gets 2
|
||||
connections per period. When the rate is 0, the program
|
||||
will run as it normally does, creating connections at
|
||||
whatever variable rate it wants. The default value for
|
||||
this option is 0. \fI\%\-r\fP and \fI\%\-D\fP are mutually exclusive.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-rate\-period=<DURATION>
|
||||
Specifies the time period between creating connections.
|
||||
The period must be a positive number, representing the
|
||||
length of the period in time. This option is ignored if
|
||||
the rate option is not used. The default value for this
|
||||
option is 1s.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-D, \-\-duration=<DURATION>
|
||||
Specifies the main duration for the measurements in case
|
||||
of timing\-based benchmarking. \fI\%\-D\fP and \fI\%\-r\fP are mutually
|
||||
exclusive.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-warm\-up\-time=<DURATION>
|
||||
Specifies the time period before starting the actual
|
||||
measurements, in case of timing\-based benchmarking.
|
||||
Needs to provided along with \fI\%\-D\fP option.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-T, \-\-connection\-active\-timeout=<DURATION>
|
||||
Specifies the maximum time that h2load is willing to
|
||||
keep a connection open, regardless of the activity on
|
||||
said connection. <DURATION> must be a positive integer,
|
||||
specifying the amount of time to wait. When no timeout
|
||||
value is set (either active or inactive), h2load will
|
||||
keep a connection open indefinitely, waiting for a
|
||||
response.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-N, \-\-connection\-inactivity\-timeout=<DURATION>
|
||||
Specifies the amount of time that h2load is willing to
|
||||
wait to see activity on a given connection. <DURATION>
|
||||
must be a positive integer, specifying the amount of
|
||||
time to wait. When no timeout value is set (either
|
||||
active or inactive), h2load will keep a connection open
|
||||
indefinitely, waiting for a response.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-timing\-script\-file=<PATH>
|
||||
Path of a file containing one or more lines separated by
|
||||
EOLs. Each script line is composed of two tab\-separated
|
||||
fields. The first field represents the time offset from
|
||||
the start of execution, expressed as a positive value of
|
||||
milliseconds with microsecond resolution. The second
|
||||
field represents the URI. This option will disable URIs
|
||||
getting from command\-line. If \(aq\-\(aq is given as <PATH>,
|
||||
script lines will be read from stdin. Script lines are
|
||||
used in order for each client. If \fI\%\-n\fP is given, it must
|
||||
be less than or equal to the number of script lines,
|
||||
larger values are clamped to the number of script lines.
|
||||
If \fI\%\-n\fP is not given, the number of requests will default
|
||||
to the number of script lines. The scheme, host and
|
||||
port defined in the first URI are used solely. Values
|
||||
contained in other URIs, if present, are ignored.
|
||||
Definition of a base URI overrides all scheme, host or
|
||||
port values. \fI\%\-\-timing\-script\-file\fP and \fI\%\-\-rps\fP are
|
||||
mutually exclusive.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-B, \-\-base\-uri=(<URI>|unix:<PATH>)
|
||||
Specify URI from which the scheme, host and port will be
|
||||
used for all requests. The base URI overrides all
|
||||
values defined either at the command line or inside
|
||||
input files. If argument starts with \(dqunix:\(dq, then the
|
||||
rest of the argument will be treated as UNIX domain
|
||||
socket path. The connection is made through that path
|
||||
instead of TCP. In this case, scheme is inferred from
|
||||
the first URI appeared in the command line or inside
|
||||
input files as usual.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-alpn\-list=<LIST>
|
||||
Comma delimited list of ALPN protocol identifier sorted
|
||||
in the order of preference. That means most desirable
|
||||
protocol comes first. The parameter must be delimited
|
||||
by a single comma only and any white spaces are treated
|
||||
as a part of protocol string.
|
||||
.sp
|
||||
Default: \fBh2,http/1.1\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-h1
|
||||
Short hand for \fI\%\-\-alpn\-list\fP=http/1.1
|
||||
\fI\%\-\-no\-tls\-proto\fP=http/1.1, which effectively force
|
||||
http/1.1 for both http and https URI.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-header\-table\-size=<SIZE>
|
||||
Specify decoder header table size.
|
||||
.sp
|
||||
Default: \fB4K\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-encoder\-header\-table\-size=<SIZE>
|
||||
Specify encoder header table size. The decoder (server)
|
||||
specifies the maximum dynamic table size it accepts.
|
||||
Then the negotiated dynamic table size is the minimum of
|
||||
this option value and the value which server specified.
|
||||
.sp
|
||||
Default: \fB4K\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-log\-file=<PATH>
|
||||
Write per\-request information to a file as tab\-separated
|
||||
columns: start time as microseconds since epoch; HTTP
|
||||
status code; microseconds until end of response. More
|
||||
columns may be added later. Rows are ordered by end\-of\-
|
||||
response time when using one worker thread, but may
|
||||
appear slightly out of order with multiple threads due
|
||||
to buffering. Status code is \-1 for failed streams.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-qlog\-file\-base=<PATH>
|
||||
Enable qlog output and specify base file name for qlogs.
|
||||
Qlog is emitted for each connection. For a given base
|
||||
name \(dqbase\(dq, each output file name becomes
|
||||
\(dqbase.M.N.sqlog\(dq where M is worker ID and N is client ID
|
||||
(e.g. \(dqbase.0.3.sqlog\(dq). Only effective in QUIC runs.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-connect\-to=<HOST>[:<PORT>]
|
||||
Host and port to connect instead of using the authority
|
||||
in <URI>.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-rps=<N>
|
||||
Specify request per second for each client. \fI\%\-\-rps\fP and
|
||||
\fI\%\-\-timing\-script\-file\fP are mutually exclusive.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-groups=<GROUPS>
|
||||
Specify the supported groups.
|
||||
.sp
|
||||
Default: \fBX25519:P\-256:P\-384:P\-521\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-no\-udp\-gso
|
||||
Disable UDP GSO.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-max\-udp\-payload\-size=<SIZE>
|
||||
Specify the maximum outgoing UDP datagram payload size.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-ktls
|
||||
Enable ktls.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-sni=<DNSNAME>
|
||||
Send <DNSNAME> in TLS SNI, overriding the host name
|
||||
specified in URI.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-v, \-\-verbose
|
||||
Output debug information.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-version
|
||||
Display version information and exit.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-h, \-\-help
|
||||
Display this help and exit.
|
||||
.UNINDENT
|
||||
.sp
|
||||
The <SIZE> argument is an integer and an optional unit (e.g., 10K is
|
||||
10 * 1024). Units are K, M and G (powers of 1024).
|
||||
.sp
|
||||
The <DURATION> argument is an integer and an optional unit (e.g., 1s
|
||||
is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms
|
||||
(hours, minutes, seconds and milliseconds, respectively). If a unit
|
||||
is omitted, a second is used as unit.
|
||||
.SH OUTPUT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B requests
|
||||
.INDENT 7.0
|
||||
.TP
|
||||
.B total
|
||||
The number of requests h2load was instructed to make.
|
||||
.TP
|
||||
.B started
|
||||
The number of requests h2load has started.
|
||||
.TP
|
||||
.B done
|
||||
The number of requests completed.
|
||||
.TP
|
||||
.B succeeded
|
||||
The number of requests completed successfully. Only HTTP status
|
||||
code 2xx or 3xx are considered as success.
|
||||
.TP
|
||||
.B failed
|
||||
The number of requests failed, including HTTP level failures
|
||||
(non\-successful HTTP status code).
|
||||
.TP
|
||||
.B errored
|
||||
The number of requests failed, except for HTTP level failures.
|
||||
This is the subset of the number reported in \fBfailed\fP and most
|
||||
likely the network level failures or stream was reset by
|
||||
RST_STREAM.
|
||||
.TP
|
||||
.B timeout
|
||||
The number of requests whose connection timed out before they were
|
||||
completed. This is the subset of the number reported in
|
||||
\fBerrored\fP\&.
|
||||
.UNINDENT
|
||||
.TP
|
||||
.B status codes
|
||||
The number of status code h2load received.
|
||||
.TP
|
||||
.B traffic
|
||||
.INDENT 7.0
|
||||
.TP
|
||||
.B total
|
||||
The number of bytes received from the server \(dqon the wire\(dq. If
|
||||
requests were made via TLS, this value is the number of decrypted
|
||||
bytes.
|
||||
.TP
|
||||
.B headers
|
||||
The number of response header bytes from the server without
|
||||
decompression. The \fBspace savings\fP shows efficiency of header
|
||||
compression. Let \fBdecompressed(headers)\fP to the number of bytes
|
||||
used for header fields after decompression. The \fBspace savings\fP
|
||||
is calculated by (1 \- \fBheaders\fP / \fBdecompressed(headers)\fP) *
|
||||
100. For HTTP/1.1, this is usually 0.00%, since it does not have
|
||||
header compression. For HTTP/2, it shows some insightful numbers.
|
||||
.TP
|
||||
.B data
|
||||
The number of response body bytes received from the server.
|
||||
.UNINDENT
|
||||
.TP
|
||||
.B time for request
|
||||
.INDENT 7.0
|
||||
.TP
|
||||
.B min
|
||||
The minimum time taken for request and response.
|
||||
.TP
|
||||
.B max
|
||||
The maximum time taken for request and response.
|
||||
.TP
|
||||
.B mean
|
||||
The mean time taken for request and response.
|
||||
.TP
|
||||
.B sd
|
||||
The standard deviation of the time taken for request and response.
|
||||
.TP
|
||||
.B +/\- sd
|
||||
The fraction of the number of requests within standard deviation
|
||||
range (mean +/\- sd) against total number of successful requests.
|
||||
.UNINDENT
|
||||
.TP
|
||||
.B time for connect
|
||||
.INDENT 7.0
|
||||
.TP
|
||||
.B min
|
||||
The minimum time taken to connect to a server including TLS
|
||||
handshake.
|
||||
.TP
|
||||
.B max
|
||||
The maximum time taken to connect to a server including TLS
|
||||
handshake.
|
||||
.TP
|
||||
.B mean
|
||||
The mean time taken to connect to a server including TLS
|
||||
handshake.
|
||||
.TP
|
||||
.B sd
|
||||
The standard deviation of the time taken to connect to a server.
|
||||
.TP
|
||||
.B +/\- sd
|
||||
The fraction of the number of connections within standard
|
||||
deviation range (mean +/\- sd) against total number of successful
|
||||
connections.
|
||||
.UNINDENT
|
||||
.TP
|
||||
.B time for 1st byte (of (decrypted in case of TLS) application data)
|
||||
.INDENT 7.0
|
||||
.TP
|
||||
.B min
|
||||
The minimum time taken to get 1st byte from a server.
|
||||
.TP
|
||||
.B max
|
||||
The maximum time taken to get 1st byte from a server.
|
||||
.TP
|
||||
.B mean
|
||||
The mean time taken to get 1st byte from a server.
|
||||
.TP
|
||||
.B sd
|
||||
The standard deviation of the time taken to get 1st byte from a
|
||||
server.
|
||||
.TP
|
||||
.B +/\- sd
|
||||
The fraction of the number of connections within standard
|
||||
deviation range (mean +/\- sd) against total number of successful
|
||||
connections.
|
||||
.UNINDENT
|
||||
.TP
|
||||
.B req/s
|
||||
.INDENT 7.0
|
||||
.TP
|
||||
.B min
|
||||
The minimum request per second among all clients.
|
||||
.TP
|
||||
.B max
|
||||
The maximum request per second among all clients.
|
||||
.TP
|
||||
.B mean
|
||||
The mean request per second among all clients.
|
||||
.TP
|
||||
.B sd
|
||||
The standard deviation of request per second among all clients.
|
||||
server.
|
||||
.TP
|
||||
.B +/\- sd
|
||||
The fraction of the number of connections within standard
|
||||
deviation range (mean +/\- sd) against total number of successful
|
||||
connections.
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.SH FLOW CONTROL
|
||||
.sp
|
||||
h2load sets large flow control window by default, and effectively
|
||||
disables flow control to avoid under utilization of server
|
||||
performance. To set smaller flow control window, use \fI\%\-w\fP and
|
||||
\fI\%\-W\fP options. For example, use \fB\-w16 \-W16\fP to set default
|
||||
window size described in HTTP/2 protocol specification.
|
||||
.SH SEE ALSO
|
||||
.sp
|
||||
\fBnghttp(1)\fP, \fBnghttpd(1)\fP, \fBnghttpx(1)\fP
|
||||
.SH AUTHOR
|
||||
Tatsuhiro Tsujikawa
|
||||
.SH COPYRIGHT
|
||||
2012, 2015, 2016, Tatsuhiro Tsujikawa
|
||||
.\" Generated by docutils manpage writer.
|
||||
.
|
||||
439
doc/h2load.1.rst
Normal file
439
doc/h2load.1.rst
Normal file
@@ -0,0 +1,439 @@
|
||||
|
||||
.. GENERATED by help2rst.py. DO NOT EDIT DIRECTLY.
|
||||
|
||||
.. program:: h2load
|
||||
|
||||
h2load(1)
|
||||
=========
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
|
||||
**h2load** [OPTIONS]... [URI]...
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
||||
benchmarking tool for HTTP/2 server
|
||||
|
||||
.. describe:: <URI>
|
||||
|
||||
Specify URI to access. Multiple URIs can be specified.
|
||||
URIs are used in this order for each client. All URIs
|
||||
are used, then first URI is used and then 2nd URI, and
|
||||
so on. The scheme, host and port in the subsequent
|
||||
URIs, if present, are ignored. Those in the first URI
|
||||
are used solely. Definition of a base URI overrides all
|
||||
scheme, host or port values.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
|
||||
.. option:: -n, --requests=<N>
|
||||
|
||||
Number of requests across all clients. If it is used
|
||||
with :option:`--timing-script-file` option, this option specifies
|
||||
the number of requests each client performs rather than
|
||||
the number of requests across all clients. This option
|
||||
is ignored if timing-based benchmarking is enabled (see
|
||||
:option:`--duration` option).
|
||||
|
||||
Default: ``1``
|
||||
|
||||
.. option:: -c, --clients=<N>
|
||||
|
||||
Number of concurrent clients. With :option:`-r` option, this
|
||||
specifies the maximum number of connections to be made.
|
||||
|
||||
Default: ``1``
|
||||
|
||||
.. option:: -t, --threads=<N>
|
||||
|
||||
Number of native threads.
|
||||
|
||||
Default: ``1``
|
||||
|
||||
.. option:: -i, --input-file=<PATH>
|
||||
|
||||
Path of a file with multiple URIs are separated by EOLs.
|
||||
This option will disable URIs getting from command-line.
|
||||
If '-' is given as <PATH>, URIs will be read from stdin.
|
||||
URIs are used in this order for each client. All URIs
|
||||
are used, then first URI is used and then 2nd URI, and
|
||||
so on. The scheme, host and port in the subsequent
|
||||
URIs, if present, are ignored. Those in the first URI
|
||||
are used solely. Definition of a base URI overrides all
|
||||
scheme, host or port values.
|
||||
|
||||
.. option:: -m, --max-concurrent-streams=<N>
|
||||
|
||||
Max concurrent streams to issue per session. When
|
||||
http/1.1 is used, this specifies the number of HTTP
|
||||
pipelining requests in-flight.
|
||||
|
||||
Default: ``1``
|
||||
|
||||
.. option:: -f, --max-frame-size=<SIZE>
|
||||
|
||||
Maximum frame size that the local endpoint is willing to
|
||||
receive.
|
||||
|
||||
Default: ``16K``
|
||||
|
||||
.. option:: -w, --window-bits=<N>
|
||||
|
||||
Sets the stream level initial window size to (2\*\*<N>)-1.
|
||||
For QUIC, <N> is capped to 26 (roughly 64MiB). It
|
||||
defaults to 24 (16MiB) for QUIC, and 30 for other
|
||||
protocols.
|
||||
|
||||
.. option:: -W, --connection-window-bits=<N>
|
||||
|
||||
Sets the connection level initial window size to
|
||||
(2\*\*<N>)-1.
|
||||
|
||||
Default: ``30``
|
||||
|
||||
.. option:: -H, --header=<HEADER>
|
||||
|
||||
Add/Override a header to the requests.
|
||||
|
||||
.. option:: --ciphers=<SUITE>
|
||||
|
||||
Set allowed cipher list for TLSv1.2 or earlier. The
|
||||
format of the string is described in OpenSSL ciphers(1).
|
||||
|
||||
Default: ``ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384``
|
||||
|
||||
.. option:: --tls13-ciphers=<SUITE>
|
||||
|
||||
Set allowed cipher list for TLSv1.3. The format of the
|
||||
string is described in OpenSSL ciphers(1).
|
||||
|
||||
Default: ``TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256``
|
||||
|
||||
.. option:: -p, --no-tls-proto=<PROTOID>
|
||||
|
||||
Specify ALPN identifier of the protocol to be used when
|
||||
accessing http URI without SSL/TLS.
|
||||
Available protocols: h2c and http/1.1
|
||||
|
||||
Default: ``h2c``
|
||||
|
||||
.. option:: -d, --data=<PATH>
|
||||
|
||||
Post FILE to server. The request method is changed to
|
||||
POST. For http/1.1 connection, if :option:`-d` is used, the
|
||||
maximum number of in-flight pipelined requests is set to
|
||||
1.
|
||||
|
||||
.. option:: -r, --rate=<N>
|
||||
|
||||
Specifies the fixed rate at which connections are
|
||||
created. The rate must be a positive integer,
|
||||
representing the number of connections to be made per
|
||||
rate period. The maximum number of connections to be
|
||||
made is given in :option:`-c` option. This rate will be
|
||||
distributed among threads as evenly as possible. For
|
||||
example, with :option:`-t`\2 and :option:`-r`\4, each thread gets 2
|
||||
connections per period. When the rate is 0, the program
|
||||
will run as it normally does, creating connections at
|
||||
whatever variable rate it wants. The default value for
|
||||
this option is 0. :option:`-r` and :option:`\-D` are mutually exclusive.
|
||||
|
||||
.. option:: --rate-period=<DURATION>
|
||||
|
||||
Specifies the time period between creating connections.
|
||||
The period must be a positive number, representing the
|
||||
length of the period in time. This option is ignored if
|
||||
the rate option is not used. The default value for this
|
||||
option is 1s.
|
||||
|
||||
.. option:: -D, --duration=<DURATION>
|
||||
|
||||
Specifies the main duration for the measurements in case
|
||||
of timing-based benchmarking. :option:`-D` and :option:`\-r` are mutually
|
||||
exclusive.
|
||||
|
||||
.. option:: --warm-up-time=<DURATION>
|
||||
|
||||
Specifies the time period before starting the actual
|
||||
measurements, in case of timing-based benchmarking.
|
||||
Needs to provided along with :option:`-D` option.
|
||||
|
||||
.. option:: -T, --connection-active-timeout=<DURATION>
|
||||
|
||||
Specifies the maximum time that h2load is willing to
|
||||
keep a connection open, regardless of the activity on
|
||||
said connection. <DURATION> must be a positive integer,
|
||||
specifying the amount of time to wait. When no timeout
|
||||
value is set (either active or inactive), h2load will
|
||||
keep a connection open indefinitely, waiting for a
|
||||
response.
|
||||
|
||||
.. option:: -N, --connection-inactivity-timeout=<DURATION>
|
||||
|
||||
Specifies the amount of time that h2load is willing to
|
||||
wait to see activity on a given connection. <DURATION>
|
||||
must be a positive integer, specifying the amount of
|
||||
time to wait. When no timeout value is set (either
|
||||
active or inactive), h2load will keep a connection open
|
||||
indefinitely, waiting for a response.
|
||||
|
||||
.. option:: --timing-script-file=<PATH>
|
||||
|
||||
Path of a file containing one or more lines separated by
|
||||
EOLs. Each script line is composed of two tab-separated
|
||||
fields. The first field represents the time offset from
|
||||
the start of execution, expressed as a positive value of
|
||||
milliseconds with microsecond resolution. The second
|
||||
field represents the URI. This option will disable URIs
|
||||
getting from command-line. If '-' is given as <PATH>,
|
||||
script lines will be read from stdin. Script lines are
|
||||
used in order for each client. If :option:`-n` is given, it must
|
||||
be less than or equal to the number of script lines,
|
||||
larger values are clamped to the number of script lines.
|
||||
If :option:`-n` is not given, the number of requests will default
|
||||
to the number of script lines. The scheme, host and
|
||||
port defined in the first URI are used solely. Values
|
||||
contained in other URIs, if present, are ignored.
|
||||
Definition of a base URI overrides all scheme, host or
|
||||
port values. :option:`--timing-script-file` and :option:`\--rps` are
|
||||
mutually exclusive.
|
||||
|
||||
.. option:: -B, --base-uri=(<URI>|unix:<PATH>)
|
||||
|
||||
Specify URI from which the scheme, host and port will be
|
||||
used for all requests. The base URI overrides all
|
||||
values defined either at the command line or inside
|
||||
input files. If argument starts with "unix:", then the
|
||||
rest of the argument will be treated as UNIX domain
|
||||
socket path. The connection is made through that path
|
||||
instead of TCP. In this case, scheme is inferred from
|
||||
the first URI appeared in the command line or inside
|
||||
input files as usual.
|
||||
|
||||
.. option:: --alpn-list=<LIST>
|
||||
|
||||
Comma delimited list of ALPN protocol identifier sorted
|
||||
in the order of preference. That means most desirable
|
||||
protocol comes first. The parameter must be delimited
|
||||
by a single comma only and any white spaces are treated
|
||||
as a part of protocol string.
|
||||
|
||||
Default: ``h2,http/1.1``
|
||||
|
||||
.. option:: --h1
|
||||
|
||||
Short hand for :option:`--alpn-list`\=http/1.1
|
||||
:option:`--no-tls-proto`\=http/1.1, which effectively force
|
||||
http/1.1 for both http and https URI.
|
||||
|
||||
.. option:: --header-table-size=<SIZE>
|
||||
|
||||
Specify decoder header table size.
|
||||
|
||||
Default: ``4K``
|
||||
|
||||
.. option:: --encoder-header-table-size=<SIZE>
|
||||
|
||||
Specify encoder header table size. The decoder (server)
|
||||
specifies the maximum dynamic table size it accepts.
|
||||
Then the negotiated dynamic table size is the minimum of
|
||||
this option value and the value which server specified.
|
||||
|
||||
Default: ``4K``
|
||||
|
||||
.. option:: --log-file=<PATH>
|
||||
|
||||
Write per-request information to a file as tab-separated
|
||||
columns: start time as microseconds since epoch; HTTP
|
||||
status code; microseconds until end of response. More
|
||||
columns may be added later. Rows are ordered by end-of-
|
||||
response time when using one worker thread, but may
|
||||
appear slightly out of order with multiple threads due
|
||||
to buffering. Status code is -1 for failed streams.
|
||||
|
||||
.. option:: --qlog-file-base=<PATH>
|
||||
|
||||
Enable qlog output and specify base file name for qlogs.
|
||||
Qlog is emitted for each connection. For a given base
|
||||
name "base", each output file name becomes
|
||||
"base.M.N.sqlog" where M is worker ID and N is client ID
|
||||
(e.g. "base.0.3.sqlog"). Only effective in QUIC runs.
|
||||
|
||||
.. option:: --connect-to=<HOST>[:<PORT>]
|
||||
|
||||
Host and port to connect instead of using the authority
|
||||
in <URI>.
|
||||
|
||||
.. option:: --rps=<N>
|
||||
|
||||
Specify request per second for each client. :option:`--rps` and
|
||||
:option:`--timing-script-file` are mutually exclusive.
|
||||
|
||||
.. option:: --groups=<GROUPS>
|
||||
|
||||
Specify the supported groups.
|
||||
|
||||
Default: ``X25519:P-256:P-384:P-521``
|
||||
|
||||
.. option:: --no-udp-gso
|
||||
|
||||
Disable UDP GSO.
|
||||
|
||||
.. option:: --max-udp-payload-size=<SIZE>
|
||||
|
||||
Specify the maximum outgoing UDP datagram payload size.
|
||||
|
||||
.. option:: --ktls
|
||||
|
||||
Enable ktls.
|
||||
|
||||
.. option:: --sni=<DNSNAME>
|
||||
|
||||
Send <DNSNAME> in TLS SNI, overriding the host name
|
||||
specified in URI.
|
||||
|
||||
.. option:: -v, --verbose
|
||||
|
||||
Output debug information.
|
||||
|
||||
.. option:: --version
|
||||
|
||||
Display version information and exit.
|
||||
|
||||
.. option:: -h, --help
|
||||
|
||||
Display this help and exit.
|
||||
|
||||
|
||||
|
||||
The <SIZE> argument is an integer and an optional unit (e.g., 10K is
|
||||
10 * 1024). Units are K, M and G (powers of 1024).
|
||||
|
||||
The <DURATION> argument is an integer and an optional unit (e.g., 1s
|
||||
is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms
|
||||
(hours, minutes, seconds and milliseconds, respectively). If a unit
|
||||
is omitted, a second is used as unit.
|
||||
|
||||
.. _h2load-1-output:
|
||||
|
||||
OUTPUT
|
||||
------
|
||||
|
||||
requests
|
||||
total
|
||||
The number of requests h2load was instructed to make.
|
||||
started
|
||||
The number of requests h2load has started.
|
||||
done
|
||||
The number of requests completed.
|
||||
succeeded
|
||||
The number of requests completed successfully. Only HTTP status
|
||||
code 2xx or 3xx are considered as success.
|
||||
failed
|
||||
The number of requests failed, including HTTP level failures
|
||||
(non-successful HTTP status code).
|
||||
errored
|
||||
The number of requests failed, except for HTTP level failures.
|
||||
This is the subset of the number reported in ``failed`` and most
|
||||
likely the network level failures or stream was reset by
|
||||
RST_STREAM.
|
||||
timeout
|
||||
The number of requests whose connection timed out before they were
|
||||
completed. This is the subset of the number reported in
|
||||
``errored``.
|
||||
|
||||
status codes
|
||||
The number of status code h2load received.
|
||||
|
||||
traffic
|
||||
total
|
||||
The number of bytes received from the server "on the wire". If
|
||||
requests were made via TLS, this value is the number of decrypted
|
||||
bytes.
|
||||
headers
|
||||
The number of response header bytes from the server without
|
||||
decompression. The ``space savings`` shows efficiency of header
|
||||
compression. Let ``decompressed(headers)`` to the number of bytes
|
||||
used for header fields after decompression. The ``space savings``
|
||||
is calculated by (1 - ``headers`` / ``decompressed(headers)``) *
|
||||
100. For HTTP/1.1, this is usually 0.00%, since it does not have
|
||||
header compression. For HTTP/2, it shows some insightful numbers.
|
||||
data
|
||||
The number of response body bytes received from the server.
|
||||
|
||||
time for request
|
||||
min
|
||||
The minimum time taken for request and response.
|
||||
max
|
||||
The maximum time taken for request and response.
|
||||
mean
|
||||
The mean time taken for request and response.
|
||||
sd
|
||||
The standard deviation of the time taken for request and response.
|
||||
+/- sd
|
||||
The fraction of the number of requests within standard deviation
|
||||
range (mean +/- sd) against total number of successful requests.
|
||||
|
||||
time for connect
|
||||
min
|
||||
The minimum time taken to connect to a server including TLS
|
||||
handshake.
|
||||
max
|
||||
The maximum time taken to connect to a server including TLS
|
||||
handshake.
|
||||
mean
|
||||
The mean time taken to connect to a server including TLS
|
||||
handshake.
|
||||
sd
|
||||
The standard deviation of the time taken to connect to a server.
|
||||
+/- sd
|
||||
The fraction of the number of connections within standard
|
||||
deviation range (mean +/- sd) against total number of successful
|
||||
connections.
|
||||
|
||||
time for 1st byte (of (decrypted in case of TLS) application data)
|
||||
min
|
||||
The minimum time taken to get 1st byte from a server.
|
||||
max
|
||||
The maximum time taken to get 1st byte from a server.
|
||||
mean
|
||||
The mean time taken to get 1st byte from a server.
|
||||
sd
|
||||
The standard deviation of the time taken to get 1st byte from a
|
||||
server.
|
||||
+/- sd
|
||||
The fraction of the number of connections within standard
|
||||
deviation range (mean +/- sd) against total number of successful
|
||||
connections.
|
||||
|
||||
req/s
|
||||
min
|
||||
The minimum request per second among all clients.
|
||||
max
|
||||
The maximum request per second among all clients.
|
||||
mean
|
||||
The mean request per second among all clients.
|
||||
sd
|
||||
The standard deviation of request per second among all clients.
|
||||
server.
|
||||
+/- sd
|
||||
The fraction of the number of connections within standard
|
||||
deviation range (mean +/- sd) against total number of successful
|
||||
connections.
|
||||
|
||||
FLOW CONTROL
|
||||
------------
|
||||
|
||||
h2load sets large flow control window by default, and effectively
|
||||
disables flow control to avoid under utilization of server
|
||||
performance. To set smaller flow control window, use :option:`-w` and
|
||||
:option:`-W` options. For example, use ``-w16 -W16`` to set default
|
||||
window size described in HTTP/2 protocol specification.
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
|
||||
:manpage:`nghttp(1)`, :manpage:`nghttpd(1)`, :manpage:`nghttpx(1)`
|
||||
120
doc/h2load.h2r
Normal file
120
doc/h2load.h2r
Normal file
@@ -0,0 +1,120 @@
|
||||
.. _h2load-1-output:
|
||||
|
||||
OUTPUT
|
||||
------
|
||||
|
||||
requests
|
||||
total
|
||||
The number of requests h2load was instructed to make.
|
||||
started
|
||||
The number of requests h2load has started.
|
||||
done
|
||||
The number of requests completed.
|
||||
succeeded
|
||||
The number of requests completed successfully. Only HTTP status
|
||||
code 2xx or 3xx are considered as success.
|
||||
failed
|
||||
The number of requests failed, including HTTP level failures
|
||||
(non-successful HTTP status code).
|
||||
errored
|
||||
The number of requests failed, except for HTTP level failures.
|
||||
This is the subset of the number reported in ``failed`` and most
|
||||
likely the network level failures or stream was reset by
|
||||
RST_STREAM.
|
||||
timeout
|
||||
The number of requests whose connection timed out before they were
|
||||
completed. This is the subset of the number reported in
|
||||
``errored``.
|
||||
|
||||
status codes
|
||||
The number of status code h2load received.
|
||||
|
||||
traffic
|
||||
total
|
||||
The number of bytes received from the server "on the wire". If
|
||||
requests were made via TLS, this value is the number of decrypted
|
||||
bytes.
|
||||
headers
|
||||
The number of response header bytes from the server without
|
||||
decompression. The ``space savings`` shows efficiency of header
|
||||
compression. Let ``decompressed(headers)`` to the number of bytes
|
||||
used for header fields after decompression. The ``space savings``
|
||||
is calculated by (1 - ``headers`` / ``decompressed(headers)``) *
|
||||
100. For HTTP/1.1, this is usually 0.00%, since it does not have
|
||||
header compression. For HTTP/2, it shows some insightful numbers.
|
||||
data
|
||||
The number of response body bytes received from the server.
|
||||
|
||||
time for request
|
||||
min
|
||||
The minimum time taken for request and response.
|
||||
max
|
||||
The maximum time taken for request and response.
|
||||
mean
|
||||
The mean time taken for request and response.
|
||||
sd
|
||||
The standard deviation of the time taken for request and response.
|
||||
+/- sd
|
||||
The fraction of the number of requests within standard deviation
|
||||
range (mean +/- sd) against total number of successful requests.
|
||||
|
||||
time for connect
|
||||
min
|
||||
The minimum time taken to connect to a server including TLS
|
||||
handshake.
|
||||
max
|
||||
The maximum time taken to connect to a server including TLS
|
||||
handshake.
|
||||
mean
|
||||
The mean time taken to connect to a server including TLS
|
||||
handshake.
|
||||
sd
|
||||
The standard deviation of the time taken to connect to a server.
|
||||
+/- sd
|
||||
The fraction of the number of connections within standard
|
||||
deviation range (mean +/- sd) against total number of successful
|
||||
connections.
|
||||
|
||||
time for 1st byte (of (decrypted in case of TLS) application data)
|
||||
min
|
||||
The minimum time taken to get 1st byte from a server.
|
||||
max
|
||||
The maximum time taken to get 1st byte from a server.
|
||||
mean
|
||||
The mean time taken to get 1st byte from a server.
|
||||
sd
|
||||
The standard deviation of the time taken to get 1st byte from a
|
||||
server.
|
||||
+/- sd
|
||||
The fraction of the number of connections within standard
|
||||
deviation range (mean +/- sd) against total number of successful
|
||||
connections.
|
||||
|
||||
req/s
|
||||
min
|
||||
The minimum request per second among all clients.
|
||||
max
|
||||
The maximum request per second among all clients.
|
||||
mean
|
||||
The mean request per second among all clients.
|
||||
sd
|
||||
The standard deviation of request per second among all clients.
|
||||
server.
|
||||
+/- sd
|
||||
The fraction of the number of connections within standard
|
||||
deviation range (mean +/- sd) against total number of successful
|
||||
connections.
|
||||
|
||||
FLOW CONTROL
|
||||
------------
|
||||
|
||||
h2load sets large flow control window by default, and effectively
|
||||
disables flow control to avoid under utilization of server
|
||||
performance. To set smaller flow control window, use :option:`-w` and
|
||||
:option:`-W` options. For example, use ``-w16 -W16`` to set default
|
||||
window size described in HTTP/2 protocol specification.
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
|
||||
:manpage:`nghttp(1)`, :manpage:`nghttpd(1)`, :manpage:`nghttpx(1)`
|
||||
@@ -1,26 +0,0 @@
|
||||
.. nghttp2 documentation master file, created by
|
||||
sphinx-quickstart on Sun Mar 11 22:57:49 2012.
|
||||
You can adapt this file completely to your liking, but it should at least
|
||||
contain the root `toctree` directive.
|
||||
|
||||
nghttp2 - HTTP/2.0 C Library
|
||||
============================
|
||||
|
||||
This is an experimental implementation of Hypertext Transfer Protocol
|
||||
version 2.0.
|
||||
|
||||
Contents:
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
package_README
|
||||
apiref
|
||||
nghttp2.h
|
||||
nghttp2ver.h
|
||||
|
||||
Resources
|
||||
---------
|
||||
|
||||
* http://tools.ietf.org/html/draft-ietf-httpbis-http2-06
|
||||
* http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-03
|
||||
1
doc/index.rst.in
Normal file
1
doc/index.rst.in
Normal file
@@ -0,0 +1 @@
|
||||
.. include:: @top_srcdir@/doc/sources/index.rst
|
||||
259
doc/mkapiref.py
259
doc/mkapiref.py
@@ -1,8 +1,11 @@
|
||||
#!/usr/bin/env python
|
||||
# nghttp2 - HTTP/2.0 C Library
|
||||
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
# nghttp2 - HTTP/2 C Library
|
||||
#
|
||||
# Copyright (c) 2020 nghttp2 contributors
|
||||
# Copyright (c) 2020 ngtcp2 contributors
|
||||
# Copyright (c) 2012 Tatsuhiro Tsujikawa
|
||||
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
@@ -23,20 +26,23 @@
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
# Generates API reference from C source code.
|
||||
from __future__ import print_function # At least python 2.6 is required
|
||||
import re, sys, argparse
|
||||
|
||||
import re, sys, argparse, os.path
|
||||
|
||||
class FunctionDoc:
|
||||
def __init__(self, name, content, domain):
|
||||
def __init__(self, name, content, domain, filename):
|
||||
self.name = name
|
||||
self.content = content
|
||||
self.domain = domain
|
||||
if self.domain == 'function':
|
||||
self.funcname = re.search(r'(nghttp2_[^ )]+)\(', self.name).group(1)
|
||||
self.filename = filename
|
||||
|
||||
def write(self, out):
|
||||
print('''.. {}:: {}'''.format(self.domain, self.name))
|
||||
print('')
|
||||
out.write('.. {}:: {}\n'.format(self.domain, self.name))
|
||||
out.write('\n')
|
||||
for line in self.content:
|
||||
print(' {}'.format(line))
|
||||
out.write(' {}\n'.format(line))
|
||||
|
||||
class StructDoc:
|
||||
def __init__(self, name, content, members, member_domain):
|
||||
@@ -47,17 +53,37 @@ class StructDoc:
|
||||
|
||||
def write(self, out):
|
||||
if self.name:
|
||||
print('''.. type:: {}'''.format(self.name))
|
||||
print('')
|
||||
out.write('.. type:: {}\n'.format(self.name))
|
||||
out.write('\n')
|
||||
for line in self.content:
|
||||
print(' {}'.format(line))
|
||||
print('')
|
||||
out.write(' {}\n'.format(line))
|
||||
out.write('\n')
|
||||
for name, content in self.members:
|
||||
print(''' .. {}:: {}'''.format(self.member_domain, name))
|
||||
print('')
|
||||
out.write(' .. {}:: {}\n'.format(self.member_domain, name))
|
||||
out.write('\n')
|
||||
for line in content:
|
||||
print(''' {}'''.format(line))
|
||||
print('')
|
||||
out.write(' {}\n'.format(line))
|
||||
out.write('\n')
|
||||
|
||||
class EnumDoc:
|
||||
def __init__(self, name, content, members):
|
||||
self.name = name
|
||||
self.content = content
|
||||
self.members = members
|
||||
|
||||
def write(self, out):
|
||||
if self.name:
|
||||
out.write('.. type:: {}\n'.format(self.name))
|
||||
out.write('\n')
|
||||
for line in self.content:
|
||||
out.write(' {}\n'.format(line))
|
||||
out.write('\n')
|
||||
for name, content in self.members:
|
||||
out.write(' .. enum:: {}\n'.format(name))
|
||||
out.write('\n')
|
||||
for line in content:
|
||||
out.write(' {}\n'.format(line))
|
||||
out.write('\n')
|
||||
|
||||
class MacroDoc:
|
||||
def __init__(self, name, content):
|
||||
@@ -65,47 +91,120 @@ class MacroDoc:
|
||||
self.content = content
|
||||
|
||||
def write(self, out):
|
||||
print('''.. macro:: {}'''.format(self.name))
|
||||
print('')
|
||||
out.write('''.. macro:: {}\n'''.format(self.name))
|
||||
out.write('\n')
|
||||
for line in self.content:
|
||||
print(' {}'.format(line))
|
||||
out.write(' {}\n'.format(line))
|
||||
|
||||
def make_api_ref(infiles):
|
||||
class MacroSectionDoc:
|
||||
def __init__(self, content):
|
||||
self.content = content
|
||||
|
||||
def write(self, out):
|
||||
out.write('\n')
|
||||
c = ' '.join(self.content).strip()
|
||||
out.write(c)
|
||||
out.write('\n')
|
||||
out.write('-' * len(c))
|
||||
out.write('\n\n')
|
||||
|
||||
class TypedefDoc:
|
||||
def __init__(self, name, content):
|
||||
self.name = name
|
||||
self.content = content
|
||||
|
||||
def write(self, out):
|
||||
out.write('''.. type:: {}\n'''.format(self.name))
|
||||
out.write('\n')
|
||||
for line in self.content:
|
||||
out.write(' {}\n'.format(line))
|
||||
|
||||
def make_api_ref(infile):
|
||||
macros = []
|
||||
enums = []
|
||||
types = []
|
||||
functions = []
|
||||
for infile in infiles:
|
||||
while True:
|
||||
while True:
|
||||
line = infile.readline()
|
||||
if not line:
|
||||
break
|
||||
elif line == '/**\n':
|
||||
line = infile.readline()
|
||||
if not line:
|
||||
break
|
||||
elif line == '/**\n':
|
||||
line = infile.readline()
|
||||
doctype = line.split()[1]
|
||||
if doctype == '@function':
|
||||
functions.append(process_function('function', infile))
|
||||
elif doctype == '@functypedef':
|
||||
types.append(process_function('type', infile))
|
||||
elif doctype == '@struct' or doctype == '@union':
|
||||
types.append(process_struct(infile))
|
||||
elif doctype == '@enum':
|
||||
enums.append(process_enum(infile))
|
||||
elif doctype == '@macro':
|
||||
macros.append(process_macro(infile))
|
||||
alldocs = [('Macros', macros),
|
||||
('Enums', enums),
|
||||
('Types (structs, unions and typedefs)', types),
|
||||
('Functions', functions)]
|
||||
for title, docs in alldocs:
|
||||
if not docs:
|
||||
continue
|
||||
print(title)
|
||||
print('-'*len(title))
|
||||
for doc in docs:
|
||||
doc.write(sys.stdout)
|
||||
print('')
|
||||
print('')
|
||||
doctype = line.split()[1]
|
||||
if doctype == '@function':
|
||||
functions.append(process_function('function', infile))
|
||||
elif doctype == '@functypedef':
|
||||
types.append(process_function('type', infile))
|
||||
elif doctype == '@struct' or doctype == '@union':
|
||||
types.append(process_struct(infile))
|
||||
elif doctype == '@enum':
|
||||
enums.append(process_enum(infile))
|
||||
elif doctype == '@macro':
|
||||
macros.append(process_macro(infile))
|
||||
elif doctype == '@macrosection':
|
||||
macros.append(process_macrosection(infile))
|
||||
elif doctype == '@typedef':
|
||||
types.append(process_typedef(infile))
|
||||
return macros, enums, types, functions
|
||||
|
||||
def output(
|
||||
title, indexfile, macrosfile, enumsfile, typesfile, funcsdir,
|
||||
macros, enums, types, functions):
|
||||
indexfile.write('''
|
||||
{title}
|
||||
{titledecoration}
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
{macros}
|
||||
{enums}
|
||||
{types}
|
||||
'''.format(
|
||||
title=title, titledecoration='='*len(title),
|
||||
macros=os.path.splitext(os.path.basename(macrosfile.name))[0],
|
||||
enums=os.path.splitext(os.path.basename(enumsfile.name))[0],
|
||||
types=os.path.splitext(os.path.basename(typesfile.name))[0],
|
||||
))
|
||||
|
||||
for doc in functions:
|
||||
indexfile.write(' {}\n'.format(doc.funcname))
|
||||
|
||||
macrosfile.write('''
|
||||
Macros
|
||||
======
|
||||
''')
|
||||
for doc in macros:
|
||||
doc.write(macrosfile)
|
||||
|
||||
enumsfile.write('''
|
||||
Enums
|
||||
=====
|
||||
''')
|
||||
for doc in enums:
|
||||
doc.write(enumsfile)
|
||||
|
||||
typesfile.write('''
|
||||
Types (structs, unions and typedefs)
|
||||
====================================
|
||||
''')
|
||||
for doc in types:
|
||||
doc.write(typesfile)
|
||||
|
||||
for doc in functions:
|
||||
with open(os.path.join(funcsdir, doc.funcname + '.rst'), 'w') as f:
|
||||
f.write('''
|
||||
{funcname}
|
||||
{secul}
|
||||
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
*#include <nghttp2/{filename}>*
|
||||
|
||||
'''.format(funcname=doc.funcname, secul='='*len(doc.funcname),
|
||||
filename=doc.filename))
|
||||
doc.write(f)
|
||||
|
||||
def process_macro(infile):
|
||||
content = read_content(infile)
|
||||
@@ -113,6 +212,17 @@ def process_macro(infile):
|
||||
macro_name = line.split()[1]
|
||||
return MacroDoc(macro_name, content)
|
||||
|
||||
def process_macrosection(infile):
|
||||
content = read_content(infile)
|
||||
return MacroSectionDoc(content)
|
||||
|
||||
def process_typedef(infile):
|
||||
content = read_content(infile)
|
||||
typedef = infile.readline()
|
||||
typedef = re.sub(r';\n$', '', typedef)
|
||||
typedef = re.sub(r'typedef ', '', typedef)
|
||||
return TypedefDoc(typedef, content)
|
||||
|
||||
def process_enum(infile):
|
||||
members = []
|
||||
enum_name = None
|
||||
@@ -125,16 +235,16 @@ def process_enum(infile):
|
||||
member_content = read_content(infile)
|
||||
line = infile.readline()
|
||||
items = line.split()
|
||||
member_name = items[0]
|
||||
member_name = items[0].rstrip(',')
|
||||
if len(items) >= 3:
|
||||
member_content.insert(0, '(``{}``) '\
|
||||
.format(items[2].rstrip(',')))
|
||||
.format(' '.join(items[2:]).rstrip(',')))
|
||||
members.append((member_name, member_content))
|
||||
elif line.startswith('}'):
|
||||
enum_name = line.rstrip().split()[1]
|
||||
enum_name = re.sub(r';$', '', enum_name)
|
||||
break
|
||||
return StructDoc(enum_name, content, members, 'macro')
|
||||
return EnumDoc(enum_name, content, members)
|
||||
|
||||
def process_struct(infile):
|
||||
members = []
|
||||
@@ -174,7 +284,10 @@ def process_function(domain, infile):
|
||||
func_proto = ''.join(func_proto)
|
||||
func_proto = re.sub(r';\n$', '', func_proto)
|
||||
func_proto = re.sub(r'\s+', ' ', func_proto)
|
||||
return FunctionDoc(func_proto, content, domain)
|
||||
func_proto = re.sub(r'NGHTTP2_EXTERN ', '', func_proto)
|
||||
func_proto = re.sub(r'typedef ', '', func_proto)
|
||||
filename = os.path.basename(infile.name)
|
||||
return FunctionDoc(func_proto, content, domain, filename)
|
||||
|
||||
def read_content(infile):
|
||||
content = []
|
||||
@@ -194,17 +307,37 @@ def arg_repl(matchobj):
|
||||
def transform_content(content):
|
||||
content = re.sub(r'^\s+\* ?', '', content)
|
||||
content = re.sub(r'\|([^\s|]+)\|', arg_repl, content)
|
||||
content = re.sub(r':enum:', ':macro:', content)
|
||||
return content
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(description="Generate API reference")
|
||||
parser.add_argument('--header', type=argparse.FileType('rb', 0),
|
||||
help='header inserted at the top of the page')
|
||||
parser.add_argument('files', nargs='+', type=argparse.FileType('rb', 0),
|
||||
parser.add_argument('--title', default='API Reference',
|
||||
help='title of index page')
|
||||
parser.add_argument('index', type=argparse.FileType('w'),
|
||||
help='index output file')
|
||||
parser.add_argument('macros', type=argparse.FileType('w'),
|
||||
help='macros section output file. The filename should be macros.rst')
|
||||
parser.add_argument('enums', type=argparse.FileType('w'),
|
||||
help='enums section output file. The filename should be enums.rst')
|
||||
parser.add_argument('types', type=argparse.FileType('w'),
|
||||
help='types section output file. The filename should be types.rst')
|
||||
parser.add_argument('funcsdir',
|
||||
help='functions doc output dir')
|
||||
parser.add_argument('files', nargs='+', type=argparse.FileType('r'),
|
||||
help='source file')
|
||||
args = parser.parse_args()
|
||||
if args.header:
|
||||
print(args.header.read())
|
||||
macros = []
|
||||
enums = []
|
||||
types = []
|
||||
funcs = []
|
||||
for infile in args.files:
|
||||
make_api_ref(args.files)
|
||||
m, e, t, f = make_api_ref(infile)
|
||||
macros.extend(m)
|
||||
enums.extend(e)
|
||||
types.extend(t)
|
||||
funcs.extend(f)
|
||||
funcs.sort(key=lambda x: x.funcname)
|
||||
output(
|
||||
args.title,
|
||||
args.index, args.macros, args.enums, args.types, args.funcsdir,
|
||||
macros, enums, types, funcs)
|
||||
|
||||
270
doc/nghttp.1
Normal file
270
doc/nghttp.1
Normal file
@@ -0,0 +1,270 @@
|
||||
.\" Man page generated from reStructuredText.
|
||||
.
|
||||
.
|
||||
.nr rst2man-indent-level 0
|
||||
.
|
||||
.de1 rstReportMargin
|
||||
\\$1 \\n[an-margin]
|
||||
level \\n[rst2man-indent-level]
|
||||
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
-
|
||||
\\n[rst2man-indent0]
|
||||
\\n[rst2man-indent1]
|
||||
\\n[rst2man-indent2]
|
||||
..
|
||||
.de1 INDENT
|
||||
.\" .rstReportMargin pre:
|
||||
. RS \\$1
|
||||
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
|
||||
. nr rst2man-indent-level +1
|
||||
.\" .rstReportMargin post:
|
||||
..
|
||||
.de UNINDENT
|
||||
. RE
|
||||
.\" indent \\n[an-margin]
|
||||
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.nr rst2man-indent-level -1
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "NGHTTP" "1" "Oct 25, 2025" "1.68.0" "nghttp2"
|
||||
.SH NAME
|
||||
nghttp \- HTTP/2 client
|
||||
.SH SYNOPSIS
|
||||
.sp
|
||||
\fBnghttp\fP [OPTIONS]... <URI>...
|
||||
.SH DESCRIPTION
|
||||
.sp
|
||||
HTTP/2 client
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B <URI>
|
||||
Specify URI to access.
|
||||
.UNINDENT
|
||||
.SH OPTIONS
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-v, \-\-verbose
|
||||
Print debug information such as reception and
|
||||
transmission of frames and name/value pairs. Specifying
|
||||
this option multiple times increases verbosity.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-n, \-\-null\-out
|
||||
Discard downloaded data.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-O, \-\-remote\-name
|
||||
Save download data in the current directory. The
|
||||
filename is derived from URI. If URI ends with \(aq\fI/\fP\(aq,
|
||||
\(aqindex.html\(aq is used as a filename. Not implemented
|
||||
yet.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-t, \-\-timeout=<DURATION>
|
||||
Timeout each request after <DURATION>. Set 0 to disable
|
||||
timeout.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-w, \-\-window\-bits=<N>
|
||||
Sets the stream level initial window size to 2**<N>\-1.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-W, \-\-connection\-window\-bits=<N>
|
||||
Sets the connection level initial window size to
|
||||
2**<N>\-1.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-a, \-\-get\-assets
|
||||
Download assets such as stylesheets, images and script
|
||||
files linked from the downloaded resource. Only links
|
||||
whose origins are the same with the linking resource
|
||||
will be downloaded. nghttp prioritizes resources using
|
||||
HTTP/2 dependency based priority. The priority order,
|
||||
from highest to lowest, is html itself, css, javascript
|
||||
and images.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-s, \-\-stat
|
||||
Print statistics.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-H, \-\-header=<HEADER>
|
||||
Add a header to the requests. Example: \fI\%\-H\fP\(aq:method: PUT\(aq
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-trailer=<HEADER>
|
||||
Add a trailer header to the requests. <HEADER> must not
|
||||
include pseudo header field (header field name starting
|
||||
with \(aq:\(aq). To send trailer, one must use \fI\%\-d\fP option to
|
||||
send request body. Example: \fI\%\-\-trailer\fP \(aqfoo: bar\(aq.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-cert=<CERT>
|
||||
Use the specified client certificate file. The file
|
||||
must be in PEM format.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-key=<KEY>
|
||||
Use the client private key file. The file must be in
|
||||
PEM format.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-d, \-\-data=<PATH>
|
||||
Post FILE to server. If \(aq\-\(aq is given, data will be read
|
||||
from stdin.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-m, \-\-multiply=<N>
|
||||
Request each URI <N> times. By default, same URI is not
|
||||
requested twice. This option disables it too.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-u, \-\-upgrade
|
||||
Perform HTTP Upgrade for HTTP/2. This option is ignored
|
||||
if the request URI has https scheme. If \fI\%\-d\fP is used, the
|
||||
HTTP upgrade request is performed with OPTIONS method.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-extpri=<PRI>
|
||||
Sets RFC 9218 priority of given URI. <PRI> must be the
|
||||
wire format of priority header field (e.g., \(dqu=3,i\(dq).
|
||||
This option can be used multiple times, and N\-th
|
||||
\fI\%\-\-extpri\fP option sets priority of N\-th URI in the command
|
||||
line. If the number of this option is less than the
|
||||
number of URI, the last option value is repeated. If
|
||||
there is no \fI\%\-\-extpri\fP option, urgency is 3, and
|
||||
incremental is false.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-M, \-\-peer\-max\-concurrent\-streams=<N>
|
||||
Use <N> as SETTINGS_MAX_CONCURRENT_STREAMS value of
|
||||
remote endpoint as if it is received in SETTINGS frame.
|
||||
.sp
|
||||
Default: \fB100\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-c, \-\-header\-table\-size=<SIZE>
|
||||
Specify decoder header table size. If this option is
|
||||
used multiple times, and the minimum value among the
|
||||
given values except for last one is strictly less than
|
||||
the last value, that minimum value is set in SETTINGS
|
||||
frame payload before the last value, to simulate
|
||||
multiple header table size change.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-encoder\-header\-table\-size=<SIZE>
|
||||
Specify encoder header table size. The decoder (server)
|
||||
specifies the maximum dynamic table size it accepts.
|
||||
Then the negotiated dynamic table size is the minimum of
|
||||
this option value and the value which server specified.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-b, \-\-padding=<N>
|
||||
Add at most <N> bytes to a frame payload as padding.
|
||||
Specify 0 to disable padding.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-r, \-\-har=<PATH>
|
||||
Output HTTP transactions <PATH> in HAR format. If \(aq\-\(aq
|
||||
is given, data is written to stdout.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-color
|
||||
Force colored log output.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-continuation
|
||||
Send large header to test CONTINUATION.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-no\-content\-length
|
||||
Don\(aqt send content\-length header field.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-hexdump
|
||||
Display the incoming traffic in hexadecimal (Canonical
|
||||
hex+ASCII display). If SSL/TLS is used, decrypted data
|
||||
are used.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-no\-push
|
||||
Disable server push.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-max\-concurrent\-streams=<N>
|
||||
The number of concurrent pushed streams this client
|
||||
accepts.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-expect\-continue
|
||||
Perform an Expect/Continue handshake: wait to send DATA
|
||||
(up to a short timeout) until the server sends a 100
|
||||
Continue interim response. This option is ignored unless
|
||||
combined with the \fI\%\-d\fP option.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-y, \-\-no\-verify\-peer
|
||||
Suppress warning on server certificate verification
|
||||
failure.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-ktls
|
||||
Enable ktls.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-version
|
||||
Display version information and exit.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-h, \-\-help
|
||||
Display this help and exit.
|
||||
.UNINDENT
|
||||
.sp
|
||||
The <SIZE> argument is an integer and an optional unit (e.g., 10K is
|
||||
10 * 1024). Units are K, M and G (powers of 1024).
|
||||
.sp
|
||||
The <DURATION> argument is an integer and an optional unit (e.g., 1s
|
||||
is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms
|
||||
(hours, minutes, seconds and milliseconds, respectively). If a unit
|
||||
is omitted, a second is used as unit.
|
||||
.SH SEE ALSO
|
||||
.sp
|
||||
\fBnghttpd(1)\fP, \fBnghttpx(1)\fP, \fBh2load(1)\fP
|
||||
.SH AUTHOR
|
||||
Tatsuhiro Tsujikawa
|
||||
.SH COPYRIGHT
|
||||
2012, 2015, 2016, Tatsuhiro Tsujikawa
|
||||
.\" Generated by docutils manpage writer.
|
||||
.
|
||||
216
doc/nghttp.1.rst
Normal file
216
doc/nghttp.1.rst
Normal file
@@ -0,0 +1,216 @@
|
||||
|
||||
.. GENERATED by help2rst.py. DO NOT EDIT DIRECTLY.
|
||||
|
||||
.. program:: nghttp
|
||||
|
||||
nghttp(1)
|
||||
=========
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
|
||||
**nghttp** [OPTIONS]... <URI>...
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
||||
HTTP/2 client
|
||||
|
||||
.. describe:: <URI>
|
||||
|
||||
Specify URI to access.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
|
||||
.. option:: -v, --verbose
|
||||
|
||||
Print debug information such as reception and
|
||||
transmission of frames and name/value pairs. Specifying
|
||||
this option multiple times increases verbosity.
|
||||
|
||||
.. option:: -n, --null-out
|
||||
|
||||
Discard downloaded data.
|
||||
|
||||
.. option:: -O, --remote-name
|
||||
|
||||
Save download data in the current directory. The
|
||||
filename is derived from URI. If URI ends with '*/*',
|
||||
'index.html' is used as a filename. Not implemented
|
||||
yet.
|
||||
|
||||
.. option:: -t, --timeout=<DURATION>
|
||||
|
||||
Timeout each request after <DURATION>. Set 0 to disable
|
||||
timeout.
|
||||
|
||||
.. option:: -w, --window-bits=<N>
|
||||
|
||||
Sets the stream level initial window size to 2\*\*<N>-1.
|
||||
|
||||
.. option:: -W, --connection-window-bits=<N>
|
||||
|
||||
Sets the connection level initial window size to
|
||||
2\*\*<N>-1.
|
||||
|
||||
.. option:: -a, --get-assets
|
||||
|
||||
Download assets such as stylesheets, images and script
|
||||
files linked from the downloaded resource. Only links
|
||||
whose origins are the same with the linking resource
|
||||
will be downloaded. nghttp prioritizes resources using
|
||||
HTTP/2 dependency based priority. The priority order,
|
||||
from highest to lowest, is html itself, css, javascript
|
||||
and images.
|
||||
|
||||
.. option:: -s, --stat
|
||||
|
||||
Print statistics.
|
||||
|
||||
.. option:: -H, --header=<HEADER>
|
||||
|
||||
Add a header to the requests. Example: :option:`-H`\':method: PUT'
|
||||
|
||||
.. option:: --trailer=<HEADER>
|
||||
|
||||
Add a trailer header to the requests. <HEADER> must not
|
||||
include pseudo header field (header field name starting
|
||||
with ':'). To send trailer, one must use :option:`-d` option to
|
||||
send request body. Example: :option:`--trailer` 'foo: bar'.
|
||||
|
||||
.. option:: --cert=<CERT>
|
||||
|
||||
Use the specified client certificate file. The file
|
||||
must be in PEM format.
|
||||
|
||||
.. option:: --key=<KEY>
|
||||
|
||||
Use the client private key file. The file must be in
|
||||
PEM format.
|
||||
|
||||
.. option:: -d, --data=<PATH>
|
||||
|
||||
Post FILE to server. If '-' is given, data will be read
|
||||
from stdin.
|
||||
|
||||
.. option:: -m, --multiply=<N>
|
||||
|
||||
Request each URI <N> times. By default, same URI is not
|
||||
requested twice. This option disables it too.
|
||||
|
||||
.. option:: -u, --upgrade
|
||||
|
||||
Perform HTTP Upgrade for HTTP/2. This option is ignored
|
||||
if the request URI has https scheme. If :option:`-d` is used, the
|
||||
HTTP upgrade request is performed with OPTIONS method.
|
||||
|
||||
.. option:: --extpri=<PRI>
|
||||
|
||||
Sets RFC 9218 priority of given URI. <PRI> must be the
|
||||
wire format of priority header field (e.g., "u=3,i").
|
||||
This option can be used multiple times, and N-th
|
||||
:option:`--extpri` option sets priority of N-th URI in the command
|
||||
line. If the number of this option is less than the
|
||||
number of URI, the last option value is repeated. If
|
||||
there is no :option:`--extpri` option, urgency is 3, and
|
||||
incremental is false.
|
||||
|
||||
.. option:: -M, --peer-max-concurrent-streams=<N>
|
||||
|
||||
Use <N> as SETTINGS_MAX_CONCURRENT_STREAMS value of
|
||||
remote endpoint as if it is received in SETTINGS frame.
|
||||
|
||||
Default: ``100``
|
||||
|
||||
.. option:: -c, --header-table-size=<SIZE>
|
||||
|
||||
Specify decoder header table size. If this option is
|
||||
used multiple times, and the minimum value among the
|
||||
given values except for last one is strictly less than
|
||||
the last value, that minimum value is set in SETTINGS
|
||||
frame payload before the last value, to simulate
|
||||
multiple header table size change.
|
||||
|
||||
.. option:: --encoder-header-table-size=<SIZE>
|
||||
|
||||
Specify encoder header table size. The decoder (server)
|
||||
specifies the maximum dynamic table size it accepts.
|
||||
Then the negotiated dynamic table size is the minimum of
|
||||
this option value and the value which server specified.
|
||||
|
||||
.. option:: -b, --padding=<N>
|
||||
|
||||
Add at most <N> bytes to a frame payload as padding.
|
||||
Specify 0 to disable padding.
|
||||
|
||||
.. option:: -r, --har=<PATH>
|
||||
|
||||
Output HTTP transactions <PATH> in HAR format. If '-'
|
||||
is given, data is written to stdout.
|
||||
|
||||
.. option:: --color
|
||||
|
||||
Force colored log output.
|
||||
|
||||
.. option:: --continuation
|
||||
|
||||
Send large header to test CONTINUATION.
|
||||
|
||||
.. option:: --no-content-length
|
||||
|
||||
Don't send content-length header field.
|
||||
|
||||
.. option:: --hexdump
|
||||
|
||||
Display the incoming traffic in hexadecimal (Canonical
|
||||
hex+ASCII display). If SSL/TLS is used, decrypted data
|
||||
are used.
|
||||
|
||||
.. option:: --no-push
|
||||
|
||||
Disable server push.
|
||||
|
||||
.. option:: --max-concurrent-streams=<N>
|
||||
|
||||
The number of concurrent pushed streams this client
|
||||
accepts.
|
||||
|
||||
.. option:: --expect-continue
|
||||
|
||||
Perform an Expect/Continue handshake: wait to send DATA
|
||||
(up to a short timeout) until the server sends a 100
|
||||
Continue interim response. This option is ignored unless
|
||||
combined with the :option:`-d` option.
|
||||
|
||||
.. option:: -y, --no-verify-peer
|
||||
|
||||
Suppress warning on server certificate verification
|
||||
failure.
|
||||
|
||||
.. option:: --ktls
|
||||
|
||||
Enable ktls.
|
||||
|
||||
.. option:: --version
|
||||
|
||||
Display version information and exit.
|
||||
|
||||
.. option:: -h, --help
|
||||
|
||||
Display this help and exit.
|
||||
|
||||
|
||||
|
||||
The <SIZE> argument is an integer and an optional unit (e.g., 10K is
|
||||
10 * 1024). Units are K, M and G (powers of 1024).
|
||||
|
||||
The <DURATION> argument is an integer and an optional unit (e.g., 1s
|
||||
is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms
|
||||
(hours, minutes, seconds and milliseconds, respectively). If a unit
|
||||
is omitted, a second is used as unit.
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
|
||||
:manpage:`nghttpd(1)`, :manpage:`nghttpx(1)`, :manpage:`h2load(1)`
|
||||
4
doc/nghttp.h2r
Normal file
4
doc/nghttp.h2r
Normal file
@@ -0,0 +1,4 @@
|
||||
SEE ALSO
|
||||
--------
|
||||
|
||||
:manpage:`nghttpd(1)`, :manpage:`nghttpx(1)`, :manpage:`h2load(1)`
|
||||
@@ -1,4 +0,0 @@
|
||||
nghttp2.h
|
||||
=========
|
||||
|
||||
.. literalinclude:: ../lib/includes/nghttp2/nghttp2.h
|
||||
4
doc/nghttp2.h.rst.in
Normal file
4
doc/nghttp2.h.rst.in
Normal file
@@ -0,0 +1,4 @@
|
||||
nghttp2.h
|
||||
=========
|
||||
|
||||
.. literalinclude:: @top_srcdir@/lib/includes/nghttp2/nghttp2.h
|
||||
@@ -1,4 +0,0 @@
|
||||
nghttp2ver.h
|
||||
============
|
||||
|
||||
.. literalinclude:: ../lib/includes/nghttp2/nghttp2ver.h
|
||||
4
doc/nghttp2ver.h.rst.in
Normal file
4
doc/nghttp2ver.h.rst.in
Normal file
@@ -0,0 +1,4 @@
|
||||
nghttp2ver.h
|
||||
============
|
||||
|
||||
.. literalinclude:: @top_builddir@/lib/includes/nghttp2/nghttp2ver.h
|
||||
238
doc/nghttpd.1
Normal file
238
doc/nghttpd.1
Normal file
@@ -0,0 +1,238 @@
|
||||
.\" Man page generated from reStructuredText.
|
||||
.
|
||||
.
|
||||
.nr rst2man-indent-level 0
|
||||
.
|
||||
.de1 rstReportMargin
|
||||
\\$1 \\n[an-margin]
|
||||
level \\n[rst2man-indent-level]
|
||||
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
-
|
||||
\\n[rst2man-indent0]
|
||||
\\n[rst2man-indent1]
|
||||
\\n[rst2man-indent2]
|
||||
..
|
||||
.de1 INDENT
|
||||
.\" .rstReportMargin pre:
|
||||
. RS \\$1
|
||||
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
|
||||
. nr rst2man-indent-level +1
|
||||
.\" .rstReportMargin post:
|
||||
..
|
||||
.de UNINDENT
|
||||
. RE
|
||||
.\" indent \\n[an-margin]
|
||||
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.nr rst2man-indent-level -1
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "NGHTTPD" "1" "Oct 25, 2025" "1.68.0" "nghttp2"
|
||||
.SH NAME
|
||||
nghttpd \- HTTP/2 server
|
||||
.SH SYNOPSIS
|
||||
.sp
|
||||
\fBnghttpd\fP [OPTION]... <PORT> [<PRIVATE_KEY> <CERT>]
|
||||
.SH DESCRIPTION
|
||||
.sp
|
||||
HTTP/2 server
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B <PORT>
|
||||
Specify listening port number.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B <PRIVATE_KEY>
|
||||
Set path to server\(aqs private key. Required unless
|
||||
\fI\%\-\-no\-tls\fP is specified.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B <CERT>
|
||||
Set path to server\(aqs certificate. Required unless
|
||||
\fI\%\-\-no\-tls\fP is specified.
|
||||
.UNINDENT
|
||||
.SH OPTIONS
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-a, \-\-address=<ADDR>
|
||||
The address to bind to. If not specified the default IP
|
||||
address determined by getaddrinfo is used.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-D, \-\-daemon
|
||||
Run in a background. If \fI\%\-D\fP is used, the current working
|
||||
directory is changed to \(aq\fI/\fP\(aq. Therefore if this option
|
||||
is used, \fI\%\-d\fP option must be specified.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-V, \-\-verify\-client
|
||||
The server sends a client certificate request. If the
|
||||
client did not return a certificate, the handshake is
|
||||
terminated. Currently, this option just requests a
|
||||
client certificate and does not verify it.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-d, \-\-htdocs=<PATH>
|
||||
Specify document root. If this option is not specified,
|
||||
the document root is the current working directory.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-v, \-\-verbose
|
||||
Print debug information such as reception/ transmission
|
||||
of frames and name/value pairs.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-no\-tls
|
||||
Disable SSL/TLS.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-c, \-\-header\-table\-size=<SIZE>
|
||||
Specify decoder header table size.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-encoder\-header\-table\-size=<SIZE>
|
||||
Specify encoder header table size. The decoder (client)
|
||||
specifies the maximum dynamic table size it accepts.
|
||||
Then the negotiated dynamic table size is the minimum of
|
||||
this option value and the value which client specified.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-color
|
||||
Force colored log output.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-p, \-\-push=<PATH>=<PUSH_PATH,...>
|
||||
Push resources <PUSH_PATH>s when <PATH> is requested.
|
||||
This option can be used repeatedly to specify multiple
|
||||
push configurations. <PATH> and <PUSH_PATH>s are
|
||||
relative to document root. See \fI\%\-\-htdocs\fP option.
|
||||
Example: \fI\%\-p\fP/=/foo.png \fI\%\-p\fP/doc=/bar.css
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-b, \-\-padding=<N>
|
||||
Add at most <N> bytes to a frame payload as padding.
|
||||
Specify 0 to disable padding.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-m, \-\-max\-concurrent\-streams=<N>
|
||||
Set the maximum number of the concurrent streams in one
|
||||
HTTP/2 session.
|
||||
.sp
|
||||
Default: \fB100\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-n, \-\-workers=<N>
|
||||
Set the number of worker threads.
|
||||
.sp
|
||||
Default: \fB1\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-e, \-\-error\-gzip
|
||||
Make error response gzipped.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-w, \-\-window\-bits=<N>
|
||||
Sets the stream level initial window size to 2**<N>\-1.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-W, \-\-connection\-window\-bits=<N>
|
||||
Sets the connection level initial window size to
|
||||
2**<N>\-1.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-dh\-param\-file=<PATH>
|
||||
Path to file that contains DH parameters in PEM format.
|
||||
Without this option, DHE cipher suites are not
|
||||
available.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-early\-response
|
||||
Start sending response when request HEADERS is received,
|
||||
rather than complete request is received.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-trailer=<HEADER>
|
||||
Add a trailer header to a response. <HEADER> must not
|
||||
include pseudo header field (header field name starting
|
||||
with \(aq:\(aq). The trailer is sent only if a response has
|
||||
body part. Example: \fI\%\-\-trailer\fP \(aqfoo: bar\(aq.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-hexdump
|
||||
Display the incoming traffic in hexadecimal (Canonical
|
||||
hex+ASCII display). If SSL/TLS is used, decrypted data
|
||||
are used.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-echo\-upload
|
||||
Send back uploaded content if method is POST or PUT.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-mime\-types\-file=<PATH>
|
||||
Path to file that contains MIME media types and the
|
||||
extensions that represent them.
|
||||
.sp
|
||||
Default: \fB/etc/mime.types\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-no\-content\-length
|
||||
Don\(aqt send content\-length header field.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-groups=<GROUPS>
|
||||
Specify the supported groups.
|
||||
.sp
|
||||
Default: \fBX25519:P\-256:P\-384:P\-521\fP
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-ktls
|
||||
Enable ktls.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-version
|
||||
Display version information and exit.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-h, \-\-help
|
||||
Display this help and exit.
|
||||
.UNINDENT
|
||||
.sp
|
||||
The <SIZE> argument is an integer and an optional unit (e.g., 10K is
|
||||
10 * 1024). Units are K, M and G (powers of 1024).
|
||||
.SH SEE ALSO
|
||||
.sp
|
||||
\fBnghttp(1)\fP, \fBnghttpx(1)\fP, \fBh2load(1)\fP
|
||||
.SH AUTHOR
|
||||
Tatsuhiro Tsujikawa
|
||||
.SH COPYRIGHT
|
||||
2012, 2015, 2016, Tatsuhiro Tsujikawa
|
||||
.\" Generated by docutils manpage writer.
|
||||
.
|
||||
188
doc/nghttpd.1.rst
Normal file
188
doc/nghttpd.1.rst
Normal file
@@ -0,0 +1,188 @@
|
||||
|
||||
.. GENERATED by help2rst.py. DO NOT EDIT DIRECTLY.
|
||||
|
||||
.. program:: nghttpd
|
||||
|
||||
nghttpd(1)
|
||||
==========
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
|
||||
**nghttpd** [OPTION]... <PORT> [<PRIVATE_KEY> <CERT>]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
||||
HTTP/2 server
|
||||
|
||||
.. describe:: <PORT>
|
||||
|
||||
Specify listening port number.
|
||||
|
||||
.. describe:: <PRIVATE_KEY>
|
||||
|
||||
|
||||
Set path to server's private key. Required unless
|
||||
:option:`--no-tls` is specified.
|
||||
|
||||
.. describe:: <CERT>
|
||||
|
||||
Set path to server's certificate. Required unless
|
||||
:option:`--no-tls` is specified.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
|
||||
.. option:: -a, --address=<ADDR>
|
||||
|
||||
The address to bind to. If not specified the default IP
|
||||
address determined by getaddrinfo is used.
|
||||
|
||||
.. option:: -D, --daemon
|
||||
|
||||
Run in a background. If :option:`-D` is used, the current working
|
||||
directory is changed to '*/*'. Therefore if this option
|
||||
is used, :option:`-d` option must be specified.
|
||||
|
||||
.. option:: -V, --verify-client
|
||||
|
||||
The server sends a client certificate request. If the
|
||||
client did not return a certificate, the handshake is
|
||||
terminated. Currently, this option just requests a
|
||||
client certificate and does not verify it.
|
||||
|
||||
.. option:: -d, --htdocs=<PATH>
|
||||
|
||||
Specify document root. If this option is not specified,
|
||||
the document root is the current working directory.
|
||||
|
||||
.. option:: -v, --verbose
|
||||
|
||||
Print debug information such as reception/ transmission
|
||||
of frames and name/value pairs.
|
||||
|
||||
.. option:: --no-tls
|
||||
|
||||
Disable SSL/TLS.
|
||||
|
||||
.. option:: -c, --header-table-size=<SIZE>
|
||||
|
||||
Specify decoder header table size.
|
||||
|
||||
.. option:: --encoder-header-table-size=<SIZE>
|
||||
|
||||
Specify encoder header table size. The decoder (client)
|
||||
specifies the maximum dynamic table size it accepts.
|
||||
Then the negotiated dynamic table size is the minimum of
|
||||
this option value and the value which client specified.
|
||||
|
||||
.. option:: --color
|
||||
|
||||
Force colored log output.
|
||||
|
||||
.. option:: -p, --push=<PATH>=<PUSH_PATH,...>
|
||||
|
||||
Push resources <PUSH_PATH>s when <PATH> is requested.
|
||||
This option can be used repeatedly to specify multiple
|
||||
push configurations. <PATH> and <PUSH_PATH>s are
|
||||
relative to document root. See :option:`--htdocs` option.
|
||||
Example: :option:`-p`\/=/foo.png :option:`-p`\/doc=/bar.css
|
||||
|
||||
.. option:: -b, --padding=<N>
|
||||
|
||||
Add at most <N> bytes to a frame payload as padding.
|
||||
Specify 0 to disable padding.
|
||||
|
||||
.. option:: -m, --max-concurrent-streams=<N>
|
||||
|
||||
Set the maximum number of the concurrent streams in one
|
||||
HTTP/2 session.
|
||||
|
||||
Default: ``100``
|
||||
|
||||
.. option:: -n, --workers=<N>
|
||||
|
||||
Set the number of worker threads.
|
||||
|
||||
Default: ``1``
|
||||
|
||||
.. option:: -e, --error-gzip
|
||||
|
||||
Make error response gzipped.
|
||||
|
||||
.. option:: -w, --window-bits=<N>
|
||||
|
||||
Sets the stream level initial window size to 2\*\*<N>-1.
|
||||
|
||||
.. option:: -W, --connection-window-bits=<N>
|
||||
|
||||
Sets the connection level initial window size to
|
||||
2\*\*<N>-1.
|
||||
|
||||
.. option:: --dh-param-file=<PATH>
|
||||
|
||||
Path to file that contains DH parameters in PEM format.
|
||||
Without this option, DHE cipher suites are not
|
||||
available.
|
||||
|
||||
.. option:: --early-response
|
||||
|
||||
Start sending response when request HEADERS is received,
|
||||
rather than complete request is received.
|
||||
|
||||
.. option:: --trailer=<HEADER>
|
||||
|
||||
Add a trailer header to a response. <HEADER> must not
|
||||
include pseudo header field (header field name starting
|
||||
with ':'). The trailer is sent only if a response has
|
||||
body part. Example: :option:`--trailer` 'foo: bar'.
|
||||
|
||||
.. option:: --hexdump
|
||||
|
||||
Display the incoming traffic in hexadecimal (Canonical
|
||||
hex+ASCII display). If SSL/TLS is used, decrypted data
|
||||
are used.
|
||||
|
||||
.. option:: --echo-upload
|
||||
|
||||
Send back uploaded content if method is POST or PUT.
|
||||
|
||||
.. option:: --mime-types-file=<PATH>
|
||||
|
||||
Path to file that contains MIME media types and the
|
||||
extensions that represent them.
|
||||
|
||||
Default: ``/etc/mime.types``
|
||||
|
||||
.. option:: --no-content-length
|
||||
|
||||
Don't send content-length header field.
|
||||
|
||||
.. option:: --groups=<GROUPS>
|
||||
|
||||
Specify the supported groups.
|
||||
|
||||
Default: ``X25519:P-256:P-384:P-521``
|
||||
|
||||
.. option:: --ktls
|
||||
|
||||
Enable ktls.
|
||||
|
||||
.. option:: --version
|
||||
|
||||
Display version information and exit.
|
||||
|
||||
.. option:: -h, --help
|
||||
|
||||
Display this help and exit.
|
||||
|
||||
|
||||
|
||||
The <SIZE> argument is an integer and an optional unit (e.g., 10K is
|
||||
10 * 1024). Units are K, M and G (powers of 1024).
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
|
||||
:manpage:`nghttp(1)`, :manpage:`nghttpx(1)`, :manpage:`h2load(1)`
|
||||
4
doc/nghttpd.h2r
Normal file
4
doc/nghttpd.h2r
Normal file
@@ -0,0 +1,4 @@
|
||||
SEE ALSO
|
||||
--------
|
||||
|
||||
:manpage:`nghttp(1)`, :manpage:`nghttpx(1)`, :manpage:`h2load(1)`
|
||||
1
doc/nghttpx-howto.rst.in
Normal file
1
doc/nghttpx-howto.rst.in
Normal file
@@ -0,0 +1 @@
|
||||
.. include:: @top_srcdir@/doc/sources/nghttpx-howto.rst
|
||||
2652
doc/nghttpx.1
Normal file
2652
doc/nghttpx.1
Normal file
File diff suppressed because it is too large
Load Diff
2427
doc/nghttpx.1.rst
Normal file
2427
doc/nghttpx.1.rst
Normal file
File diff suppressed because it is too large
Load Diff
678
doc/nghttpx.h2r
Normal file
678
doc/nghttpx.h2r
Normal file
@@ -0,0 +1,678 @@
|
||||
FILES
|
||||
-----
|
||||
|
||||
*/etc/nghttpx/nghttpx.conf*
|
||||
The default configuration file path nghttpx searches at startup.
|
||||
The configuration file path can be changed using :option:`--conf`
|
||||
option.
|
||||
|
||||
Those lines which are staring ``#`` are treated as comment.
|
||||
|
||||
The option name in the configuration file is the long command-line
|
||||
option name with leading ``--`` stripped (e.g., ``frontend``). Put
|
||||
``=`` between option name and value. Don't put extra leading or
|
||||
trailing spaces.
|
||||
|
||||
When specifying arguments including characters which have special
|
||||
meaning to a shell, we usually use quotes so that shell does not
|
||||
interpret them. When writing this configuration file, quotes for
|
||||
this purpose must not be used. For example, specify additional
|
||||
request header field, do this:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
add-request-header=foo: bar
|
||||
|
||||
instead of:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
add-request-header="foo: bar"
|
||||
|
||||
The options which do not take argument in the command-line *take*
|
||||
argument in the configuration file. Specify ``yes`` as an argument
|
||||
(e.g., ``http2-proxy=yes``). If other string is given, it is
|
||||
ignored.
|
||||
|
||||
To specify private key and certificate file which are given as
|
||||
positional arguments in command-line, use ``private-key-file`` and
|
||||
``certificate-file``.
|
||||
|
||||
:option:`--conf` option cannot be used in the configuration file and
|
||||
will be ignored if specified.
|
||||
|
||||
Error log
|
||||
Error log is written to stderr by default. It can be configured
|
||||
using :option:`--errorlog-file`. The format of log message is as
|
||||
follows:
|
||||
|
||||
<datetime> <main-pid> <current-pid> <thread-id> <level> (<filename>:<line>) <msg>
|
||||
|
||||
<datetime>
|
||||
It is a combination of date and time when the log is written. It
|
||||
is in ISO 8601 format.
|
||||
|
||||
<main-pid>
|
||||
It is a main process ID.
|
||||
|
||||
<current-pid>
|
||||
It is a process ID which writes this log.
|
||||
|
||||
<thread-id>
|
||||
It is a thread ID which writes this log. It would be unique
|
||||
within <current-pid>.
|
||||
|
||||
<filename> and <line>
|
||||
They are source file name, and line number which produce this log.
|
||||
|
||||
<msg>
|
||||
It is a log message body.
|
||||
|
||||
SIGNALS
|
||||
-------
|
||||
|
||||
SIGQUIT
|
||||
Shutdown gracefully. First accept pending connections and stop
|
||||
accepting connection. After all connections are handled, nghttpx
|
||||
exits.
|
||||
|
||||
SIGHUP
|
||||
Reload configuration file given in :option:`--conf`.
|
||||
|
||||
SIGUSR1
|
||||
Reopen log files.
|
||||
|
||||
SIGUSR2
|
||||
|
||||
Fork and execute nghttpx. It will execute the binary in the same
|
||||
path with same command-line arguments and environment variables. As
|
||||
of nghttpx version 1.20.0, the new main process sends SIGQUIT to the
|
||||
original main process when it is ready to serve requests. For the
|
||||
earlier versions of nghttpx, user has to send SIGQUIT to the
|
||||
original main process.
|
||||
|
||||
The difference between SIGUSR2 (+ SIGQUIT) and SIGHUP is that former
|
||||
is usually used to execute new binary, and the main process is newly
|
||||
spawned. On the other hand, the latter just reloads configuration
|
||||
file, and the same main process continues to exist.
|
||||
|
||||
.. note::
|
||||
|
||||
nghttpx consists of multiple processes: one process for processing
|
||||
these signals, and another one for processing requests. The former
|
||||
spawns the latter. The former is called main process, and the
|
||||
latter is called worker process. If neverbleed is enabled, the
|
||||
worker process spawns neverbleed daemon process which does RSA key
|
||||
processing. The above signal must be sent to the main process. If
|
||||
the other processes received one of them, it is ignored. This
|
||||
behaviour of these processes may change in the future release. In
|
||||
other words, in the future release, the processes other than main
|
||||
process may terminate upon the reception of these signals.
|
||||
Therefore these signals should not be sent to the processes other
|
||||
than main process.
|
||||
|
||||
SERVER PUSH
|
||||
-----------
|
||||
|
||||
nghttpx supports HTTP/2 server push in default mode with Link header
|
||||
field. nghttpx looks for Link header field (`RFC 5988
|
||||
<http://tools.ietf.org/html/rfc5988>`_) in response headers from
|
||||
backend server and extracts URI-reference with parameter
|
||||
``rel=preload`` (see `preload
|
||||
<http://w3c.github.io/preload/#interoperability-with-http-link-header>`_)
|
||||
and pushes those URIs to the frontend client. Here is a sample Link
|
||||
header field to initiate server push:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
Link: </fonts/font.woff>; rel=preload
|
||||
Link: </css/theme.css>; rel=preload
|
||||
|
||||
Currently, the following restriction is applied for server push:
|
||||
|
||||
1. The associated stream must have method "GET" or "POST". The
|
||||
associated stream's status code must be 200.
|
||||
|
||||
This limitation may be loosened in the future release.
|
||||
|
||||
nghttpx also supports server push if both frontend and backend are
|
||||
HTTP/2 in default mode. In this case, in addition to server push via
|
||||
Link header field, server push from backend is forwarded to frontend
|
||||
HTTP/2 session.
|
||||
|
||||
HTTP/2 server push will be disabled if :option:`--http2-proxy` is
|
||||
used.
|
||||
|
||||
UNIX DOMAIN SOCKET
|
||||
------------------
|
||||
|
||||
nghttpx supports UNIX domain socket with a filename for both frontend
|
||||
and backend connections.
|
||||
|
||||
Please note that current nghttpx implementation does not delete a
|
||||
socket with a filename. And on start up, if nghttpx detects that the
|
||||
specified socket already exists in the file system, nghttpx first
|
||||
deletes it. However, if SIGUSR2 is used to execute new binary and
|
||||
both old and new configurations use same filename, new binary does not
|
||||
delete the socket and continues to use it.
|
||||
|
||||
TLS SESSION RESUMPTION
|
||||
----------------------
|
||||
|
||||
nghttpx supports TLS session resumption through both session ID and
|
||||
session ticket.
|
||||
|
||||
SESSION ID RESUMPTION
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
By default, session ID is shared by all worker threads.
|
||||
|
||||
TLS SESSION TICKET RESUMPTION
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
By default, session ticket is shared by all worker threads. The
|
||||
automatic key rotation is also enabled by default. Every an hour, new
|
||||
encryption key is generated, and previous encryption key becomes
|
||||
decryption only key. We set session timeout to 12 hours, and thus we
|
||||
keep at most 12 keys.
|
||||
|
||||
If :option:`--tls-ticket-key-memcached` is given, encryption keys are
|
||||
retrieved from memcached. nghttpx just reads keys from memcached; one
|
||||
has to deploy key generator program to update keys frequently (e.g.,
|
||||
every 1 hour). The example key generator tlsticketupdate.go is
|
||||
available under contrib directory in nghttp2 archive. The memcached
|
||||
entry key is ``nghttpx:tls-ticket-key``. The data format stored in
|
||||
memcached is the binary format described below:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
+--------------+-------+----------------+
|
||||
| VERSION (4) |LEN (2)|KEY(48 or 80) ...
|
||||
+--------------+-------+----------------+
|
||||
^ |
|
||||
| |
|
||||
+------------------------+
|
||||
(LEN, KEY) pair can be repeated
|
||||
|
||||
All numbers in the above figure is bytes. All integer fields are
|
||||
network byte order.
|
||||
|
||||
First 4 bytes integer VERSION field, which must be 1. The 2 bytes
|
||||
integer LEN field gives the length of following KEY field, which
|
||||
contains key. If :option:`--tls-ticket-key-cipher`\=aes-128-cbc is
|
||||
used, LEN must be 48. If
|
||||
:option:`--tls-ticket-key-cipher`\=aes-256-cbc is used, LEN must be
|
||||
80. LEN and KEY pair can be repeated multiple times to store multiple
|
||||
keys. The key appeared first is used as encryption key. All the
|
||||
remaining keys are used as decryption only.
|
||||
|
||||
By default, connections to memcached server are not encrypted. To
|
||||
enable encryption, use ``tls`` keyword in
|
||||
:option:`--tls-ticket-key-memcached` option.
|
||||
|
||||
If :option:`--tls-ticket-key-file` is given, encryption key is read
|
||||
from the given file. In this case, nghttpx does not rotate key
|
||||
automatically. To rotate key, one has to restart nghttpx (see
|
||||
SIGNALS).
|
||||
|
||||
CERTIFICATE TRANSPARENCY
|
||||
------------------------
|
||||
|
||||
nghttpx supports TLS ``signed_certificate_timestamp`` extension (`RFC
|
||||
6962 <https://tools.ietf.org/html/rfc6962>`_). The relevant options
|
||||
are :option:`--tls-sct-dir` and ``sct-dir`` parameter in
|
||||
:option:`--subcert`. They takes a directory, and nghttpx reads all
|
||||
files whose extension is ``.sct`` under the directory. The ``*.sct``
|
||||
files are encoded as ``SignedCertificateTimestamp`` struct described
|
||||
in `section 3.2 of RFC 69662
|
||||
<https://tools.ietf.org/html/rfc6962#section-3.2>`_. This format is
|
||||
the same one used by `nginx-ct
|
||||
<https://github.com/grahamedgecombe/nginx-ct>`_ and `mod_ssl_ct
|
||||
<https://httpd.apache.org/docs/trunk/mod/mod_ssl_ct.html>`_.
|
||||
`ct-submit <https://github.com/grahamedgecombe/ct-submit>`_ can be
|
||||
used to submit certificates to log servers, and obtain the
|
||||
``SignedCertificateTimestamp`` struct which can be used with nghttpx.
|
||||
|
||||
MRUBY SCRIPTING
|
||||
---------------
|
||||
|
||||
.. warning::
|
||||
|
||||
The current mruby extension API is experimental and not frozen. The
|
||||
API is subject to change in the future release.
|
||||
|
||||
.. warning::
|
||||
|
||||
Almost all string value returned from method, or attribute is a
|
||||
fresh new mruby string, which involves memory allocation, and
|
||||
copies. Therefore, it is strongly recommended to store a return
|
||||
value in a local variable, and use it, instead of calling method or
|
||||
accessing attribute repeatedly.
|
||||
|
||||
nghttpx allows users to extend its capability using mruby scripts.
|
||||
nghttpx has 2 hook points to execute mruby script: request phase and
|
||||
response phase. The request phase hook is invoked after all request
|
||||
header fields are received from client. The response phase hook is
|
||||
invoked after all response header fields are received from backend
|
||||
server. These hooks allows users to modify header fields, or common
|
||||
HTTP variables, like authority or request path, and even return custom
|
||||
response without forwarding request to backend servers.
|
||||
|
||||
There are 2 levels of mruby script invocations: global and
|
||||
per-pattern. The global mruby script is set by :option:`--mruby-file`
|
||||
option and is called for all requests. The per-pattern mruby script
|
||||
is set by "mruby" parameter in :option:`-b` option. It is invoked for
|
||||
a request which matches the particular pattern. The order of hook
|
||||
invocation is: global request phase hook, per-pattern request phase
|
||||
hook, per-pattern response phase hook, and finally global response
|
||||
phase hook. If a hook returns a response, any later hooks are not
|
||||
invoked. The global request hook is invoked before the pattern
|
||||
matching is made and changing request path may affect the pattern
|
||||
matching.
|
||||
|
||||
Please note that request and response hooks of per-pattern mruby
|
||||
script for a single request might not come from the same script. This
|
||||
might happen after a request hook is executed, backend failed for some
|
||||
reason, and at the same time, backend configuration is replaced by API
|
||||
request, and then the request uses new configuration on retry. The
|
||||
response hook from new configuration, if it is specified, will be
|
||||
invoked.
|
||||
|
||||
The all mruby script will be evaluated once per thread on startup, and
|
||||
it must instantiate object and evaluate it as the return value (e.g.,
|
||||
``App.new``). This object is called app object. If app object
|
||||
defines ``on_req`` method, it is called with :rb:class:`Nghttpx::Env`
|
||||
object on request hook. Similarly, if app object defines ``on_resp``
|
||||
method, it is called with :rb:class:`Nghttpx::Env` object on response
|
||||
hook. For each method invocation, user can can access
|
||||
:rb:class:`Nghttpx::Request` and :rb:class:`Nghttpx::Response` objects
|
||||
via :rb:attr:`Nghttpx::Env#req` and :rb:attr:`Nghttpx::Env#resp`
|
||||
respectively.
|
||||
|
||||
.. rb:module:: Nghttpx
|
||||
|
||||
.. rb:const:: REQUEST_PHASE
|
||||
|
||||
Constant to represent request phase.
|
||||
|
||||
.. rb:const:: RESPONSE_PHASE
|
||||
|
||||
Constant to represent response phase.
|
||||
|
||||
.. rb:class:: Env
|
||||
|
||||
Object to represent current request specific context.
|
||||
|
||||
.. rb:attr_reader:: req
|
||||
|
||||
Return :rb:class:`Request` object.
|
||||
|
||||
.. rb:attr_reader:: resp
|
||||
|
||||
Return :rb:class:`Response` object.
|
||||
|
||||
.. rb:attr_reader:: ctx
|
||||
|
||||
Return Ruby hash object. It persists until request finishes.
|
||||
So values set in request phase hook can be retrieved in
|
||||
response phase hook.
|
||||
|
||||
.. rb:attr_reader:: phase
|
||||
|
||||
Return the current phase.
|
||||
|
||||
.. rb:attr_reader:: remote_addr
|
||||
|
||||
Return IP address of a remote client. If connection is made
|
||||
via UNIX domain socket, this returns the string "localhost".
|
||||
|
||||
.. rb:attr_reader:: server_addr
|
||||
|
||||
Return address of server that accepted the connection. This
|
||||
is a string which specified in :option:`--frontend` option,
|
||||
excluding port number, and not a resolved IP address. For
|
||||
UNIX domain socket, this is a path to UNIX domain socket.
|
||||
|
||||
.. rb:attr_reader:: server_port
|
||||
|
||||
Return port number of the server frontend which accepted the
|
||||
connection from client.
|
||||
|
||||
.. rb:attr_reader:: tls_used
|
||||
|
||||
Return true if TLS is used on the connection.
|
||||
|
||||
.. rb:attr_reader:: tls_sni
|
||||
|
||||
Return the TLS SNI value which client sent in this connection.
|
||||
|
||||
.. rb:attr_reader:: tls_client_fingerprint_sha256
|
||||
|
||||
Return the SHA-256 fingerprint of a client certificate.
|
||||
|
||||
.. rb:attr_reader:: tls_client_fingerprint_sha1
|
||||
|
||||
Return the SHA-1 fingerprint of a client certificate.
|
||||
|
||||
.. rb:attr_reader:: tls_client_issuer_name
|
||||
|
||||
Return the issuer name of a client certificate.
|
||||
|
||||
.. rb:attr_reader:: tls_client_subject_name
|
||||
|
||||
Return the subject name of a client certificate.
|
||||
|
||||
.. rb:attr_reader:: tls_client_serial
|
||||
|
||||
Return the serial number of a client certificate.
|
||||
|
||||
.. rb:attr_reader:: tls_client_not_before
|
||||
|
||||
Return the start date of a client certificate in seconds since
|
||||
the epoch.
|
||||
|
||||
.. rb:attr_reader:: tls_client_not_after
|
||||
|
||||
Return the end date of a client certificate in seconds since
|
||||
the epoch.
|
||||
|
||||
.. rb:attr_reader:: tls_cipher
|
||||
|
||||
Return a TLS cipher negotiated in this connection.
|
||||
|
||||
.. rb:attr_reader:: tls_protocol
|
||||
|
||||
Return a TLS protocol version negotiated in this connection.
|
||||
|
||||
.. rb:attr_reader:: tls_session_id
|
||||
|
||||
Return a session ID for this connection in hex string.
|
||||
|
||||
.. rb:attr_reader:: tls_session_reused
|
||||
|
||||
Return true if, and only if a SSL/TLS session is reused.
|
||||
|
||||
.. rb:attr_reader:: alpn
|
||||
|
||||
Return ALPN identifier negotiated in this connection.
|
||||
|
||||
.. rb:attr_reader:: tls_handshake_finished
|
||||
|
||||
Return true if SSL/TLS handshake has finished. If it returns
|
||||
false in the request phase hook, the request is received in
|
||||
TLSv1.3 early data (0-RTT) and might be vulnerable to the
|
||||
replay attack. nghttpx will send Early-Data header field to
|
||||
backend servers to indicate this.
|
||||
|
||||
.. rb:class:: Request
|
||||
|
||||
Object to represent request from client. The modification to
|
||||
Request object is allowed only in request phase hook.
|
||||
|
||||
.. rb:attr_reader:: http_version_major
|
||||
|
||||
Return HTTP major version.
|
||||
|
||||
.. rb:attr_reader:: http_version_minor
|
||||
|
||||
Return HTTP minor version.
|
||||
|
||||
.. rb:attr_accessor:: method
|
||||
|
||||
HTTP method. On assignment, copy of given value is assigned.
|
||||
We don't accept arbitrary method name. We will document them
|
||||
later, but well known methods, like GET, PUT and POST, are all
|
||||
supported.
|
||||
|
||||
.. rb:attr_accessor:: authority
|
||||
|
||||
Authority (i.e., example.org), including optional port
|
||||
component . On assignment, copy of given value is assigned.
|
||||
|
||||
.. rb:attr_accessor:: scheme
|
||||
|
||||
Scheme (i.e., http, https). On assignment, copy of given
|
||||
value is assigned.
|
||||
|
||||
.. rb:attr_accessor:: path
|
||||
|
||||
Request path, including query component (i.e., /index.html).
|
||||
On assignment, copy of given value is assigned. The path does
|
||||
not include authority component of URI. This may include
|
||||
query component. nghttpx makes certain normalization for
|
||||
path. It decodes percent-encoding for unreserved characters
|
||||
(see https://tools.ietf.org/html/rfc3986#section-2.3), and
|
||||
resolves ".." and ".". But it may leave characters which
|
||||
should be percent-encoded as is. So be careful when comparing
|
||||
path against desired string.
|
||||
|
||||
.. rb:attr_reader:: headers
|
||||
|
||||
Return Ruby hash containing copy of request header fields.
|
||||
Changing values in returned hash does not change request
|
||||
header fields actually used in request processing. Use
|
||||
:rb:meth:`Nghttpx::Request#add_header` or
|
||||
:rb:meth:`Nghttpx::Request#set_header` to change request
|
||||
header fields.
|
||||
|
||||
.. rb:method:: add_header(key, value)
|
||||
|
||||
Add header entry associated with key. The value can be single
|
||||
string or array of string. It does not replace any existing
|
||||
values associated with key.
|
||||
|
||||
.. rb:method:: set_header(key, value)
|
||||
|
||||
Set header entry associated with key. The value can be single
|
||||
string or array of string. It replaces any existing values
|
||||
associated with key.
|
||||
|
||||
.. rb:method:: clear_headers
|
||||
|
||||
Clear all existing request header fields.
|
||||
|
||||
.. rb:method:: push(uri)
|
||||
|
||||
Initiate to push resource identified by *uri*. Only HTTP/2
|
||||
protocol supports this feature. For the other protocols, this
|
||||
method is noop. *uri* can be absolute URI, absolute path or
|
||||
relative path to the current request. For absolute or
|
||||
relative path, scheme and authority are inherited from the
|
||||
current request. Currently, method is always GET. nghttpx
|
||||
will issue request to backend servers to fulfill this request.
|
||||
The request and response phase hooks will be called for pushed
|
||||
resource as well.
|
||||
|
||||
.. rb:class:: Response
|
||||
|
||||
Object to represent response from backend server.
|
||||
|
||||
.. rb:attr_reader:: http_version_major
|
||||
|
||||
Return HTTP major version.
|
||||
|
||||
.. rb:attr_reader:: http_version_minor
|
||||
|
||||
Return HTTP minor version.
|
||||
|
||||
.. rb:attr_accessor:: status
|
||||
|
||||
HTTP status code. It must be in the range [200, 999],
|
||||
inclusive. The non-final status code is not supported in
|
||||
mruby scripting at the moment.
|
||||
|
||||
.. rb:attr_reader:: headers
|
||||
|
||||
Return Ruby hash containing copy of response header fields.
|
||||
Changing values in returned hash does not change response
|
||||
header fields actually used in response processing. Use
|
||||
:rb:meth:`Nghttpx::Response#add_header` or
|
||||
:rb:meth:`Nghttpx::Response#set_header` to change response
|
||||
header fields.
|
||||
|
||||
.. rb:method:: add_header(key, value)
|
||||
|
||||
Add header entry associated with key. The value can be single
|
||||
string or array of string. It does not replace any existing
|
||||
values associated with key.
|
||||
|
||||
.. rb:method:: set_header(key, value)
|
||||
|
||||
Set header entry associated with key. The value can be single
|
||||
string or array of string. It replaces any existing values
|
||||
associated with key.
|
||||
|
||||
.. rb:method:: clear_headers
|
||||
|
||||
Clear all existing response header fields.
|
||||
|
||||
.. rb:method:: return(body)
|
||||
|
||||
Return custom response *body* to a client. When this method
|
||||
is called in request phase hook, the request is not forwarded
|
||||
to the backend, and response phase hook for this request will
|
||||
not be invoked. When this method is called in response phase
|
||||
hook, response from backend server is canceled and discarded.
|
||||
The status code and response header fields should be set
|
||||
before using this method. To set status code, use
|
||||
:rb:attr:`Nghttpx::Response#status`. If status code is not
|
||||
set, 200 is used. To set response header fields,
|
||||
:rb:meth:`Nghttpx::Response#add_header` and
|
||||
:rb:meth:`Nghttpx::Response#set_header`. When this method is
|
||||
invoked in response phase hook, the response headers are
|
||||
filled with the ones received from backend server. To send
|
||||
completely custom header fields, first call
|
||||
:rb:meth:`Nghttpx::Response#clear_headers` to erase all
|
||||
existing header fields, and then add required header fields.
|
||||
It is an error to call this method twice for a given request.
|
||||
|
||||
.. rb:method:: send_info(status, headers)
|
||||
|
||||
Send non-final (informational) response to a client. *status*
|
||||
must be in the range [100, 199], inclusive. *headers* is a
|
||||
hash containing response header fields. Its key must be a
|
||||
string, and the associated value must be either string or
|
||||
array of strings. Since this is not a final response, even if
|
||||
this method is invoked, request is still forwarded to a
|
||||
backend unless :rb:meth:`Nghttpx::Response#return` is called.
|
||||
This method can be called multiple times. It cannot be called
|
||||
after :rb:meth:`Nghttpx::Response#return` is called.
|
||||
|
||||
MRUBY EXAMPLES
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
Modify request path:
|
||||
|
||||
.. code-block:: ruby
|
||||
|
||||
class App
|
||||
def on_req(env)
|
||||
env.req.path = "/apps#{env.req.path}"
|
||||
end
|
||||
end
|
||||
|
||||
App.new
|
||||
|
||||
Don't forget to instantiate and evaluate object at the last line.
|
||||
|
||||
Restrict permission of viewing a content to a specific client
|
||||
addresses:
|
||||
|
||||
.. code-block:: ruby
|
||||
|
||||
class App
|
||||
def on_req(env)
|
||||
allowed_clients = ["127.0.0.1", "::1"]
|
||||
|
||||
if env.req.path.start_with?("/log/") &&
|
||||
!allowed_clients.include?(env.remote_addr) then
|
||||
env.resp.status = 404
|
||||
env.resp.return "permission denied"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
App.new
|
||||
|
||||
API ENDPOINTS
|
||||
-------------
|
||||
|
||||
nghttpx exposes API endpoints to manipulate it via HTTP based API. By
|
||||
default, API endpoint is disabled. To enable it, add a dedicated
|
||||
frontend for API using :option:`--frontend` option with "api"
|
||||
parameter. All requests which come from this frontend address, will
|
||||
be treated as API request.
|
||||
|
||||
The response is normally JSON dictionary, and at least includes the
|
||||
following keys:
|
||||
|
||||
status
|
||||
The status of the request processing. The following values are
|
||||
defined:
|
||||
|
||||
Success
|
||||
The request was successful.
|
||||
|
||||
Failure
|
||||
The request was failed. No change has been made.
|
||||
|
||||
code
|
||||
HTTP status code
|
||||
|
||||
Additionally, depending on the API endpoint, ``data`` key may be
|
||||
present, and its value contains the API endpoint specific data.
|
||||
|
||||
We wrote "normally", since nghttpx may return ordinal HTML response in
|
||||
some cases where the error has occurred before reaching API endpoint
|
||||
(e.g., header field is too large).
|
||||
|
||||
The following section describes available API endpoints.
|
||||
|
||||
POST /api/v1beta1/backendconfig
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This API replaces the current backend server settings with the
|
||||
requested ones. The request method should be POST, but PUT is also
|
||||
acceptable. The request body must be nghttpx configuration file
|
||||
format. For configuration file format, see `FILES`_ section. The
|
||||
line separator inside the request body must be single LF (0x0A).
|
||||
Currently, only :option:`backend <--backend>` option is parsed, the
|
||||
others are simply ignored. The semantics of this API is replace the
|
||||
current backend with the backend options in request body. Describe
|
||||
the desired set of backend severs, and nghttpx makes it happen. If
|
||||
there is no :option:`backend <--backend>` option is found in request
|
||||
body, the current set of backend is replaced with the :option:`backend
|
||||
<--backend>` option's default value, which is ``127.0.0.1,80``.
|
||||
|
||||
The replacement is done instantly without breaking existing
|
||||
connections or requests. It also avoids any process creation as is
|
||||
the case with hot swapping with signals.
|
||||
|
||||
The one limitation is that only numeric IP address is allowed in
|
||||
:option:`backend <--backend>` in request body unless "dns" parameter
|
||||
is used while non numeric hostname is allowed in command-line or
|
||||
configuration file is read using :option:`--conf`.
|
||||
|
||||
GET /api/v1beta1/configrevision
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This API returns configuration revision of the current nghttpx. The
|
||||
configuration revision is opaque string, and it changes after each
|
||||
reloading by SIGHUP. With this API, an external application knows
|
||||
that whether nghttpx has finished reloading its configuration by
|
||||
comparing the configuration revisions between before and after
|
||||
reloading. It is recommended to disable persistent (keep-alive)
|
||||
connection for this purpose in order to avoid to send a request using
|
||||
the reused connection which may bound to an old process.
|
||||
|
||||
This API returns response including ``data`` key. Its value is JSON
|
||||
object, and it contains at least the following key:
|
||||
|
||||
configRevision
|
||||
The configuration revision of the current nghttpx
|
||||
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
|
||||
:manpage:`nghttp(1)`, :manpage:`nghttpd(1)`, :manpage:`h2load(1)`
|
||||
@@ -1 +0,0 @@
|
||||
.. include:: ../README.rst
|
||||
1
doc/package_README.rst.in
Normal file
1
doc/package_README.rst.in
Normal file
@@ -0,0 +1 @@
|
||||
.. include:: @top_srcdir@/README.rst
|
||||
507
doc/programmers-guide.rst
Normal file
507
doc/programmers-guide.rst
Normal file
@@ -0,0 +1,507 @@
|
||||
Programmers' Guide
|
||||
==================
|
||||
|
||||
Architecture
|
||||
------------
|
||||
|
||||
The most notable point in nghttp2 library architecture is it does not
|
||||
perform any I/O. nghttp2 only performs HTTP/2 protocol stuff based on
|
||||
input byte strings. It will call callback functions set by
|
||||
applications while processing input. The output of nghttp2 is just
|
||||
byte string. An application is responsible to send these output to
|
||||
the remote peer. The callback functions may be called while producing
|
||||
output.
|
||||
|
||||
Not doing I/O makes embedding nghttp2 library in the existing code
|
||||
base very easy. Usually, the existing applications have its own I/O
|
||||
event loops. It is very hard to use nghttp2 in that situation if
|
||||
nghttp2 does its own I/O. It also makes light weight language wrapper
|
||||
for nghttp2 easy with the same reason. The down side is that an
|
||||
application author has to write more code to write complete
|
||||
application using nghttp2. This is especially true for simple "toy"
|
||||
application. For the real applications, however, this is not the
|
||||
case. This is because you probably want to support HTTP/1 which
|
||||
nghttp2 does not provide, and to do that, you will need to write your
|
||||
own HTTP/1 stack or use existing third-party library, and bind them
|
||||
together with nghttp2 and I/O event loop. In this point, not
|
||||
performing I/O in nghttp2 has more point than doing it.
|
||||
|
||||
The primary object that an application uses is :type:`nghttp2_session`
|
||||
object, which is opaque struct and its details are hidden in order to
|
||||
ensure the upgrading its internal architecture without breaking the
|
||||
backward compatibility. An application can set callbacks to
|
||||
:type:`nghttp2_session` object through the dedicated object and
|
||||
functions, and it also interacts with it via many API function calls.
|
||||
|
||||
An application can create as many :type:`nghttp2_session` object as it
|
||||
wants. But single :type:`nghttp2_session` object must be used by a
|
||||
single thread at the same time. This is not so hard to enforce since
|
||||
most event-based architecture applications use is single thread per
|
||||
core, and handling one connection I/O is done by single thread.
|
||||
|
||||
To feed input to :type:`nghttp2_session` object, one can use
|
||||
`nghttp2_session_recv()` or `nghttp2_session_mem_recv2()` functions.
|
||||
They behave similarly, and the difference is that
|
||||
`nghttp2_session_recv()` will use :type:`nghttp2_read_callback` to get
|
||||
input. On the other hand, `nghttp2_session_mem_recv2()` will take
|
||||
input as its parameter. If in doubt, use
|
||||
`nghttp2_session_mem_recv2()` since it is simpler, and could be faster
|
||||
since it avoids calling callback function.
|
||||
|
||||
To get output from :type:`nghttp2_session` object, one can use
|
||||
`nghttp2_session_send()` or `nghttp2_session_mem_send2()`. The
|
||||
difference between them is that the former uses
|
||||
:type:`nghttp2_send_callback` to pass output to an application. On
|
||||
the other hand, the latter returns the output to the caller. If in
|
||||
doubt, use `nghttp2_session_mem_send2()` since it is simpler. But
|
||||
`nghttp2_session_send()` might be easier to use if the output buffer
|
||||
an application has is fixed sized.
|
||||
|
||||
In general, an application should call `nghttp2_session_mem_send2()`
|
||||
when it gets input from underlying connection. Since there is great
|
||||
chance to get something pushed into transmission queue while the call
|
||||
of `nghttp2_session_mem_send2()`, it is recommended to call
|
||||
`nghttp2_session_mem_recv2()` after `nghttp2_session_mem_send2()`.
|
||||
|
||||
There is a question when we are safe to close HTTP/2 session without
|
||||
waiting for the closure of underlying connection. We offer 2 API
|
||||
calls for this: `nghttp2_session_want_read()` and
|
||||
`nghttp2_session_want_write()`. If they both return 0, application
|
||||
can destroy :type:`nghttp2_session`, and then close the underlying
|
||||
connection. But make sure that the buffered output has been
|
||||
transmitted to the peer before closing the connection when
|
||||
`nghttp2_session_mem_send2()` is used, since
|
||||
`nghttp2_session_want_write()` does not take into account the
|
||||
transmission of the buffered data outside of :type:`nghttp2_session`.
|
||||
|
||||
Includes
|
||||
--------
|
||||
|
||||
To use the public APIs, include ``nghttp2/nghttp2.h``::
|
||||
|
||||
#include <nghttp2/nghttp2.h>
|
||||
|
||||
The header files are also available online: :doc:`nghttp2.h` and
|
||||
:doc:`nghttp2ver.h`.
|
||||
|
||||
Remarks
|
||||
-------
|
||||
|
||||
Do not call `nghttp2_session_send()`, `nghttp2_session_mem_send2()`,
|
||||
`nghttp2_session_recv()` or `nghttp2_session_mem_recv2()` from the
|
||||
nghttp2 callback functions directly or indirectly. It will lead to the
|
||||
crash. You can submit requests or frames in the callbacks then call
|
||||
these functions outside the callbacks.
|
||||
|
||||
`nghttp2_session_send()` and `nghttp2_session_mem_send2()` send first
|
||||
24 bytes of client magic string (MAGIC)
|
||||
(:macro:`NGHTTP2_CLIENT_MAGIC`) on client configuration. The
|
||||
applications are responsible to send SETTINGS frame as part of
|
||||
connection preface using `nghttp2_submit_settings()`. Similarly,
|
||||
`nghttp2_session_recv()` and `nghttp2_session_mem_recv2()` consume
|
||||
MAGIC on server configuration unless
|
||||
`nghttp2_option_set_no_recv_client_magic()` is used with nonzero
|
||||
option value.
|
||||
|
||||
.. _http-messaging:
|
||||
|
||||
HTTP Messaging
|
||||
--------------
|
||||
|
||||
By default, nghttp2 library checks HTTP messaging rules described in
|
||||
`HTTP/2 specification, section 8
|
||||
<https://tools.ietf.org/html/rfc7540#section-8>`_. Everything
|
||||
described in that section is not validated however. We briefly
|
||||
describe what the library does in this area. In the following
|
||||
description, without loss of generality we omit CONTINUATION frame
|
||||
since they must follow HEADERS frame and are processed atomically. In
|
||||
other words, they are just one big HEADERS frame. To disable these
|
||||
validations, use `nghttp2_option_set_no_http_messaging()`. Please
|
||||
note that disabling this feature does not change the fundamental
|
||||
client and server model of HTTP. That is, even if the validation is
|
||||
disabled, only client can send requests.
|
||||
|
||||
For HTTP request, including those carried by PUSH_PROMISE, HTTP
|
||||
message starts with one HEADERS frame containing request headers. It
|
||||
is followed by zero or more DATA frames containing request body, which
|
||||
is followed by zero or one HEADERS containing trailer headers. The
|
||||
request headers must include ":scheme", ":method" and ":path" pseudo
|
||||
header fields unless ":method" is not "CONNECT". ":authority" is
|
||||
optional, but nghttp2 requires either ":authority" or "Host" header
|
||||
field must be present. If ":method" is "CONNECT", the request headers
|
||||
must include ":method" and ":authority" and must omit ":scheme" and
|
||||
":path".
|
||||
|
||||
For HTTP response, HTTP message starts with zero or more HEADERS
|
||||
frames containing non-final response (status code 1xx). They are
|
||||
followed by one HEADERS frame containing final response headers
|
||||
(non-1xx). It is followed by zero or more DATA frames containing
|
||||
response body, which is followed by zero or one HEADERS containing
|
||||
trailer headers. The non-final and final response headers must
|
||||
contain ":status" pseudo header field containing 3 digits only.
|
||||
|
||||
All request and response headers must include exactly one valid value
|
||||
for each pseudo header field. Additionally nghttp2 requires all
|
||||
request headers must not include more than one "Host" header field.
|
||||
|
||||
HTTP/2 prohibits connection-specific header fields. The following
|
||||
header fields must not appear: "Connection", "Keep-Alive",
|
||||
"Proxy-Connection", "Transfer-Encoding" and "Upgrade". Additionally,
|
||||
"TE" header field must not include any value other than "trailers".
|
||||
|
||||
Each header field name and value must obey the field-name and
|
||||
field-value production rules described in `RFC 7230, section
|
||||
3.2. <https://tools.ietf.org/html/rfc7230#section-3.2>`_.
|
||||
Additionally, all field name must be lower cased. The invalid header
|
||||
fields are treated as stream error, and that stream is reset. If
|
||||
application wants to treat these headers in their own way, use
|
||||
`nghttp2_on_invalid_header_callback
|
||||
<https://nghttp2.org/documentation/types.html#c.nghttp2_on_invalid_header_callback>`_.
|
||||
|
||||
For "http" or "https" URIs, ":path" pseudo header fields must start
|
||||
with "/". The only exception is OPTIONS request, in that case, "*" is
|
||||
allowed in ":path" pseudo header field to represent system-wide
|
||||
OPTIONS request.
|
||||
|
||||
With the above validations, nghttp2 library guarantees that header
|
||||
field name passed to `nghttp2_on_header_callback()` is not empty.
|
||||
Also required pseudo headers are all present and not empty.
|
||||
|
||||
nghttp2 enforces "Content-Length" validation as well. All request or
|
||||
response headers must not contain more than one "Content-Length"
|
||||
header field. If "Content-Length" header field is present, it must be
|
||||
parsed as 64 bit signed integer. The sum of data length in the
|
||||
following DATA frames must match with the number in "Content-Length"
|
||||
header field if it is present (this does not include padding bytes).
|
||||
|
||||
RFC 7230 says that server must not send "Content-Length" in any
|
||||
response with 1xx, and 204 status code. It also says that
|
||||
"Content-Length" is not allowed in any response with 200 status code
|
||||
to a CONNECT request. nghttp2 enforces them as well.
|
||||
|
||||
Any deviation results in stream error of type PROTOCOL_ERROR. If
|
||||
error is found in PUSH_PROMISE frame, stream error is raised against
|
||||
promised stream.
|
||||
|
||||
The order of transmission of the HTTP/2 frames
|
||||
----------------------------------------------
|
||||
|
||||
This section describes the internals of libnghttp2 about the
|
||||
scheduling of transmission of HTTP/2 frames. This is pretty much
|
||||
internal stuff, so the details could change in the future versions of
|
||||
the library.
|
||||
|
||||
libnghttp2 categorizes HTTP/2 frames into 4 categories: urgent,
|
||||
regular, syn_stream, and data in the order of higher priority.
|
||||
|
||||
The urgent category includes PING and SETTINGS. They are sent with
|
||||
highest priority. The order inside the category is FIFO.
|
||||
|
||||
The regular category includes frames other than PING, SETTINGS, DATA,
|
||||
and HEADERS which does not create stream (which counts toward
|
||||
concurrent stream limit). The order inside the category is FIFO.
|
||||
|
||||
The syn_stream category includes HEADERS frame which creates stream,
|
||||
that counts toward the concurrent stream limit.
|
||||
|
||||
The data category includes DATA frame, and the scheduling among DATA
|
||||
frames are determined by HTTP/2 dependency tree.
|
||||
|
||||
If the application wants to send frames in the specific order, and the
|
||||
default transmission order does not fit, it has to schedule frames by
|
||||
itself using the callbacks (e.g.,
|
||||
:type:`nghttp2_on_frame_send_callback`).
|
||||
|
||||
RST_STREAM has special side effect when it is submitted by
|
||||
`nghttp2_submit_rst_stream()`. It cancels all pending HEADERS and
|
||||
DATA frames whose stream ID matches the one in the RST_STREAM frame.
|
||||
This may cause unexpected behaviour for the application in some cases.
|
||||
For example, suppose that application wants to send RST_STREAM after
|
||||
sending response HEADERS and DATA. Because of the reason we mentioned
|
||||
above, the following code does not work:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
nghttp2_submit_response2(...)
|
||||
nghttp2_submit_rst_stream(...)
|
||||
|
||||
RST_STREAM cancels HEADERS (and DATA), and just RST_STREAM is sent.
|
||||
The correct way is use :type:`nghttp2_on_frame_send_callback`, and
|
||||
after HEADERS and DATA frames are sent, issue
|
||||
`nghttp2_submit_rst_stream()`. FYI,
|
||||
:type:`nghttp2_on_frame_not_send_callback` tells you why frames are
|
||||
not sent.
|
||||
|
||||
Implement user defined HTTP/2 non-critical extensions
|
||||
-----------------------------------------------------
|
||||
|
||||
As of nghttp2 v1.8.0, we have added HTTP/2 non-critical extension
|
||||
framework, which lets application send and receive user defined custom
|
||||
HTTP/2 non-critical extension frames. nghttp2 also offers built-in
|
||||
functionality to send and receive official HTTP/2 extension frames
|
||||
(e.g., ALTSVC frame). For these built-in handler, refer to the next
|
||||
section.
|
||||
|
||||
To send extension frame, use `nghttp2_submit_extension()`, and
|
||||
implement :type:`nghttp2_pack_extension_callback`. The callback
|
||||
implements how to encode data into wire format. The callback must be
|
||||
set to :type:`nghttp2_session_callbacks` using
|
||||
`nghttp2_session_callbacks_set_pack_extension_callback()`.
|
||||
|
||||
For example, we will illustrate how to send `ALTSVC
|
||||
<https://tools.ietf.org/html/rfc7838>`_ frame.
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
typedef struct {
|
||||
const char *origin;
|
||||
const char *field;
|
||||
} alt_svc;
|
||||
|
||||
nghttp2_ssize pack_extension_callback(nghttp2_session *session, uint8_t *buf,
|
||||
size_t len, const nghttp2_frame *frame,
|
||||
void *user_data) {
|
||||
const alt_svc *altsvc = (const alt_svc *)frame->ext.payload;
|
||||
size_t originlen = strlen(altsvc->origin);
|
||||
size_t fieldlen = strlen(altsvc->field);
|
||||
|
||||
uint8_t *p;
|
||||
|
||||
if (len < 2 + originlen + fieldlen || originlen > 0xffff) {
|
||||
return NGHTTP2_ERR_CANCEL;
|
||||
}
|
||||
|
||||
p = buf;
|
||||
*p++ = originlen >> 8;
|
||||
*p++ = originlen & 0xff;
|
||||
memcpy(p, altsvc->origin, originlen);
|
||||
p += originlen;
|
||||
memcpy(p, altsvc->field, fieldlen);
|
||||
p += fieldlen;
|
||||
|
||||
return p - buf;
|
||||
}
|
||||
|
||||
This implements :type:`nghttp2_pack_extension_callback`. We have to
|
||||
set this callback to :type:`nghttp2_session_callbacks`:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
nghttp2_session_callbacks_set_pack_extension_callback(
|
||||
callbacks, pack_extension_callback);
|
||||
|
||||
To send ALTSVC frame, call `nghttp2_submit_extension()`:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
static const alt_svc altsvc = {"example.com", "h2=\":8000\""};
|
||||
|
||||
nghttp2_submit_extension(session, 0xa, NGHTTP2_FLAG_NONE, 0,
|
||||
(void *)&altsvc);
|
||||
|
||||
Notice that ALTSVC is use frame type ``0xa``.
|
||||
|
||||
To receive extension frames, implement 2 callbacks:
|
||||
:type:`nghttp2_unpack_extension_callback` and
|
||||
:type:`nghttp2_on_extension_chunk_recv_callback`.
|
||||
:type:`nghttp2_unpack_extension_callback` implements the way how to
|
||||
decode wire format. :type:`nghttp2_on_extension_chunk_recv_callback`
|
||||
implements how to buffer the incoming extension payload. These
|
||||
callbacks must be set using
|
||||
`nghttp2_session_callbacks_set_unpack_extension_callback()` and
|
||||
`nghttp2_session_callbacks_set_on_extension_chunk_recv_callback()`
|
||||
respectively. The application also must tell the library which
|
||||
extension frame type it is willing to receive using
|
||||
`nghttp2_option_set_user_recv_extension_type()`. Note that the
|
||||
application has to create :type:`nghttp2_option` object for that
|
||||
purpose, and initialize session with it.
|
||||
|
||||
We use ALTSVC again to illustrate how to receive extension frames. We
|
||||
use different ``alt_svc`` struct than the previous one.
|
||||
|
||||
First implement 2 callbacks. We store incoming ALTSVC payload to
|
||||
global variable ``altsvc_buffer``. Don't do this in production code
|
||||
since this is not thread safe:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
typedef struct {
|
||||
const uint8_t *origin;
|
||||
size_t originlen;
|
||||
const uint8_t *field;
|
||||
size_t fieldlen;
|
||||
} alt_svc;
|
||||
|
||||
/* buffers incoming ALTSVC payload */
|
||||
uint8_t altsvc_buffer[4096];
|
||||
/* The length of byte written to altsvc_buffer */
|
||||
size_t altsvc_bufferlen = 0;
|
||||
|
||||
int on_extension_chunk_recv_callback(nghttp2_session *session,
|
||||
const nghttp2_frame_hd *hd,
|
||||
const uint8_t *data, size_t len,
|
||||
void *user_data) {
|
||||
if (sizeof(altsvc_buffer) < altsvc_bufferlen + len) {
|
||||
altsvc_bufferlen = 0;
|
||||
return NGHTTP2_ERR_CANCEL;
|
||||
}
|
||||
|
||||
memcpy(altsvc_buffer + altsvc_bufferlen, data, len);
|
||||
altsvc_bufferlen += len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int unpack_extension_callback(nghttp2_session *session, void **payload,
|
||||
const nghttp2_frame_hd *hd, void *user_data) {
|
||||
uint8_t *origin, *field;
|
||||
size_t originlen, fieldlen;
|
||||
uint8_t *p, *end;
|
||||
alt_svc *altsvc;
|
||||
|
||||
if (altsvc_bufferlen < 2) {
|
||||
altsvc_bufferlen = 0;
|
||||
return NGHTTP2_ERR_CANCEL;
|
||||
}
|
||||
|
||||
p = altsvc_buffer;
|
||||
end = altsvc_buffer + altsvc_bufferlen;
|
||||
|
||||
originlen = ((*p) << 8) + *(p + 1);
|
||||
p += 2;
|
||||
|
||||
if (p + originlen > end) {
|
||||
altsvc_bufferlen = 0;
|
||||
return NGHTTP2_ERR_CANCEL;
|
||||
}
|
||||
|
||||
origin = p;
|
||||
field = p + originlen;
|
||||
fieldlen = end - field;
|
||||
|
||||
altsvc = (alt_svc *)malloc(sizeof(alt_svc));
|
||||
altsvc->origin = origin;
|
||||
altsvc->originlen = originlen;
|
||||
altsvc->field = field;
|
||||
altsvc->fieldlen = fieldlen;
|
||||
|
||||
*payload = altsvc;
|
||||
|
||||
altsvc_bufferlen = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Set these callbacks to :type:`nghttp2_session_callbacks`:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
nghttp2_session_callbacks_set_on_extension_chunk_recv_callback(
|
||||
callbacks, on_extension_chunk_recv_callback);
|
||||
|
||||
nghttp2_session_callbacks_set_unpack_extension_callback(
|
||||
callbacks, unpack_extension_callback);
|
||||
|
||||
|
||||
In ``unpack_extension_callback`` above, we set unpacked ``alt_svc``
|
||||
object to ``*payload``. nghttp2 library then, calls
|
||||
:type:`nghttp2_on_frame_recv_callback`, and ``*payload`` will be
|
||||
available as ``frame->ext.payload``:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
int on_frame_recv_callback(nghttp2_session *session,
|
||||
const nghttp2_frame *frame, void *user_data) {
|
||||
|
||||
switch (frame->hd.type) {
|
||||
...
|
||||
case 0xa: {
|
||||
alt_svc *altsvc = (alt_svc *)frame->ext.payload;
|
||||
fprintf(stderr, "ALTSVC frame received\n");
|
||||
fprintf(stderr, " origin: %.*s\n", (int)altsvc->originlen, altsvc->origin);
|
||||
fprintf(stderr, " field : %.*s\n", (int)altsvc->fieldlen, altsvc->field);
|
||||
free(altsvc);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Finally, application should set the extension frame types it is
|
||||
willing to receive:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
nghttp2_option_set_user_recv_extension_type(option, 0xa);
|
||||
|
||||
The :type:`nghttp2_option` must be set to :type:`nghttp2_session` on
|
||||
its creation:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
nghttp2_session_client_new2(&session, callbacks, user_data, option);
|
||||
|
||||
How to use built-in HTTP/2 extension frame handlers
|
||||
---------------------------------------------------
|
||||
|
||||
In the previous section, we talked about the user defined HTTP/2
|
||||
extension frames. In this section, we talk about HTTP/2 extension
|
||||
frame support built into nghttp2 library.
|
||||
|
||||
As of this writing, nghttp2 supports ALTSVC extension frame. To send
|
||||
ALTSVC frame, use `nghttp2_submit_altsvc()` function.
|
||||
|
||||
To receive ALTSVC frame through built-in functionality, application
|
||||
has to use `nghttp2_option_set_builtin_recv_extension_type()` to
|
||||
indicate the willingness of receiving ALTSVC frame:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
nghttp2_option_set_builtin_recv_extension_type(option, NGHTTP2_ALTSVC);
|
||||
|
||||
This is very similar to the case when we used to receive user defined
|
||||
frames.
|
||||
|
||||
If the same frame type is set using
|
||||
`nghttp2_option_set_builtin_recv_extension_type()` and
|
||||
`nghttp2_option_set_user_recv_extension_type()`, the latter takes
|
||||
precedence. Application can implement its own frame handler rather
|
||||
than using built-in handler.
|
||||
|
||||
The :type:`nghttp2_option` must be set to :type:`nghttp2_session` on
|
||||
its creation, like so:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
nghttp2_session_client_new2(&session, callbacks, user_data, option);
|
||||
|
||||
When ALTSVC is received, :type:`nghttp2_on_frame_recv_callback` will
|
||||
be called as usual.
|
||||
|
||||
Stream priorities
|
||||
-----------------
|
||||
|
||||
The stream prioritization scheme described in :rfc:`7540`, which has
|
||||
been formally deprecated by :rfc:`9113`, has been removed. An
|
||||
application is advised to send
|
||||
:enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` of
|
||||
value of 1 via `nghttp2_submit_settings()`, and migrate to
|
||||
:rfc:`9218`.
|
||||
|
||||
The sender of this settings value disables :rfc:`7540` priorities, and
|
||||
instead it enables :rfc:`9218` Extensible Prioritization Scheme. This
|
||||
new prioritization scheme has 2 methods to convey the stream
|
||||
priorities to a remote endpoint: Priority header field and
|
||||
PRIORITY_UPDATE frame. nghttp2 supports both methods. In order to
|
||||
receive and process PRIORITY_UPDATE frame, server has to call
|
||||
`nghttp2_option_set_builtin_recv_extension_type()` with
|
||||
NGHTTP2_PRIORITY_UPDATE as type argument (see the above section), and
|
||||
pass the option to `nghttp2_session_server_new2()` or
|
||||
`nghttp2_session_server_new3()` to create a server session. Client
|
||||
can send Priority header field via `nghttp2_submit_request2()`. It
|
||||
can also send PRIORITY_UPDATE frame via
|
||||
`nghttp2_submit_priority_update()`. Server processes Priority header
|
||||
field in a request header field and updates the stream priority unless
|
||||
HTTP messaging rule enforcement is disabled (see
|
||||
`nghttp2_option_set_no_http_messaging()`).
|
||||
127
doc/sources/building-android-binary.rst
Normal file
127
doc/sources/building-android-binary.rst
Normal file
@@ -0,0 +1,127 @@
|
||||
Building Android binary
|
||||
=======================
|
||||
|
||||
In this article, we briefly describe how to build Android binary using
|
||||
`Android NDK <https://developer.android.com/ndk>`_ cross-compiler on
|
||||
Debian Linux.
|
||||
|
||||
The easiest way to build android binary is use Dockerfile.android.
|
||||
See Dockerfile.android for more details. If you cannot use
|
||||
Dockerfile.android for whatever reason, continue to read the rest of
|
||||
this article.
|
||||
|
||||
We offer ``android-config`` script to make the build easier. To make
|
||||
the script work, NDK directory must be set to ``NDK`` environment
|
||||
variable. NDK directory is the directory where NDK is unpacked:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
$ unzip android-ndk-$NDK_VERSION-linux.zip
|
||||
$ cd android-ndk-$NDK_VERSION
|
||||
$ export NDK=$PWD
|
||||
|
||||
The dependent libraries, such as OpenSSL, libev, and c-ares should be
|
||||
built with the same NDK toolchain and installed under
|
||||
``$NDK/usr/local``. We recommend to build these libraries as static
|
||||
library to make the deployment easier. libxml2 support is currently
|
||||
disabled.
|
||||
|
||||
Although zlib comes with Android NDK, it seems not to be a part of
|
||||
public API, so we have to built it for our own. That also provides us
|
||||
proper .pc file as a bonus.
|
||||
|
||||
Before running ``android-config``, ``NDK`` environment variable must
|
||||
be set to point to the correct path.
|
||||
|
||||
You need to set ``NGHTTP2`` environment variable to the absolute path
|
||||
to the source directory of nghttp2.
|
||||
|
||||
To configure OpenSSL, use the following script:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
#!/bin/sh
|
||||
|
||||
. $NGHTTP2/android-env
|
||||
|
||||
export ANDROID_NDK_HOME=$NDK
|
||||
export PATH=$TOOLCHAIN/bin:$PATH
|
||||
|
||||
./Configure no-shared --prefix=$PREFIX android-arm64
|
||||
|
||||
And run the following script to build and install without
|
||||
documentation:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
#!/bin/sh
|
||||
|
||||
. $NGHTTP2/android-env
|
||||
|
||||
export PATH=$TOOLCHAIN/bin:$PATH
|
||||
|
||||
make install_sw
|
||||
|
||||
To configure libev, use the following script:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
#!/bin/sh
|
||||
|
||||
. $NGHTTP2/android-env
|
||||
|
||||
./configure \
|
||||
--host=$TARGET \
|
||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||
--prefix=$PREFIX \
|
||||
--disable-shared \
|
||||
--enable-static \
|
||||
CPPFLAGS=-I$PREFIX/include \
|
||||
LDFLAGS=-L$PREFIX/lib
|
||||
|
||||
And run ``make install`` to build and install.
|
||||
|
||||
To configure c-ares, use the following script:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
#!/bin/sh -e
|
||||
|
||||
. $NGHTTP2/android-env
|
||||
|
||||
./configure \
|
||||
--host=$TARGET \
|
||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||
--prefix=$PREFIX \
|
||||
--disable-shared
|
||||
|
||||
And run ``make install`` to build and install.
|
||||
|
||||
To configure zlib, use the following script:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
#!/bin/sh -e
|
||||
|
||||
. $NGHTTP2/android-env
|
||||
|
||||
export HOST=$TARGET
|
||||
|
||||
./configure \
|
||||
--prefix=$PREFIX \
|
||||
--libdir=$PREFIX/lib \
|
||||
--includedir=$PREFIX/include \
|
||||
--static
|
||||
|
||||
And run ``make install`` to build and install.
|
||||
|
||||
After prerequisite libraries are prepared, run ``android-config`` and
|
||||
then ``make`` to compile nghttp2 source files.
|
||||
|
||||
If all went well, application binaries, such as nghttpx, are created
|
||||
under src directory. Strip debugging information from the binary
|
||||
using the following command:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
$ $NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip src/nghttpx
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user