Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package nebula for openSUSE:Factory checked 
in at 2024-12-08 11:37:28
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/nebula (Old)
 and      /work/SRC/openSUSE:Factory/.nebula.new.21547 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "nebula"

Sun Dec  8 11:37:28 2024 rev:7 rq:1228828 version:1.9.5

Changes:
--------
--- /work/SRC/openSUSE:Factory/nebula/nebula.changes    2024-09-10 
21:15:50.640563625 +0200
+++ /work/SRC/openSUSE:Factory/.nebula.new.21547/nebula.changes 2024-12-08 
11:38:35.725273208 +0100
@@ -1,0 +2,7 @@
+Fri Dec  6 17:28:15 UTC 2024 - Richard Rahl <[email protected]>
+
+- update to 1.9.5:
+  * Backport reestablish relays from cert-v2 to release-1.9
+  * do not panic when loading a V2 CA certificate
+
+-------------------------------------------------------------------

Old:
----
  nebula-1.9.4.tar.gz

New:
----
  nebula-1.9.5.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ nebula.spec ++++++
--- /var/tmp/diff_new_pack.Drohv4/_old  2024-12-08 11:38:36.241294645 +0100
+++ /var/tmp/diff_new_pack.Drohv4/_new  2024-12-08 11:38:36.241294645 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           nebula
-Version:        1.9.4
+Version:        1.9.5
 Release:        0
 Summary:        A scalable overlay networking tool
 License:        MIT

++++++ _service ++++++
--- /var/tmp/diff_new_pack.Drohv4/_old  2024-12-08 11:38:36.269295808 +0100
+++ /var/tmp/diff_new_pack.Drohv4/_new  2024-12-08 11:38:36.273295974 +0100
@@ -3,7 +3,7 @@
   <service name="tar_scm" mode="manual">
     <param name="url">https://github.com/slackhq/nebula.git</param>
     <param name="scm">git</param>
-    <param name="revision">refs/tags/v1.9.4</param>
+    <param name="revision">refs/tags/v1.9.5</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">v(.*)</param>
     <param name="package-meta">yes</param>

++++++ nebula-1.9.4.tar.gz -> nebula-1.9.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/.git/HEAD new/nebula-1.9.5/.git/HEAD
--- old/nebula-1.9.4/.git/HEAD  2024-09-09 20:11:44.000000000 +0200
+++ new/nebula-1.9.5/.git/HEAD  2024-12-06 15:50:24.000000000 +0100
@@ -1 +1 @@
-ab81b62ea05814f3eebc0ad545aabcc8b704052b
+b55b9019a72c7320b5c6dd54d2c31ad89f1e8990
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/.git/ORIG_HEAD 
new/nebula-1.9.5/.git/ORIG_HEAD
--- old/nebula-1.9.4/.git/ORIG_HEAD     2024-09-09 20:11:44.000000000 +0200
+++ new/nebula-1.9.5/.git/ORIG_HEAD     2024-12-06 15:50:24.000000000 +0100
@@ -1 +1 @@
-ab81b62ea05814f3eebc0ad545aabcc8b704052b
+b55b9019a72c7320b5c6dd54d2c31ad89f1e8990
Binary files old/nebula-1.9.4/.git/index and new/nebula-1.9.5/.git/index differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/.git/logs/HEAD 
new/nebula-1.9.5/.git/logs/HEAD
--- old/nebula-1.9.4/.git/logs/HEAD     2024-09-09 20:11:44.000000000 +0200
+++ new/nebula-1.9.5/.git/logs/HEAD     2024-12-06 15:50:24.000000000 +0100
@@ -1,2 +1,2 @@
-0000000000000000000000000000000000000000 
16eaae306afe95ac9876e333fc1636c98cd999a4 Richard Rahl 
<[email protected]> 1725955218 +0200   clone: from 
https://github.com/slackhq/nebula.git
-16eaae306afe95ac9876e333fc1636c98cd999a4 
ab81b62ea05814f3eebc0ad545aabcc8b704052b Richard Rahl 
<[email protected]> 1725955220 +0200   checkout: moving from master to 
refs/tags/v1.9.4
+0000000000000000000000000000000000000000 
3e6c75573fd55d4bcdb6ad19f8c362d59bb1d9f0 Richard Rahl 
<[email protected]> 1733505887 +0100   clone: from 
https://github.com/slackhq/nebula.git
+3e6c75573fd55d4bcdb6ad19f8c362d59bb1d9f0 
b55b9019a72c7320b5c6dd54d2c31ad89f1e8990 Richard Rahl 
<[email protected]> 1733505890 +0100   checkout: moving from master to 
refs/tags/v1.9.5
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/.git/logs/refs/heads/master 
new/nebula-1.9.5/.git/logs/refs/heads/master
--- old/nebula-1.9.4/.git/logs/refs/heads/master        2024-09-09 
20:11:44.000000000 +0200
+++ new/nebula-1.9.5/.git/logs/refs/heads/master        2024-12-06 
15:50:24.000000000 +0100
@@ -1 +1 @@
-0000000000000000000000000000000000000000 
16eaae306afe95ac9876e333fc1636c98cd999a4 Richard Rahl 
<[email protected]> 1725955218 +0200   clone: from 
https://github.com/slackhq/nebula.git
+0000000000000000000000000000000000000000 
3e6c75573fd55d4bcdb6ad19f8c362d59bb1d9f0 Richard Rahl 
<[email protected]> 1733505887 +0100   clone: from 
https://github.com/slackhq/nebula.git
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/.git/logs/refs/remotes/origin/HEAD 
new/nebula-1.9.5/.git/logs/refs/remotes/origin/HEAD
--- old/nebula-1.9.4/.git/logs/refs/remotes/origin/HEAD 2024-09-09 
20:11:44.000000000 +0200
+++ new/nebula-1.9.5/.git/logs/refs/remotes/origin/HEAD 2024-12-06 
15:50:24.000000000 +0100
@@ -1 +1 @@
-0000000000000000000000000000000000000000 
16eaae306afe95ac9876e333fc1636c98cd999a4 Richard Rahl 
<[email protected]> 1725955218 +0200   clone: from 
https://github.com/slackhq/nebula.git
+0000000000000000000000000000000000000000 
3e6c75573fd55d4bcdb6ad19f8c362d59bb1d9f0 Richard Rahl 
<[email protected]> 1733505887 +0100   clone: from 
https://github.com/slackhq/nebula.git
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-001c55cc7124c20b9bf71b9aca2985f213726579.idx
 and 
new/nebula-1.9.5/.git/objects/pack/pack-001c55cc7124c20b9bf71b9aca2985f213726579.idx
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-001c55cc7124c20b9bf71b9aca2985f213726579.pack
 and 
new/nebula-1.9.5/.git/objects/pack/pack-001c55cc7124c20b9bf71b9aca2985f213726579.pack
 differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nebula-1.9.4/.git/objects/pack/pack-001c55cc7124c20b9bf71b9aca2985f213726579.promisor
 
new/nebula-1.9.5/.git/objects/pack/pack-001c55cc7124c20b9bf71b9aca2985f213726579.promisor
--- 
old/nebula-1.9.4/.git/objects/pack/pack-001c55cc7124c20b9bf71b9aca2985f213726579.promisor
   1970-01-01 01:00:00.000000000 +0100
+++ 
new/nebula-1.9.5/.git/objects/pack/pack-001c55cc7124c20b9bf71b9aca2985f213726579.promisor
   2024-12-06 15:50:24.000000000 +0100
@@ -0,0 +1,206 @@
+0017794f4638f1a1b4e469619a9824accac6ccea 
0017794f4638f1a1b4e469619a9824accac6ccea
+02c88777cb69d8981e5812991cc8e47a1771bba2 
02c88777cb69d8981e5812991cc8e47a1771bba2
+053640d9876d32a50ab2069e810d03e1cae906f9 
053640d9876d32a50ab2069e810d03e1cae906f9
+06a24edd2712a2113436762830702db5e80efe89 
06a24edd2712a2113436762830702db5e80efe89
+08905705c03a39ab8546eb13241a08e5188e8ec0 
08905705c03a39ab8546eb13241a08e5188e8ec0
+0b573e6b344309da856dd6b9e747f8e2ecf93e65 
0b573e6b344309da856dd6b9e747f8e2ecf93e65
+0bb2345ac0bc40f01a8a0ec0e4939503cd911990 
0bb2345ac0bc40f01a8a0ec0e4939503cd911990
+0bffc857c0951d3cb3061f30f502282bbaec5d7c 
0bffc857c0951d3cb3061f30f502282bbaec5d7c
+0ccd17909372cafab7b7ff6a1a7e568ea75e0f8b 
0ccd17909372cafab7b7ff6a1a7e568ea75e0f8b
+0e7e20d4122d33d90b4f1b03722f6f8874dd1090 
0e7e20d4122d33d90b4f1b03722f6f8874dd1090
+12460da1f85968dd6e9365afdb99ed94995e2988 
12460da1f85968dd6e9365afdb99ed94995e2988
+129744fd2513138b0d3269fcdf61bdc5a1f0bd78 
129744fd2513138b0d3269fcdf61bdc5a1f0bd78
+12bbd9700d58e162b7401bc3a747cf9ad69ef63c 
12bbd9700d58e162b7401bc3a747cf9ad69ef63c
+130f8f99f5e18129e754884c37f5822b7038ee28 
130f8f99f5e18129e754884c37f5822b7038ee28
+13e807f3bde804c4035f4f8a1fb0ba1f51ff110e 
13e807f3bde804c4035f4f8a1fb0ba1f51ff110e
+14ba2ce145c06795b4387de56029e160697140b2 
14ba2ce145c06795b4387de56029e160697140b2
+165e40951310d174a7aa46d634af5f83d3ed8cc9 
165e40951310d174a7aa46d634af5f83d3ed8cc9
+16e6a680fefc2fc02952634fce616297c1725157 
16e6a680fefc2fc02952634fce616297c1725157
+16e768ee42b7416f77f5f2f603688c8e28679d17 
16e768ee42b7416f77f5f2f603688c8e28679d17
+183ac7af2c09593aabfedb7c7353607580400e11 
183ac7af2c09593aabfedb7c7353607580400e11
+18ceb4b1feb1a1c8da5c7151e8dc0edbbee05b37 
18ceb4b1feb1a1c8da5c7151e8dc0edbbee05b37
+1a3a4d48f9427b5f833805c826840b18e6be4b59 
1a3a4d48f9427b5f833805c826840b18e6be4b59
+1aea83273596bf6a26a3b065af178176dd3cf475 
1aea83273596bf6a26a3b065af178176dd3cf475
+1b777c3743a9f9aee4f0bdb020a0c49becbd3bfc 
1b777c3743a9f9aee4f0bdb020a0c49becbd3bfc
+1bb4ef5f70bdb2caec407d8778dbcab5ed070ab5 
1bb4ef5f70bdb2caec407d8778dbcab5ed070ab5
+1c1842da5532f71f64ab20a23e3ceade57046140 
1c1842da5532f71f64ab20a23e3ceade57046140
+1db60a7c41b17e09f1f24f0ed795b514f3edcab4 
1db60a7c41b17e09f1f24f0ed795b514f3edcab4
+2034405a70048b4afbf04c625828ee3819324bef 
2034405a70048b4afbf04c625828ee3819324bef
+204ff09ffa8e110fa70e05592191b4bcb4e31663 
204ff09ffa8e110fa70e05592191b4bcb4e31663
+20981f08cc90bd27b0a7155a420e9b31854d4cf0 
20981f08cc90bd27b0a7155a420e9b31854d4cf0
+24ab24f78dd3b6aa3f4a59f0052573a8c83f83a6 
24ab24f78dd3b6aa3f4a59f0052573a8c83f83a6
+2502824b117395420749fda2d512a8b749290adf 
2502824b117395420749fda2d512a8b749290adf
+2599f5f2ea0386daed0e3c45ba5a8b0c7e01e998 
2599f5f2ea0386daed0e3c45ba5a8b0c7e01e998
+26159845c42d80a93c0d2545f301a88b3ca5d45b 
26159845c42d80a93c0d2545f301a88b3ca5d45b
+261ed3642b694b55ba1cf8b6ec6a7033693548de 
261ed3642b694b55ba1cf8b6ec6a7033693548de
+29fa959915c71f1057afe21a4ed5b74d7b23402f 
29fa959915c71f1057afe21a4ed5b74d7b23402f
+2ab97dba062208bcb6ffc32bef8347d586751038 
2ab97dba062208bcb6ffc32bef8347d586751038
+2b27f52f5c259acb302f34a42d30dfa06dff71f8 
2b27f52f5c259acb302f34a42d30dfa06dff71f8
+2b5e6e937141af36ad4974569e64a68d16067818 
2b5e6e937141af36ad4974569e64a68d16067818
+2beca66c91c38c5ee8036319e29fe439c94d4195 
2beca66c91c38c5ee8036319e29fe439c94d4195
+2d84536944d28f36dba26e76008e6b383b4f0cdd 
2d84536944d28f36dba26e76008e6b383b4f0cdd
+2eee76ee261a56eac20b84dc9556f7f79fabe6c6 
2eee76ee261a56eac20b84dc9556f7f79fabe6c6
+2fab9274b8c46eb5c8415ac1c7c67ff8ff645919 
2fab9274b8c46eb5c8415ac1c7c67ff8ff645919
+30178c03451593c58a9c17d33953d67ef3910b15 
30178c03451593c58a9c17d33953d67ef3910b15
+311afc24ea9e31343f8e9be650e715f1a98e67ca 
311afc24ea9e31343f8e9be650e715f1a98e67ca
+31987db86295fc6beff233918a5031e913f4fcd4 
31987db86295fc6beff233918a5031e913f4fcd4
+32de1a0dc422823c07c82e7a01370d3970311b1d 
32de1a0dc422823c07c82e7a01370d3970311b1d
+34fe17e5902aebb08a0a2e04d7c713919ff28c35 
34fe17e5902aebb08a0a2e04d7c713919ff28c35
+36b0fc94c25000a774e77f2953ec2627f2c74705 
36b0fc94c25000a774e77f2953ec2627f2c74705
+36d043bcd53f5526b521f8c3dce5c1bb1115f02a 
36d043bcd53f5526b521f8c3dce5c1bb1115f02a
+3add83d88243dd28d0a8452727918e497ebca978 
3add83d88243dd28d0a8452727918e497ebca978
+3b69159ad93ce3fb1c56da2ad24c40b04a355949 
3b69159ad93ce3fb1c56da2ad24c40b04a355949
+3b7cdd1c9a1d4efbf1082648c0d6e712525bc7a0 
3b7cdd1c9a1d4efbf1082648c0d6e712525bc7a0
+3d883093c812cae51d9c1a689477ef282da57b00 
3d883093c812cae51d9c1a689477ef282da57b00
+400e275b469b6bf0d21ecbfc628fa55d68263571 
400e275b469b6bf0d21ecbfc628fa55d68263571
+48348939b147908eee4bd433e0456fcc3e6cf1ba 
48348939b147908eee4bd433e0456fcc3e6cf1ba
+496f84c278ad092dff6d5f6e66bc0004012b24c5 
496f84c278ad092dff6d5f6e66bc0004012b24c5
+4b1d0bd0d028528610d5f38b77a6e9937ea07a1c 
4b1d0bd0d028528610d5f38b77a6e9937ea07a1c
+4c236aeed55c552d69aef89ebf5fd9a8d5f6648a 
4c236aeed55c552d69aef89ebf5fd9a8d5f6648a
+4c6364ef5629748ecb29546213ed7d39c8d00f86 
4c6364ef5629748ecb29546213ed7d39c8d00f86
+4c9a72db482281b3ce47430600a12f0619583926 
4c9a72db482281b3ce47430600a12f0619583926
+4ddd301829ef40e49f967084e52b83a49a7600f8 
4ddd301829ef40e49f967084e52b83a49a7600f8
+5041f82ce386d917a3017497f623dcccd3c8e66e 
5041f82ce386d917a3017497f623dcccd3c8e66e
+50ad6ad5bcc1168e4b187a66796b404587b77602 
50ad6ad5bcc1168e4b187a66796b404587b77602
+50b7d62b22f780dd105d76fdf2562a3b698e3d72 
50b7d62b22f780dd105d76fdf2562a3b698e3d72
+523968c2352e3904d9f21e373d90604e297ad914 
523968c2352e3904d9f21e373d90604e297ad914
+547037c5a10a71380bc2e12a5ff4b9389e3a73d9 
547037c5a10a71380bc2e12a5ff4b9389e3a73d9
+54833bdc789754f8b3086f94764e7ac990786b11 
54833bdc789754f8b3086f94764e7ac990786b11
+55d441f4a8017b2ea30eae55137c52f2829dba5f 
55d441f4a8017b2ea30eae55137c52f2829dba5f
+57990a7943a518013e8a86e0c3d8e99c9fadc01f 
57990a7943a518013e8a86e0c3d8e99c9fadc01f
+57cd32ae544e93f5ffa982a9d1cd1bb8607f759f 
57cd32ae544e93f5ffa982a9d1cd1bb8607f759f
+5afeaeabe191d7878ca66eebf370d07572c8ae18 
5afeaeabe191d7878ca66eebf370d07572c8ae18
+5cf0a028abab5fa3606ff15513ae87cab10aac95 
5cf0a028abab5fa3606ff15513ae87cab10aac95
+5d41a8714c05e7724f236eee45b2358d574cd173 
5d41a8714c05e7724f236eee45b2358d574cd173
+62a892b00189463dbd90248b95d0877618e7f242 
62a892b00189463dbd90248b95d0877618e7f242
+62f406560ca38e7e37dc0ae2b8a8d663631c18af 
62f406560ca38e7e37dc0ae2b8a8d663631c18af
+6463ccbba5dc27e71aeb73073adb9d5b1a65b6b6 
6463ccbba5dc27e71aeb73073adb9d5b1a65b6b6
+65ea91f5105a5681011580b4bf219f50e187a21d 
65ea91f5105a5681011580b4bf219f50e187a21d
+65ef31a5656c7b49517e3d1c70a75c2a53ff0599 
65ef31a5656c7b49517e3d1c70a75c2a53ff0599
+6922cc3e89721a03010ca670d73ae8761e0b1267 
6922cc3e89721a03010ca670d73ae8761e0b1267
+69f6ae84f47316b8772977a072b24188c4a409c9 
69f6ae84f47316b8772977a072b24188c4a409c9
+6a023abf20b6ef8e38c2bc8a73447cb2183e8ddc 
6a023abf20b6ef8e38c2bc8a73447cb2183e8ddc
+6a71fe77f0d24f25d1824f4f4bd77d5a83cab1d8 
6a71fe77f0d24f25d1824f4f4bd77d5a83cab1d8
+6d04027aa7ab62201683f852fd13d8e70bd045a2 
6d04027aa7ab62201683f852fd13d8e70bd045a2
+6d5c8a433279de7637aed7ab48574b65540a8d54 
6d5c8a433279de7637aed7ab48574b65540a8d54
+6ff1cb0bdfa23d878e53bfb465f0f64558e00a23 
6ff1cb0bdfa23d878e53bfb465f0f64558e00a23
+7061de6acf773ff4e53f59a42fc5d00a4bb5d6a6 
7061de6acf773ff4e53f59a42fc5d00a4bb5d6a6
+70b07f4e3252539a0ddd7fe3954c244716787e4f 
70b07f4e3252539a0ddd7fe3954c244716787e4f
+719e0349e709c0cfc781f941fb3d4effea45c9d9 
719e0349e709c0cfc781f941fb3d4effea45c9d9
+71b83f433fdac1cd69384227ded09527a559c452 
71b83f433fdac1cd69384227ded09527a559c452
+7276dfa1325163a2fa2c31506d9ecda2773c802d 
7276dfa1325163a2fa2c31506d9ecda2773c802d
+744ae2edf6f55b7ae0e87ea96456e00052b60d84 
744ae2edf6f55b7ae0e87ea96456e00052b60d84
+75012312272ea1e3da0fe3f9791ec7322df8e10b 
75012312272ea1e3da0fe3f9791ec7322df8e10b
+765a006654bf2bfd46614853267f550520694275 
765a006654bf2bfd46614853267f550520694275
+76cf72fc3c197c5186c639d07d6934232cec5b41 
76cf72fc3c197c5186c639d07d6934232cec5b41
+77182523fcd8f95d35d138aa8651e7a9680dcbe6 
77182523fcd8f95d35d138aa8651e7a9680dcbe6
+77996f3da0959055973c61ff952b23ff38be33db 
77996f3da0959055973c61ff952b23ff38be33db
+796b96d1c402326528b4ba3c12ee9d92d0e212e9 
796b96d1c402326528b4ba3c12ee9d92d0e212e9
+7d8f2eb8fbd90b7d895b6587331446edb1f3146b 
7d8f2eb8fbd90b7d895b6587331446edb1f3146b
+7e2feb8106ccf6da8fb4f11cf1d44b817c4a22d7 
7e2feb8106ccf6da8fb4f11cf1d44b817c4a22d7
+80a828057deb987c4d96c12bd8cfe990587f6a33 
80a828057deb987c4d96c12bd8cfe990587f6a33
+80cfef3c0c822afc966f9d6c4976243ef7abb7f7 
80cfef3c0c822afc966f9d6c4976243ef7abb7f7
+8129560efeaf185ef1ef3cac5cd78383995b145a 
8129560efeaf185ef1ef3cac5cd78383995b145a
+8354c094ea61d80dd3d9462e303d4261ffcb1892 
8354c094ea61d80dd3d9462e303d4261ffcb1892
+87a0de75bb09f4848f55abc1eb03c4fc20d13525 
87a0de75bb09f4848f55abc1eb03c4fc20d13525
+881ee4696fd2f37005f9ffe702c6c423208c1a1f 
881ee4696fd2f37005f9ffe702c6c423208c1a1f
+88e33b7e99ede588bc2ce54be2327a0dda6325ac 
88e33b7e99ede588bc2ce54be2327a0dda6325ac
+8954f4c473e33ee0eb605a7090e5735bf3867961 
8954f4c473e33ee0eb605a7090e5735bf3867961
+89f94772682096261658d8ff92fb3298a82427b3 
89f94772682096261658d8ff92fb3298a82427b3
+8c3dca558ce2b3443f1cd95ce86d7dfde3fa7dbd 
8c3dca558ce2b3443f1cd95ce86d7dfde3fa7dbd
+8c88439248a753c368b833ee55e8310c03737afe 
8c88439248a753c368b833ee55e8310c03737afe
+8ccc9943ccba295c4d35fda506f4f919df64f818 
8ccc9943ccba295c4d35fda506f4f919df64f818
+8d0eaa1dbb78fb9df513030d3187829ac57afd6d 
8d0eaa1dbb78fb9df513030d3187829ac57afd6d
+8f45359515ab4664ff4719d8a91263bfd2f57bdb 
8f45359515ab4664ff4719d8a91263bfd2f57bdb
+900b01e5b86403ddc8a882c78e83b77f9d9a4bca 
900b01e5b86403ddc8a882c78e83b77f9d9a4bca
+90e0de231d26236502b12c1d6868afbd52757c98 
90e0de231d26236502b12c1d6868afbd52757c98
+90ea8ffa6b4180a836e0fbeacb23a8e4189b18ef 
90ea8ffa6b4180a836e0fbeacb23a8e4189b18ef
+94bb02fe3b8aee70415af5caf5c86a0a72a71e33 
94bb02fe3b8aee70415af5caf5c86a0a72a71e33
+94db8f2f8f51ab300a23207b89db04d7e458a0d0 
94db8f2f8f51ab300a23207b89db04d7e458a0d0
+94e2c6beb00cdb71df7c28efe30e2726272fe527 
94e2c6beb00cdb71df7c28efe30e2726272fe527
+94e868cc2a3e395aefd09ed3b86bec597b6c138e 
94e868cc2a3e395aefd09ed3b86bec597b6c138e
+95abe018ec6a5ddccd0e3900e9b3b03ece7df6e6 
95abe018ec6a5ddccd0e3900e9b3b03ece7df6e6
+976a2742308b3194ca482b692adfadf6e64b5526 
976a2742308b3194ca482b692adfadf6e64b5526
+98ad9b408df48383fc7aaa6012d7cad96d499359 
98ad9b408df48383fc7aaa6012d7cad96d499359
+9c113e185938fcd0e21af6b7f9773ef96ac3d83e 
9c113e185938fcd0e21af6b7f9773ef96ac3d83e
+9cd9d37f2025c7d8f242226e6a99d7404cb3dbe6 
9cd9d37f2025c7d8f242226e6a99d7404cb3dbe6
+9e8c721ee0cc3e4a39215b3042634151580ab01a 
9e8c721ee0cc3e4a39215b3042634151580ab01a
+9f222c8b466eea77c8797bfa39b02ff8c279c3a4 
9f222c8b466eea77c8797bfa39b02ff8c279c3a4
+a0c6e74244170d6e59f2af2b6e80066de3a8394b 
a0c6e74244170d6e59f2af2b6e80066de3a8394b
+a2ead55189eb551b97379775971ab13fab538407 
a2ead55189eb551b97379775971ab13fab538407
+a54fb0f30f6048101cad79c191a70e5a9c263746 
a54fb0f30f6048101cad79c191a70e5a9c263746
+a62c223385b037382f5942f3fe5535a1e219452a 
a62c223385b037382f5942f3fe5535a1e219452a
+aaf6f29c99a183e6b558abc1f84895d8e824a92d 
aaf6f29c99a183e6b558abc1f84895d8e824a92d
+ab5218f8dbfb8a6fcaef2d88e40b681591229193 
ab5218f8dbfb8a6fcaef2d88e40b681591229193
+abf74a0fa2c7ab37e9f79cb3495c73203c0006a4 
abf74a0fa2c7ab37e9f79cb3495c73203c0006a4
+ad1714780f000cd7e3efc1e7965c7b1b9bc816f6 
ad1714780f000cd7e3efc1e7965c7b1b9bc816f6
+ae19a28f5be753b7de15acb3ec07c5d9557901f7 
ae19a28f5be753b7de15acb3ec07c5d9557901f7
+ae2ed500c037a90f85d55d6ef8bc70728d4f716a 
ae2ed500c037a90f85d55d6ef8bc70728d4f716a
+aee04e77bfbd6601adbcd5a46435f059e31cf6e4 
aee04e77bfbd6601adbcd5a46435f059e31cf6e4
+af6480effb6b4339eb78b77311634c546f8c6d11 
af6480effb6b4339eb78b77311634c546f8c6d11
+b281906f51af72f38c5e75c549c5393402d77eac 
b281906f51af72f38c5e75c549c5393402d77eac
+b2d1d1b5bf17bab6942d313d1347ec4952f7b19b 
b2d1d1b5bf17bab6942d313d1347ec4952f7b19b
+b3c723a462fda42bf18d738b96430e7ba20e88aa 
b3c723a462fda42bf18d738b96430e7ba20e88aa
+b4f96c6c8413d4bc2c8fb5994232ad158d8475a9 
b4f96c6c8413d4bc2c8fb5994232ad158d8475a9
+b5a717d82d7ba9ea31228d97c4207f4c9fb9066c 
b5a717d82d7ba9ea31228d97c4207f4c9fb9066c
+b68434df778d6bb10e77cbbdb42e9bbd0029fb44 
b68434df778d6bb10e77cbbdb42e9bbd0029fb44
+b803d30a659910d127644c3a32aaf3fac6b2cc25 
b803d30a659910d127644c3a32aaf3fac6b2cc25
+b865391e7738ff0e9d98e75a1282deb6d0f0ea66 
b865391e7738ff0e9d98e75a1282deb6d0f0ea66
+ba15723a143661719cb66dac3f730fe8b96ef204 
ba15723a143661719cb66dac3f730fe8b96ef204
+bb19195469431a0e2b94832ea9e7a60b1e30c6fc 
bb19195469431a0e2b94832ea9e7a60b1e30c6fc
+bba2a55c6e7916c40229b27a110ce72aa4244461 
bba2a55c6e7916c40229b27a110ce72aa4244461
+bc8d3f0e60565567a8b8598972614dce7d4ffccd 
bc8d3f0e60565567a8b8598972614dce7d4ffccd
+bcc9e5d9a24e351ae729e5eda9354c098b1f2c4a 
bcc9e5d9a24e351ae729e5eda9354c098b1f2c4a
+bdfeb5802b314a0f050ca33e3a727d9b88968e50 
bdfeb5802b314a0f050ca33e3a727d9b88968e50
+be746f4096f772a5e4a461263375f0ce939fd21c 
be746f4096f772a5e4a461263375f0ce939fd21c
+bedd2b266cc4d22b26a6744339af6b227541a37b 
bedd2b266cc4d22b26a6744339af6b227541a37b
+bfff621a7ca4e6baf72151ab8918fbc19391a46b 
bfff621a7ca4e6baf72151ab8918fbc19391a46b
+c0893aca2aa1f38b7e4b9edba8d95a89379c7c6c 
c0893aca2aa1f38b7e4b9edba8d95a89379c7c6c
+c167e70d8b20ec2254115c7b72673605b6a27625 
c167e70d8b20ec2254115c7b72673605b6a27625
+c1b4c398b44cec672dc8a32b83e4ec489466881e 
c1b4c398b44cec672dc8a32b83e4ec489466881e
+c423cfc72547100e9f9db1aeeb205bc6e5154309 
c423cfc72547100e9f9db1aeeb205bc6e5154309
+c546653a2f4a9401b1acb3de2d72b4609af86052 
c546653a2f4a9401b1acb3de2d72b4609af86052
+c74ffc68f201fd49753643bb8f15878bde9ddcbd 
c74ffc68f201fd49753643bb8f15878bde9ddcbd
+c86b0bc3ef91cd92d5020d809938560c08d3ad1e 
c86b0bc3ef91cd92d5020d809938560c08d3ad1e
+c88c45cc9facb1fd6a9accfe9baec6360b7d431e 
c88c45cc9facb1fd6a9accfe9baec6360b7d431e
+c8a4c64aafacbc447fa4474a04fd7e2400c901f9 
c8a4c64aafacbc447fa4474a04fd7e2400c901f9
+c8b3d08af1d714a4ebfb4f3e011026a90223a9fb 
c8b3d08af1d714a4ebfb4f3e011026a90223a9fb
+c9aba3e44af46b89cbd23b5f921b08c382a042d9 
c9aba3e44af46b89cbd23b5f921b08c382a042d9
+c9c7730de063da9473cfb52991f3da2afb30e455 
c9c7730de063da9473cfb52991f3da2afb30e455
+d0103879af61feff70b97819b27973aad422b67d 
d0103879af61feff70b97819b27973aad422b67d
+d0b64b936318af6541ae64ad2830fc6a04f38abe 
d0b64b936318af6541ae64ad2830fc6a04f38abe
+d1c7ba91853fca818c6ae6c5c29d54a464ebf1fc 
d1c7ba91853fca818c6ae6c5c29d54a464ebf1fc
+d34252e743ea6265f662653f4b6ce49cceeff538 
d34252e743ea6265f662653f4b6ce49cceeff538
+d52583035dfe7f1995a8f6e4f2073d3bb409ed4b 
d52583035dfe7f1995a8f6e4f2073d3bb409ed4b
+d7710f9abe38cd77d2e4414d2611bd1cc509bcbc 
d7710f9abe38cd77d2e4414d2611bd1cc509bcbc
+d78f564cf0c941fc6e9af1dad4c8503b755d567d 
d78f564cf0c941fc6e9af1dad4c8503b755d567d
+d7913894b8ec4919bbd2a5a1e550e961eaac2708 
d7913894b8ec4919bbd2a5a1e550e961eaac2708
+d83151eb33abcb448dac718efcef4933dfe9da61 
d83151eb33abcb448dac718efcef4933dfe9da61
+da0d1be3feae525be935a91e53fc5c2c7ae884aa 
da0d1be3feae525be935a91e53fc5c2c7ae884aa
+daa86756462a4692198ec84ee84e8692e5f6ccd8 
daa86756462a4692198ec84ee84e8692e5f6ccd8
+dacc3d37e31c10aa109783a8f45980e4aafcfbe9 
dacc3d37e31c10aa109783a8f45980e4aafcfbe9
+dbc29510f90ed2d462f3f98568281f4bfbadae1f 
dbc29510f90ed2d462f3f98568281f4bfbadae1f
+dc4e4aeeb1400f75fa40bfd4d2503a029c03c52c 
dc4e4aeeb1400f75fa40bfd4d2503a029c03c52c
+ddc808f94f89f623fee361e510d505edef1a2ebf 
ddc808f94f89f623fee361e510d505edef1a2ebf
+e0d41aec9e990af54e362447b0478003081bfc4d 
e0d41aec9e990af54e362447b0478003081bfc4d
+e1d0d95d881f314f3314eeafd1acb10c7d7db140 
e1d0d95d881f314f3314eeafd1acb10c7d7db140
+e2508c83cc1b77af7bbeae6671efa899433c183d 
e2508c83cc1b77af7bbeae6671efa899433c183d
+e446aa13163b7f771631ddb563407b3398d33e5b 
e446aa13163b7f771631ddb563407b3398d33e5b
+e4f41049713e4c689f7dbd69d34db8500ca0c01a 
e4f41049713e4c689f7dbd69d34db8500ca0c01a
+e7758e0943c0589f31b874e5e388e78502695cbe 
e7758e0943c0589f31b874e5e388e78502695cbe
+e9ad19bb6a8eb6b49a695c8ad20518c692c98f65 
e9ad19bb6a8eb6b49a695c8ad20518c692c98f65
+e9fceef6f3dfc575dea445d2dfdf043099c2beef 
e9fceef6f3dfc575dea445d2dfdf043099c2beef
+ee7e1e002c00268555784c5b57871addf209d565 
ee7e1e002c00268555784c5b57871addf209d565
+f03a3535f7e2c52fb694e52c2648468b953d91c0 
f03a3535f7e2c52fb694e52c2648468b953d91c0
+f1f1ec6281d556093b203f341b89738190d6f527 
f1f1ec6281d556093b203f341b89738190d6f527
+f3642961c9660f495dec47f5e4e4fc37e6b077e3 
f3642961c9660f495dec47f5e4e4fc37e6b077e3
+f46499099937469142409a75b5ab351e487ccc7f 
f46499099937469142409a75b5ab351e487ccc7f
+f6069bf4636c7b5620fb33721a39a96583d1f589 
f6069bf4636c7b5620fb33721a39a96583d1f589
+f8a89ef59b4f74566cb2b086b1a88eaabd3ccb4c 
f8a89ef59b4f74566cb2b086b1a88eaabd3ccb4c
+f9d4bfa48c9bdf9a794351ed3772bae71a97e8b4 
f9d4bfa48c9bdf9a794351ed3772bae71a97e8b4
+fa4e443040e88b54ad7ba28064d7c15acb137a10 
fa4e443040e88b54ad7ba28064d7c15acb137a10
+fa87e53009762bedd3951b5dc4e1021fb3354d0d 
fa87e53009762bedd3951b5dc4e1021fb3354d0d
+fa9439302b7483c7dffdae0703cf6a617389033e 
fa9439302b7483c7dffdae0703cf6a617389033e
+fbf58295a33eabf503fcf991f050a7ea58bba3b0 
fbf58295a33eabf503fcf991f050a7ea58bba3b0
+fdfc0a57efd1fb23d3e054a98370198f24bf2c1c 
fdfc0a57efd1fb23d3e054a98370198f24bf2c1c
+fe64ea5eecb5001d1c74906df28bd65f5ac1a6f6 
fe64ea5eecb5001d1c74906df28bd65f5ac1a6f6
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-001c55cc7124c20b9bf71b9aca2985f213726579.rev
 and 
new/nebula-1.9.5/.git/objects/pack/pack-001c55cc7124c20b9bf71b9aca2985f213726579.rev
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-0d2ea528b6809dc0917fe0e69abec92910ede56a.idx
 and 
new/nebula-1.9.5/.git/objects/pack/pack-0d2ea528b6809dc0917fe0e69abec92910ede56a.idx
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-0d2ea528b6809dc0917fe0e69abec92910ede56a.pack
 and 
new/nebula-1.9.5/.git/objects/pack/pack-0d2ea528b6809dc0917fe0e69abec92910ede56a.pack
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-0d2ea528b6809dc0917fe0e69abec92910ede56a.rev
 and 
new/nebula-1.9.5/.git/objects/pack/pack-0d2ea528b6809dc0917fe0e69abec92910ede56a.rev
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-3da6a4e13b967ae09d434fe60686b92b95d79b21.idx
 and 
new/nebula-1.9.5/.git/objects/pack/pack-3da6a4e13b967ae09d434fe60686b92b95d79b21.idx
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-3da6a4e13b967ae09d434fe60686b92b95d79b21.pack
 and 
new/nebula-1.9.5/.git/objects/pack/pack-3da6a4e13b967ae09d434fe60686b92b95d79b21.pack
 differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nebula-1.9.4/.git/objects/pack/pack-3da6a4e13b967ae09d434fe60686b92b95d79b21.promisor
 
new/nebula-1.9.5/.git/objects/pack/pack-3da6a4e13b967ae09d434fe60686b92b95d79b21.promisor
--- 
old/nebula-1.9.4/.git/objects/pack/pack-3da6a4e13b967ae09d434fe60686b92b95d79b21.promisor
   2024-09-09 20:11:44.000000000 +0200
+++ 
new/nebula-1.9.5/.git/objects/pack/pack-3da6a4e13b967ae09d434fe60686b92b95d79b21.promisor
   1970-01-01 01:00:00.000000000 +0100
@@ -1,201 +0,0 @@
-0017794f4638f1a1b4e469619a9824accac6ccea 
0017794f4638f1a1b4e469619a9824accac6ccea
-05b42d10c5682319a702f01111145bf1b7aa59a5 
05b42d10c5682319a702f01111145bf1b7aa59a5
-08905705c03a39ab8546eb13241a08e5188e8ec0 
08905705c03a39ab8546eb13241a08e5188e8ec0
-0b573e6b344309da856dd6b9e747f8e2ecf93e65 
0b573e6b344309da856dd6b9e747f8e2ecf93e65
-0bb2345ac0bc40f01a8a0ec0e4939503cd911990 
0bb2345ac0bc40f01a8a0ec0e4939503cd911990
-0bffc857c0951d3cb3061f30f502282bbaec5d7c 
0bffc857c0951d3cb3061f30f502282bbaec5d7c
-0ccd17909372cafab7b7ff6a1a7e568ea75e0f8b 
0ccd17909372cafab7b7ff6a1a7e568ea75e0f8b
-0e7e20d4122d33d90b4f1b03722f6f8874dd1090 
0e7e20d4122d33d90b4f1b03722f6f8874dd1090
-0ffbd8792f5e1882479d8075e90f66647adbcf20 
0ffbd8792f5e1882479d8075e90f66647adbcf20
-10d12a10efe27d9e7626caec38d014b423fec216 
10d12a10efe27d9e7626caec38d014b423fec216
-12460da1f85968dd6e9365afdb99ed94995e2988 
12460da1f85968dd6e9365afdb99ed94995e2988
-129744fd2513138b0d3269fcdf61bdc5a1f0bd78 
129744fd2513138b0d3269fcdf61bdc5a1f0bd78
-130f8f99f5e18129e754884c37f5822b7038ee28 
130f8f99f5e18129e754884c37f5822b7038ee28
-14ba2ce145c06795b4387de56029e160697140b2 
14ba2ce145c06795b4387de56029e160697140b2
-16e6a680fefc2fc02952634fce616297c1725157 
16e6a680fefc2fc02952634fce616297c1725157
-16e768ee42b7416f77f5f2f603688c8e28679d17 
16e768ee42b7416f77f5f2f603688c8e28679d17
-183ac7af2c09593aabfedb7c7353607580400e11 
183ac7af2c09593aabfedb7c7353607580400e11
-1a3a4d48f9427b5f833805c826840b18e6be4b59 
1a3a4d48f9427b5f833805c826840b18e6be4b59
-1aea83273596bf6a26a3b065af178176dd3cf475 
1aea83273596bf6a26a3b065af178176dd3cf475
-1b777c3743a9f9aee4f0bdb020a0c49becbd3bfc 
1b777c3743a9f9aee4f0bdb020a0c49becbd3bfc
-1bb4ef5f70bdb2caec407d8778dbcab5ed070ab5 
1bb4ef5f70bdb2caec407d8778dbcab5ed070ab5
-1c1842da5532f71f64ab20a23e3ceade57046140 
1c1842da5532f71f64ab20a23e3ceade57046140
-1db60a7c41b17e09f1f24f0ed795b514f3edcab4 
1db60a7c41b17e09f1f24f0ed795b514f3edcab4
-1df37bdbcade0be9d78b46054151fe85905a36b7 
1df37bdbcade0be9d78b46054151fe85905a36b7
-2034405a70048b4afbf04c625828ee3819324bef 
2034405a70048b4afbf04c625828ee3819324bef
-20981f08cc90bd27b0a7155a420e9b31854d4cf0 
20981f08cc90bd27b0a7155a420e9b31854d4cf0
-2355c4f131e8e63bd8f78ecfd45f7b3d47f0bd99 
2355c4f131e8e63bd8f78ecfd45f7b3d47f0bd99
-24ab24f78dd3b6aa3f4a59f0052573a8c83f83a6 
24ab24f78dd3b6aa3f4a59f0052573a8c83f83a6
-2502824b117395420749fda2d512a8b749290adf 
2502824b117395420749fda2d512a8b749290adf
-2599f5f2ea0386daed0e3c45ba5a8b0c7e01e998 
2599f5f2ea0386daed0e3c45ba5a8b0c7e01e998
-261ed3642b694b55ba1cf8b6ec6a7033693548de 
261ed3642b694b55ba1cf8b6ec6a7033693548de
-28170b622cf5c5fbdf3349152e1f6c80888b1961 
28170b622cf5c5fbdf3349152e1f6c80888b1961
-2ab97dba062208bcb6ffc32bef8347d586751038 
2ab97dba062208bcb6ffc32bef8347d586751038
-2b27f52f5c259acb302f34a42d30dfa06dff71f8 
2b27f52f5c259acb302f34a42d30dfa06dff71f8
-2b5e6e937141af36ad4974569e64a68d16067818 
2b5e6e937141af36ad4974569e64a68d16067818
-2beca66c91c38c5ee8036319e29fe439c94d4195 
2beca66c91c38c5ee8036319e29fe439c94d4195
-2d84536944d28f36dba26e76008e6b383b4f0cdd 
2d84536944d28f36dba26e76008e6b383b4f0cdd
-2eee76ee261a56eac20b84dc9556f7f79fabe6c6 
2eee76ee261a56eac20b84dc9556f7f79fabe6c6
-2fab9274b8c46eb5c8415ac1c7c67ff8ff645919 
2fab9274b8c46eb5c8415ac1c7c67ff8ff645919
-2ff0954d62e2717fc6de38b6f0276e2079b6105f 
2ff0954d62e2717fc6de38b6f0276e2079b6105f
-30178c03451593c58a9c17d33953d67ef3910b15 
30178c03451593c58a9c17d33953d67ef3910b15
-30e99eca13c42cebf1ed898f1e35e39bc2973acf 
30e99eca13c42cebf1ed898f1e35e39bc2973acf
-31762090de0fdeadb7f92e3a92a19a1a41ad7939 
31762090de0fdeadb7f92e3a92a19a1a41ad7939
-31987db86295fc6beff233918a5031e913f4fcd4 
31987db86295fc6beff233918a5031e913f4fcd4
-3468b35367e2b376db1b6ed8649a318aa3d33193 
3468b35367e2b376db1b6ed8649a318aa3d33193
-34fe17e5902aebb08a0a2e04d7c713919ff28c35 
34fe17e5902aebb08a0a2e04d7c713919ff28c35
-3558e1a542336e677d00715ff3f3e54e5abe80a5 
3558e1a542336e677d00715ff3f3e54e5abe80a5
-3570e0750597c554d37c726ca02d0900c18e0f7c 
3570e0750597c554d37c726ca02d0900c18e0f7c
-36b0fc94c25000a774e77f2953ec2627f2c74705 
36b0fc94c25000a774e77f2953ec2627f2c74705
-36d043bcd53f5526b521f8c3dce5c1bb1115f02a 
36d043bcd53f5526b521f8c3dce5c1bb1115f02a
-3b69159ad93ce3fb1c56da2ad24c40b04a355949 
3b69159ad93ce3fb1c56da2ad24c40b04a355949
-3b7cdd1c9a1d4efbf1082648c0d6e712525bc7a0 
3b7cdd1c9a1d4efbf1082648c0d6e712525bc7a0
-3d42a560ce91a082fa0ddfb5c99ec7b308f58b31 
3d42a560ce91a082fa0ddfb5c99ec7b308f58b31
-3d883093c812cae51d9c1a689477ef282da57b00 
3d883093c812cae51d9c1a689477ef282da57b00
-400e275b469b6bf0d21ecbfc628fa55d68263571 
400e275b469b6bf0d21ecbfc628fa55d68263571
-4b1d0bd0d028528610d5f38b77a6e9937ea07a1c 
4b1d0bd0d028528610d5f38b77a6e9937ea07a1c
-4c6364ef5629748ecb29546213ed7d39c8d00f86 
4c6364ef5629748ecb29546213ed7d39c8d00f86
-4d47e785f6d44abf54dcbfea6cdeced03e9b0a6e 
4d47e785f6d44abf54dcbfea6cdeced03e9b0a6e
-4ddd301829ef40e49f967084e52b83a49a7600f8 
4ddd301829ef40e49f967084e52b83a49a7600f8
-5041f82ce386d917a3017497f623dcccd3c8e66e 
5041f82ce386d917a3017497f623dcccd3c8e66e
-50ad6ad5bcc1168e4b187a66796b404587b77602 
50ad6ad5bcc1168e4b187a66796b404587b77602
-50b7d62b22f780dd105d76fdf2562a3b698e3d72 
50b7d62b22f780dd105d76fdf2562a3b698e3d72
-511d3052336045dcdb6b3b5eb751bf8109cb8209 
511d3052336045dcdb6b3b5eb751bf8109cb8209
-523968c2352e3904d9f21e373d90604e297ad914 
523968c2352e3904d9f21e373d90604e297ad914
-527f55bc7b0ff270940b0edbbcf2dade3b33e28c 
527f55bc7b0ff270940b0edbbcf2dade3b33e28c
-547037c5a10a71380bc2e12a5ff4b9389e3a73d9 
547037c5a10a71380bc2e12a5ff4b9389e3a73d9
-54833bdc789754f8b3086f94764e7ac990786b11 
54833bdc789754f8b3086f94764e7ac990786b11
-55d441f4a8017b2ea30eae55137c52f2829dba5f 
55d441f4a8017b2ea30eae55137c52f2829dba5f
-57990a7943a518013e8a86e0c3d8e99c9fadc01f 
57990a7943a518013e8a86e0c3d8e99c9fadc01f
-5afeaeabe191d7878ca66eebf370d07572c8ae18 
5afeaeabe191d7878ca66eebf370d07572c8ae18
-5cf0a028abab5fa3606ff15513ae87cab10aac95 
5cf0a028abab5fa3606ff15513ae87cab10aac95
-5f97cad9d4880b54a81755119b5939cfa1e257af 
5f97cad9d4880b54a81755119b5939cfa1e257af
-5fea65c47bc22ceef5d9d6a45d04fc5c6dc478ff 
5fea65c47bc22ceef5d9d6a45d04fc5c6dc478ff
-62a892b00189463dbd90248b95d0877618e7f242 
62a892b00189463dbd90248b95d0877618e7f242
-62f406560ca38e7e37dc0ae2b8a8d663631c18af 
62f406560ca38e7e37dc0ae2b8a8d663631c18af
-6463ccbba5dc27e71aeb73073adb9d5b1a65b6b6 
6463ccbba5dc27e71aeb73073adb9d5b1a65b6b6
-65ea91f5105a5681011580b4bf219f50e187a21d 
65ea91f5105a5681011580b4bf219f50e187a21d
-65ef31a5656c7b49517e3d1c70a75c2a53ff0599 
65ef31a5656c7b49517e3d1c70a75c2a53ff0599
-6922cc3e89721a03010ca670d73ae8761e0b1267 
6922cc3e89721a03010ca670d73ae8761e0b1267
-69f6ae84f47316b8772977a072b24188c4a409c9 
69f6ae84f47316b8772977a072b24188c4a409c9
-6a023abf20b6ef8e38c2bc8a73447cb2183e8ddc 
6a023abf20b6ef8e38c2bc8a73447cb2183e8ddc
-6c6c7951563aa1bc4dbe4184900f6277c8d43bba 
6c6c7951563aa1bc4dbe4184900f6277c8d43bba
-6d04027aa7ab62201683f852fd13d8e70bd045a2 
6d04027aa7ab62201683f852fd13d8e70bd045a2
-6d5c8a433279de7637aed7ab48574b65540a8d54 
6d5c8a433279de7637aed7ab48574b65540a8d54
-6ff1cb0bdfa23d878e53bfb465f0f64558e00a23 
6ff1cb0bdfa23d878e53bfb465f0f64558e00a23
-7061de6acf773ff4e53f59a42fc5d00a4bb5d6a6 
7061de6acf773ff4e53f59a42fc5d00a4bb5d6a6
-70b07f4e3252539a0ddd7fe3954c244716787e4f 
70b07f4e3252539a0ddd7fe3954c244716787e4f
-719e0349e709c0cfc781f941fb3d4effea45c9d9 
719e0349e709c0cfc781f941fb3d4effea45c9d9
-71b83f433fdac1cd69384227ded09527a559c452 
71b83f433fdac1cd69384227ded09527a559c452
-71df805f882b109ae8fd51b6b69837ba0a770bf5 
71df805f882b109ae8fd51b6b69837ba0a770bf5
-7276dfa1325163a2fa2c31506d9ecda2773c802d 
7276dfa1325163a2fa2c31506d9ecda2773c802d
-746d6a3ab8f3bde7a9b1cfd3d839981145737909 
746d6a3ab8f3bde7a9b1cfd3d839981145737909
-757f8830098671ed216d28df058441e4eb0f0614 
757f8830098671ed216d28df058441e4eb0f0614
-765a006654bf2bfd46614853267f550520694275 
765a006654bf2bfd46614853267f550520694275
-76cf72fc3c197c5186c639d07d6934232cec5b41 
76cf72fc3c197c5186c639d07d6934232cec5b41
-796b96d1c402326528b4ba3c12ee9d92d0e212e9 
796b96d1c402326528b4ba3c12ee9d92d0e212e9
-7d8f2eb8fbd90b7d895b6587331446edb1f3146b 
7d8f2eb8fbd90b7d895b6587331446edb1f3146b
-7e2feb8106ccf6da8fb4f11cf1d44b817c4a22d7 
7e2feb8106ccf6da8fb4f11cf1d44b817c4a22d7
-8129560efeaf185ef1ef3cac5cd78383995b145a 
8129560efeaf185ef1ef3cac5cd78383995b145a
-8354c094ea61d80dd3d9462e303d4261ffcb1892 
8354c094ea61d80dd3d9462e303d4261ffcb1892
-87a0de75bb09f4848f55abc1eb03c4fc20d13525 
87a0de75bb09f4848f55abc1eb03c4fc20d13525
-88e33b7e99ede588bc2ce54be2327a0dda6325ac 
88e33b7e99ede588bc2ce54be2327a0dda6325ac
-8954f4c473e33ee0eb605a7090e5735bf3867961 
8954f4c473e33ee0eb605a7090e5735bf3867961
-89f94772682096261658d8ff92fb3298a82427b3 
89f94772682096261658d8ff92fb3298a82427b3
-8a409d25d744bd745e7a7ae0c9e76440b2def1ae 
8a409d25d744bd745e7a7ae0c9e76440b2def1ae
-8c3dca558ce2b3443f1cd95ce86d7dfde3fa7dbd 
8c3dca558ce2b3443f1cd95ce86d7dfde3fa7dbd
-8c88439248a753c368b833ee55e8310c03737afe 
8c88439248a753c368b833ee55e8310c03737afe
-8ccc9943ccba295c4d35fda506f4f919df64f818 
8ccc9943ccba295c4d35fda506f4f919df64f818
-8cf5341121fb5918486affd14556a01f0f8398ca 
8cf5341121fb5918486affd14556a01f0f8398ca
-8d0eaa1dbb78fb9df513030d3187829ac57afd6d 
8d0eaa1dbb78fb9df513030d3187829ac57afd6d
-8e86fe5f4f12fd10c3970f929d237d822b95385b 
8e86fe5f4f12fd10c3970f929d237d822b95385b
-900b01e5b86403ddc8a882c78e83b77f9d9a4bca 
900b01e5b86403ddc8a882c78e83b77f9d9a4bca
-90e0de231d26236502b12c1d6868afbd52757c98 
90e0de231d26236502b12c1d6868afbd52757c98
-925b2667222d3bda1b05b4afae1cd114869d7dcf 
925b2667222d3bda1b05b4afae1cd114869d7dcf
-94bb02fe3b8aee70415af5caf5c86a0a72a71e33 
94bb02fe3b8aee70415af5caf5c86a0a72a71e33
-94e2c6beb00cdb71df7c28efe30e2726272fe527 
94e2c6beb00cdb71df7c28efe30e2726272fe527
-94e868cc2a3e395aefd09ed3b86bec597b6c138e 
94e868cc2a3e395aefd09ed3b86bec597b6c138e
-95abe018ec6a5ddccd0e3900e9b3b03ece7df6e6 
95abe018ec6a5ddccd0e3900e9b3b03ece7df6e6
-976a2742308b3194ca482b692adfadf6e64b5526 
976a2742308b3194ca482b692adfadf6e64b5526
-98ad9b408df48383fc7aaa6012d7cad96d499359 
98ad9b408df48383fc7aaa6012d7cad96d499359
-9c113e185938fcd0e21af6b7f9773ef96ac3d83e 
9c113e185938fcd0e21af6b7f9773ef96ac3d83e
-9cd9d37f2025c7d8f242226e6a99d7404cb3dbe6 
9cd9d37f2025c7d8f242226e6a99d7404cb3dbe6
-9e8c721ee0cc3e4a39215b3042634151580ab01a 
9e8c721ee0cc3e4a39215b3042634151580ab01a
-9fa8a5492ea5e52de8ce4a5f32e9fad303e747a9 
9fa8a5492ea5e52de8ce4a5f32e9fad303e747a9
-a2ead55189eb551b97379775971ab13fab538407 
a2ead55189eb551b97379775971ab13fab538407
-a54fb0f30f6048101cad79c191a70e5a9c263746 
a54fb0f30f6048101cad79c191a70e5a9c263746
-a78b45f54c3c214eb64d08a9dd46f928f1abe95e 
a78b45f54c3c214eb64d08a9dd46f928f1abe95e
-aa17a1311472e013fa2900af786e5ecbd96ab071 
aa17a1311472e013fa2900af786e5ecbd96ab071
-aaf6f29c99a183e6b558abc1f84895d8e824a92d 
aaf6f29c99a183e6b558abc1f84895d8e824a92d
-ab5218f8dbfb8a6fcaef2d88e40b681591229193 
ab5218f8dbfb8a6fcaef2d88e40b681591229193
-abf74a0fa2c7ab37e9f79cb3495c73203c0006a4 
abf74a0fa2c7ab37e9f79cb3495c73203c0006a4
-ad1714780f000cd7e3efc1e7965c7b1b9bc816f6 
ad1714780f000cd7e3efc1e7965c7b1b9bc816f6
-ae19a28f5be753b7de15acb3ec07c5d9557901f7 
ae19a28f5be753b7de15acb3ec07c5d9557901f7
-ae2ed500c037a90f85d55d6ef8bc70728d4f716a 
ae2ed500c037a90f85d55d6ef8bc70728d4f716a
-aee04e77bfbd6601adbcd5a46435f059e31cf6e4 
aee04e77bfbd6601adbcd5a46435f059e31cf6e4
-af6480effb6b4339eb78b77311634c546f8c6d11 
af6480effb6b4339eb78b77311634c546f8c6d11
-b281906f51af72f38c5e75c549c5393402d77eac 
b281906f51af72f38c5e75c549c5393402d77eac
-b2d1d1b5bf17bab6942d313d1347ec4952f7b19b 
b2d1d1b5bf17bab6942d313d1347ec4952f7b19b
-b3c723a462fda42bf18d738b96430e7ba20e88aa 
b3c723a462fda42bf18d738b96430e7ba20e88aa
-b4f96c6c8413d4bc2c8fb5994232ad158d8475a9 
b4f96c6c8413d4bc2c8fb5994232ad158d8475a9
-b5a717d82d7ba9ea31228d97c4207f4c9fb9066c 
b5a717d82d7ba9ea31228d97c4207f4c9fb9066c
-b803d30a659910d127644c3a32aaf3fac6b2cc25 
b803d30a659910d127644c3a32aaf3fac6b2cc25
-b865391e7738ff0e9d98e75a1282deb6d0f0ea66 
b865391e7738ff0e9d98e75a1282deb6d0f0ea66
-ba15723a143661719cb66dac3f730fe8b96ef204 
ba15723a143661719cb66dac3f730fe8b96ef204
-bb19195469431a0e2b94832ea9e7a60b1e30c6fc 
bb19195469431a0e2b94832ea9e7a60b1e30c6fc
-bba2a55c6e7916c40229b27a110ce72aa4244461 
bba2a55c6e7916c40229b27a110ce72aa4244461
-bc8d3f0e60565567a8b8598972614dce7d4ffccd 
bc8d3f0e60565567a8b8598972614dce7d4ffccd
-bdfeb5802b314a0f050ca33e3a727d9b88968e50 
bdfeb5802b314a0f050ca33e3a727d9b88968e50
-be60294daf91a8fb201a1802c75a3b2be4acf4a7 
be60294daf91a8fb201a1802c75a3b2be4acf4a7
-be746f4096f772a5e4a461263375f0ce939fd21c 
be746f4096f772a5e4a461263375f0ce939fd21c
-be7f0b6dc6491f3f8ee6b511d5f4d46ccf5ca09c 
be7f0b6dc6491f3f8ee6b511d5f4d46ccf5ca09c
-bedd2b266cc4d22b26a6744339af6b227541a37b 
bedd2b266cc4d22b26a6744339af6b227541a37b
-bfff621a7ca4e6baf72151ab8918fbc19391a46b 
bfff621a7ca4e6baf72151ab8918fbc19391a46b
-c14ab2e77f78b3fde66b6235c7170b6afd487a29 
c14ab2e77f78b3fde66b6235c7170b6afd487a29
-c167e70d8b20ec2254115c7b72673605b6a27625 
c167e70d8b20ec2254115c7b72673605b6a27625
-c1b4c398b44cec672dc8a32b83e4ec489466881e 
c1b4c398b44cec672dc8a32b83e4ec489466881e
-c2e61df070b30a8bf65737b367765afaf4a7c6bc 
c2e61df070b30a8bf65737b367765afaf4a7c6bc
-c423cfc72547100e9f9db1aeeb205bc6e5154309 
c423cfc72547100e9f9db1aeeb205bc6e5154309
-c546653a2f4a9401b1acb3de2d72b4609af86052 
c546653a2f4a9401b1acb3de2d72b4609af86052
-c6edc913360a90fa79fec0063053ff6d5d672f6a 
c6edc913360a90fa79fec0063053ff6d5d672f6a
-c74ffc68f201fd49753643bb8f15878bde9ddcbd 
c74ffc68f201fd49753643bb8f15878bde9ddcbd
-c86b0bc3ef91cd92d5020d809938560c08d3ad1e 
c86b0bc3ef91cd92d5020d809938560c08d3ad1e
-c88c45cc9facb1fd6a9accfe9baec6360b7d431e 
c88c45cc9facb1fd6a9accfe9baec6360b7d431e
-c8a4c64aafacbc447fa4474a04fd7e2400c901f9 
c8a4c64aafacbc447fa4474a04fd7e2400c901f9
-c8b3d08af1d714a4ebfb4f3e011026a90223a9fb 
c8b3d08af1d714a4ebfb4f3e011026a90223a9fb
-c9559136f0fdbe4b4f9bdab6dc244092221d8791 
c9559136f0fdbe4b4f9bdab6dc244092221d8791
-c9c7730de063da9473cfb52991f3da2afb30e455 
c9c7730de063da9473cfb52991f3da2afb30e455
-cb8b57a12903e965d37b18597d0c2a3a94a5950f 
cb8b57a12903e965d37b18597d0c2a3a94a5950f
-d0103879af61feff70b97819b27973aad422b67d 
d0103879af61feff70b97819b27973aad422b67d
-d0b64b936318af6541ae64ad2830fc6a04f38abe 
d0b64b936318af6541ae64ad2830fc6a04f38abe
-d1c7ba91853fca818c6ae6c5c29d54a464ebf1fc 
d1c7ba91853fca818c6ae6c5c29d54a464ebf1fc
-d2e861647db42b4d804fc1c3363760db9b6feb32 
d2e861647db42b4d804fc1c3363760db9b6feb32
-d46540f0434e01361d3457dd8e7adf0e33fd156a 
d46540f0434e01361d3457dd8e7adf0e33fd156a
-d6e2a3949ffdfbccf6eb392cad0b2e425e90b8cf 
d6e2a3949ffdfbccf6eb392cad0b2e425e90b8cf
-d7710f9abe38cd77d2e4414d2611bd1cc509bcbc 
d7710f9abe38cd77d2e4414d2611bd1cc509bcbc
-d78f564cf0c941fc6e9af1dad4c8503b755d567d 
d78f564cf0c941fc6e9af1dad4c8503b755d567d
-d7913894b8ec4919bbd2a5a1e550e961eaac2708 
d7913894b8ec4919bbd2a5a1e550e961eaac2708
-dbc29510f90ed2d462f3f98568281f4bfbadae1f 
dbc29510f90ed2d462f3f98568281f4bfbadae1f
-dc4e4aeeb1400f75fa40bfd4d2503a029c03c52c 
dc4e4aeeb1400f75fa40bfd4d2503a029c03c52c
-dd08923774bf9855ce3fa034a5201c597e45b780 
dd08923774bf9855ce3fa034a5201c597e45b780
-ddc808f94f89f623fee361e510d505edef1a2ebf 
ddc808f94f89f623fee361e510d505edef1a2ebf
-e0d41aec9e990af54e362447b0478003081bfc4d 
e0d41aec9e990af54e362447b0478003081bfc4d
-e1d0d95d881f314f3314eeafd1acb10c7d7db140 
e1d0d95d881f314f3314eeafd1acb10c7d7db140
-e2508c83cc1b77af7bbeae6671efa899433c183d 
e2508c83cc1b77af7bbeae6671efa899433c183d
-e4f41049713e4c689f7dbd69d34db8500ca0c01a 
e4f41049713e4c689f7dbd69d34db8500ca0c01a
-e7758e0943c0589f31b874e5e388e78502695cbe 
e7758e0943c0589f31b874e5e388e78502695cbe
-e9ad19bb6a8eb6b49a695c8ad20518c692c98f65 
e9ad19bb6a8eb6b49a695c8ad20518c692c98f65
-ee7e1e002c00268555784c5b57871addf209d565 
ee7e1e002c00268555784c5b57871addf209d565
-f03a3535f7e2c52fb694e52c2648468b953d91c0 
f03a3535f7e2c52fb694e52c2648468b953d91c0
-f0f4c78dd18003cbb3af0e8ff85a8e14388ecc05 
f0f4c78dd18003cbb3af0e8ff85a8e14388ecc05
-f1f1ec6281d556093b203f341b89738190d6f527 
f1f1ec6281d556093b203f341b89738190d6f527
-f2519076ca2a10da3ba7dbacb6bcd90384364bbf 
f2519076ca2a10da3ba7dbacb6bcd90384364bbf
-f3642961c9660f495dec47f5e4e4fc37e6b077e3 
f3642961c9660f495dec47f5e4e4fc37e6b077e3
-f8a89ef59b4f74566cb2b086b1a88eaabd3ccb4c 
f8a89ef59b4f74566cb2b086b1a88eaabd3ccb4c
-f9d4bfa48c9bdf9a794351ed3772bae71a97e8b4 
f9d4bfa48c9bdf9a794351ed3772bae71a97e8b4
-fa14f4295e56b3f83cf17dd6b4113bb9f78faa4a 
fa14f4295e56b3f83cf17dd6b4113bb9f78faa4a
-fa4e443040e88b54ad7ba28064d7c15acb137a10 
fa4e443040e88b54ad7ba28064d7c15acb137a10
-fa9439302b7483c7dffdae0703cf6a617389033e 
fa9439302b7483c7dffdae0703cf6a617389033e
-fb97b76d7243835c00c4e15d84a7ebf66dcfd7de 
fb97b76d7243835c00c4e15d84a7ebf66dcfd7de
-fbf29c060a931fcac39fddedfc54d7b0707b88a2 
fbf29c060a931fcac39fddedfc54d7b0707b88a2
-fbf58295a33eabf503fcf991f050a7ea58bba3b0 
fbf58295a33eabf503fcf991f050a7ea58bba3b0
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-3da6a4e13b967ae09d434fe60686b92b95d79b21.rev
 and 
new/nebula-1.9.5/.git/objects/pack/pack-3da6a4e13b967ae09d434fe60686b92b95d79b21.rev
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-45eace6432ca8a5611541997f72592230dc5a5f1.idx
 and 
new/nebula-1.9.5/.git/objects/pack/pack-45eace6432ca8a5611541997f72592230dc5a5f1.idx
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-45eace6432ca8a5611541997f72592230dc5a5f1.pack
 and 
new/nebula-1.9.5/.git/objects/pack/pack-45eace6432ca8a5611541997f72592230dc5a5f1.pack
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-45eace6432ca8a5611541997f72592230dc5a5f1.rev
 and 
new/nebula-1.9.5/.git/objects/pack/pack-45eace6432ca8a5611541997f72592230dc5a5f1.rev
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-47e6d1aa790f605aac4bc9437099dbfe405efd88.idx
 and 
new/nebula-1.9.5/.git/objects/pack/pack-47e6d1aa790f605aac4bc9437099dbfe405efd88.idx
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-47e6d1aa790f605aac4bc9437099dbfe405efd88.pack
 and 
new/nebula-1.9.5/.git/objects/pack/pack-47e6d1aa790f605aac4bc9437099dbfe405efd88.pack
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-47e6d1aa790f605aac4bc9437099dbfe405efd88.rev
 and 
new/nebula-1.9.5/.git/objects/pack/pack-47e6d1aa790f605aac4bc9437099dbfe405efd88.rev
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-498ab9e50a6b091b0bbd70ff5eb12341d6034587.idx
 and 
new/nebula-1.9.5/.git/objects/pack/pack-498ab9e50a6b091b0bbd70ff5eb12341d6034587.idx
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-498ab9e50a6b091b0bbd70ff5eb12341d6034587.pack
 and 
new/nebula-1.9.5/.git/objects/pack/pack-498ab9e50a6b091b0bbd70ff5eb12341d6034587.pack
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-498ab9e50a6b091b0bbd70ff5eb12341d6034587.rev
 and 
new/nebula-1.9.5/.git/objects/pack/pack-498ab9e50a6b091b0bbd70ff5eb12341d6034587.rev
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-7d0a5336e099ab759227a44c98cc73c8e9f9d566.idx
 and 
new/nebula-1.9.5/.git/objects/pack/pack-7d0a5336e099ab759227a44c98cc73c8e9f9d566.idx
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-7d0a5336e099ab759227a44c98cc73c8e9f9d566.pack
 and 
new/nebula-1.9.5/.git/objects/pack/pack-7d0a5336e099ab759227a44c98cc73c8e9f9d566.pack
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-7d0a5336e099ab759227a44c98cc73c8e9f9d566.rev
 and 
new/nebula-1.9.5/.git/objects/pack/pack-7d0a5336e099ab759227a44c98cc73c8e9f9d566.rev
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-9b4af6c0de25ecaa195dd27c77cd176d65405b82.idx
 and 
new/nebula-1.9.5/.git/objects/pack/pack-9b4af6c0de25ecaa195dd27c77cd176d65405b82.idx
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-9b4af6c0de25ecaa195dd27c77cd176d65405b82.pack
 and 
new/nebula-1.9.5/.git/objects/pack/pack-9b4af6c0de25ecaa195dd27c77cd176d65405b82.pack
 differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nebula-1.9.4/.git/objects/pack/pack-9b4af6c0de25ecaa195dd27c77cd176d65405b82.promisor
 
new/nebula-1.9.5/.git/objects/pack/pack-9b4af6c0de25ecaa195dd27c77cd176d65405b82.promisor
--- 
old/nebula-1.9.4/.git/objects/pack/pack-9b4af6c0de25ecaa195dd27c77cd176d65405b82.promisor
   1970-01-01 01:00:00.000000000 +0100
+++ 
new/nebula-1.9.5/.git/objects/pack/pack-9b4af6c0de25ecaa195dd27c77cd176d65405b82.promisor
   2024-12-06 15:50:24.000000000 +0100
@@ -0,0 +1,43 @@
+3e6c75573fd55d4bcdb6ad19f8c362d59bb1d9f0 HEAD
+0af7e6a1ddadd96dfe967ba49e456f2c67969b1e refs/heads/add-http-pprof
+21a117a156ead37d8ef1f1484e820167e7162dd9 refs/heads/cert-v2
+006479fd15e4bc01c3c17dad3b31c32fd0202351 
refs/heads/dependabot/go_modules/github.com/gaissmai/bart-0.13.3
+52e752f4a9277c81e483e327b1094f737158f39b 
refs/heads/dependabot/go_modules/github.com/prometheus/client_golang-1.20.5
+9bd66a5506158d694c63e026f6a08246074435ea 
refs/heads/dependabot/go_modules/github.com/stretchr/testify-1.10.0
+a78d07997056def51b33ecc781318ea1f043a50a 
refs/heads/dependabot/go_modules/golang-x-dependencies-687dc3a1d5
+c87dfd309494084dab560067ff47d852fa3bff06 
refs/heads/dependabot/go_modules/protobuf-dependencies-2ffac51044
+6111aa8b704c33626da6c9cd69c985ea163abdc6 refs/heads/go123
+7a36dd057bbf8f3b6e9b3849bc9ca1365a2fb3c5 refs/heads/holepunch-remote-allow-list
+5c6ac0710f53f045e351cf642df412179b33db7a refs/heads/hostmap-split
+db11e2f1af19017d21ef5912a5613d48b9db3d02 refs/heads/interface-hooks
+9c6fb08a6dd15e950731a0440691c234e4227b30 
refs/heads/make-boringcrypto-checklinkname
+3e6c75573fd55d4bcdb6ad19f8c362d59bb1d9f0 refs/heads/master
+7ac51c1af21b71e1136cc90ee7d52b4a1d0dbd0a refs/heads/multiport
+77eced39ddcc7941df83b7e15ae4a89bbef27035 refs/heads/mutex-debug
+06372e12f1a2fd763c2a8a9d465f5b80511de614 refs/heads/prometheus-static-labels
+6d5299715ebb720197f0095b8c287ff0b94928f5 refs/heads/psk
+14875480f3ae6e713a9f3b02339d0bbf16d93ecb refs/heads/psk-v2
+b55b9019a72c7320b5c6dd54d2c31ad89f1e8990 refs/heads/release-1.9
+b6c6b96c79a5c64d98fd77162c4427811e69c2e1 refs/heads/windows_udp_buffer_setting
+0867455a0b7693b8e77644bfb4bb21a253f19158 refs/heads/yaml-v3
+f9d3d521b62aa52463d008ef4e2f2133daaa0b4c refs/tags/v1.0.0
+0312a3e4408836e2a58a08171c31d7b13ae917e2 refs/tags/v1.1.0
+019d573fd023224454e7dce0d68fcf4155f77b91 refs/tags/v1.2.0
+14bd5487d818474fcd39a12b12789a6daeaa210a refs/tags/v1.3.0
+8ef4213a01084719c80a7bd3d1c04e3999ba673c refs/tags/v1.4.0
+57a32f7c15f1ea105507958aac538ae736474158 refs/tags/v1.5.0
+6f6452112c7bd441dc4bea2134a9cda3faea858a refs/tags/v1.5.2
+d2847cddd89fb1c44b3da10a84e7a9b3e2f55131 refs/tags/v1.6.0
+e6f8783d68238d851832a892ece04b0877644f4c refs/tags/v1.6.1
+2bd87e2fd9648115aae5eec6c8405dff4415bb60 refs/tags/v1.7.0
+dc15e3c8f7e27deb87260749015bcc9d80846314 refs/tags/v1.7.1
+fe5893ceb0e59a00921d412c542351af21858279 refs/tags/v1.7.2
+2b49fed0ff9829f2cddff6b9b84daa4573015ba0 refs/tags/v1.8.0
+8a6a50394fc0af13759121a33f6b822da3d7e2b0 refs/tags/v1.8.1
+0627ffad3e6db253fee4309fb2fbf6c3e6bfc138 refs/tags/v1.8.2
+2e19289b18f2617e9b89ca1017795861f79e3001 refs/tags/v1.9.0
+c9a28bc6ee349611a4946e83d51729f4656fdcd7 refs/tags/v1.9.1
+72d867cdb6bd15dccc51a64ecd5c6af545996298 refs/tags/v1.9.2
+68d6c921d3f355bce2be65450d99def28c957482 refs/tags/v1.9.3
+50504c0f3d54a87ed608587010d6358936e1587a refs/tags/v1.9.4
+a2dd225410da9c21b51df1312dc8aa0bf8358c3c refs/tags/v1.9.5
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-9b4af6c0de25ecaa195dd27c77cd176d65405b82.rev
 and 
new/nebula-1.9.5/.git/objects/pack/pack-9b4af6c0de25ecaa195dd27c77cd176d65405b82.rev
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-a9c1635eb7f7b90fd55fe1b20160b3e0364cfe3c.idx
 and 
new/nebula-1.9.5/.git/objects/pack/pack-a9c1635eb7f7b90fd55fe1b20160b3e0364cfe3c.idx
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-a9c1635eb7f7b90fd55fe1b20160b3e0364cfe3c.pack
 and 
new/nebula-1.9.5/.git/objects/pack/pack-a9c1635eb7f7b90fd55fe1b20160b3e0364cfe3c.pack
 differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nebula-1.9.4/.git/objects/pack/pack-a9c1635eb7f7b90fd55fe1b20160b3e0364cfe3c.promisor
 
new/nebula-1.9.5/.git/objects/pack/pack-a9c1635eb7f7b90fd55fe1b20160b3e0364cfe3c.promisor
--- 
old/nebula-1.9.4/.git/objects/pack/pack-a9c1635eb7f7b90fd55fe1b20160b3e0364cfe3c.promisor
   2024-09-09 20:11:44.000000000 +0200
+++ 
new/nebula-1.9.5/.git/objects/pack/pack-a9c1635eb7f7b90fd55fe1b20160b3e0364cfe3c.promisor
   1970-01-01 01:00:00.000000000 +0100
@@ -1,38 +0,0 @@
-16eaae306afe95ac9876e333fc1636c98cd999a4 HEAD
-0af7e6a1ddadd96dfe967ba49e456f2c67969b1e refs/heads/add-http-pprof
-93c5a8c994f044ec3721aaa7734f5633f4b2a923 refs/heads/cert-interface
-95049cff71c222925f5be2a5f3de88436a4491b1 
refs/heads/dependabot/go_modules/github.com/gaissmai/bart-0.12.8
-32ebcbcf2be68a9fec6b807cb1c0df0509f6060e 
refs/heads/dependabot/go_modules/github.com/miekg/dns-1.1.62
-3d22a81f39f5efddf4445a30db6dc425f65505c8 
refs/heads/dependabot/go_modules/github.com/prometheus/client_golang-1.20.3
-d5576edd43e862d89f4e75b57d9a0948b33e82c5 
refs/heads/dependabot/go_modules/github.com/vishvananda/netlink-1.3.0
-6111aa8b704c33626da6c9cd69c985ea163abdc6 refs/heads/go123
-7445823ee5d3e9ea09f59f8ea0fe6f7f2ece9208 refs/heads/holepunch-remote-allow-list
-db11e2f1af19017d21ef5912a5613d48b9db3d02 refs/heads/interface-hooks
-9c6fb08a6dd15e950731a0440691c234e4227b30 
refs/heads/make-boringcrypto-checklinkname
-16eaae306afe95ac9876e333fc1636c98cd999a4 refs/heads/master
-b445d14ddb2f356222631da38d45dc978608a9d8 refs/heads/multiport
-77eced39ddcc7941df83b7e15ae4a89bbef27035 refs/heads/mutex-debug
-06372e12f1a2fd763c2a8a9d465f5b80511de614 refs/heads/prometheus-static-labels
-6d5299715ebb720197f0095b8c287ff0b94928f5 refs/heads/psk
-b6c6b96c79a5c64d98fd77162c4427811e69c2e1 refs/heads/windows_udp_buffer_setting
-0867455a0b7693b8e77644bfb4bb21a253f19158 refs/heads/yaml-v3
-f9d3d521b62aa52463d008ef4e2f2133daaa0b4c refs/tags/v1.0.0
-0312a3e4408836e2a58a08171c31d7b13ae917e2 refs/tags/v1.1.0
-019d573fd023224454e7dce0d68fcf4155f77b91 refs/tags/v1.2.0
-14bd5487d818474fcd39a12b12789a6daeaa210a refs/tags/v1.3.0
-8ef4213a01084719c80a7bd3d1c04e3999ba673c refs/tags/v1.4.0
-57a32f7c15f1ea105507958aac538ae736474158 refs/tags/v1.5.0
-6f6452112c7bd441dc4bea2134a9cda3faea858a refs/tags/v1.5.2
-d2847cddd89fb1c44b3da10a84e7a9b3e2f55131 refs/tags/v1.6.0
-e6f8783d68238d851832a892ece04b0877644f4c refs/tags/v1.6.1
-2bd87e2fd9648115aae5eec6c8405dff4415bb60 refs/tags/v1.7.0
-dc15e3c8f7e27deb87260749015bcc9d80846314 refs/tags/v1.7.1
-fe5893ceb0e59a00921d412c542351af21858279 refs/tags/v1.7.2
-2b49fed0ff9829f2cddff6b9b84daa4573015ba0 refs/tags/v1.8.0
-8a6a50394fc0af13759121a33f6b822da3d7e2b0 refs/tags/v1.8.1
-0627ffad3e6db253fee4309fb2fbf6c3e6bfc138 refs/tags/v1.8.2
-2e19289b18f2617e9b89ca1017795861f79e3001 refs/tags/v1.9.0
-c9a28bc6ee349611a4946e83d51729f4656fdcd7 refs/tags/v1.9.1
-72d867cdb6bd15dccc51a64ecd5c6af545996298 refs/tags/v1.9.2
-68d6c921d3f355bce2be65450d99def28c957482 refs/tags/v1.9.3
-50504c0f3d54a87ed608587010d6358936e1587a refs/tags/v1.9.4
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-a9c1635eb7f7b90fd55fe1b20160b3e0364cfe3c.rev
 and 
new/nebula-1.9.5/.git/objects/pack/pack-a9c1635eb7f7b90fd55fe1b20160b3e0364cfe3c.rev
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-d604f1ece5805059d9f49c3f33f58a2a40efdc04.idx
 and 
new/nebula-1.9.5/.git/objects/pack/pack-d604f1ece5805059d9f49c3f33f58a2a40efdc04.idx
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-d604f1ece5805059d9f49c3f33f58a2a40efdc04.pack
 and 
new/nebula-1.9.5/.git/objects/pack/pack-d604f1ece5805059d9f49c3f33f58a2a40efdc04.pack
 differ
Binary files 
old/nebula-1.9.4/.git/objects/pack/pack-d604f1ece5805059d9f49c3f33f58a2a40efdc04.rev
 and 
new/nebula-1.9.5/.git/objects/pack/pack-d604f1ece5805059d9f49c3f33f58a2a40efdc04.rev
 differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/.git/packed-refs 
new/nebula-1.9.5/.git/packed-refs
--- old/nebula-1.9.4/.git/packed-refs   2024-09-09 20:11:44.000000000 +0200
+++ new/nebula-1.9.5/.git/packed-refs   2024-12-06 15:50:24.000000000 +0100
@@ -1,19 +1,23 @@
 # pack-refs with: peeled fully-peeled sorted 
 0af7e6a1ddadd96dfe967ba49e456f2c67969b1e refs/remotes/origin/add-http-pprof
-93c5a8c994f044ec3721aaa7734f5633f4b2a923 refs/remotes/origin/cert-interface
-95049cff71c222925f5be2a5f3de88436a4491b1 
refs/remotes/origin/dependabot/go_modules/github.com/gaissmai/bart-0.12.8
-32ebcbcf2be68a9fec6b807cb1c0df0509f6060e 
refs/remotes/origin/dependabot/go_modules/github.com/miekg/dns-1.1.62
-3d22a81f39f5efddf4445a30db6dc425f65505c8 
refs/remotes/origin/dependabot/go_modules/github.com/prometheus/client_golang-1.20.3
-d5576edd43e862d89f4e75b57d9a0948b33e82c5 
refs/remotes/origin/dependabot/go_modules/github.com/vishvananda/netlink-1.3.0
+21a117a156ead37d8ef1f1484e820167e7162dd9 refs/remotes/origin/cert-v2
+006479fd15e4bc01c3c17dad3b31c32fd0202351 
refs/remotes/origin/dependabot/go_modules/github.com/gaissmai/bart-0.13.3
+52e752f4a9277c81e483e327b1094f737158f39b 
refs/remotes/origin/dependabot/go_modules/github.com/prometheus/client_golang-1.20.5
+9bd66a5506158d694c63e026f6a08246074435ea 
refs/remotes/origin/dependabot/go_modules/github.com/stretchr/testify-1.10.0
+a78d07997056def51b33ecc781318ea1f043a50a 
refs/remotes/origin/dependabot/go_modules/golang-x-dependencies-687dc3a1d5
+c87dfd309494084dab560067ff47d852fa3bff06 
refs/remotes/origin/dependabot/go_modules/protobuf-dependencies-2ffac51044
 6111aa8b704c33626da6c9cd69c985ea163abdc6 refs/remotes/origin/go123
-7445823ee5d3e9ea09f59f8ea0fe6f7f2ece9208 
refs/remotes/origin/holepunch-remote-allow-list
+7a36dd057bbf8f3b6e9b3849bc9ca1365a2fb3c5 
refs/remotes/origin/holepunch-remote-allow-list
+5c6ac0710f53f045e351cf642df412179b33db7a refs/remotes/origin/hostmap-split
 db11e2f1af19017d21ef5912a5613d48b9db3d02 refs/remotes/origin/interface-hooks
 9c6fb08a6dd15e950731a0440691c234e4227b30 
refs/remotes/origin/make-boringcrypto-checklinkname
-16eaae306afe95ac9876e333fc1636c98cd999a4 refs/remotes/origin/master
-b445d14ddb2f356222631da38d45dc978608a9d8 refs/remotes/origin/multiport
+3e6c75573fd55d4bcdb6ad19f8c362d59bb1d9f0 refs/remotes/origin/master
+7ac51c1af21b71e1136cc90ee7d52b4a1d0dbd0a refs/remotes/origin/multiport
 77eced39ddcc7941df83b7e15ae4a89bbef27035 refs/remotes/origin/mutex-debug
 06372e12f1a2fd763c2a8a9d465f5b80511de614 
refs/remotes/origin/prometheus-static-labels
 6d5299715ebb720197f0095b8c287ff0b94928f5 refs/remotes/origin/psk
+14875480f3ae6e713a9f3b02339d0bbf16d93ecb refs/remotes/origin/psk-v2
+b55b9019a72c7320b5c6dd54d2c31ad89f1e8990 refs/remotes/origin/release-1.9
 b6c6b96c79a5c64d98fd77162c4427811e69c2e1 
refs/remotes/origin/windows_udp_buffer_setting
 0867455a0b7693b8e77644bfb4bb21a253f19158 refs/remotes/origin/yaml-v3
 f9d3d521b62aa52463d008ef4e2f2133daaa0b4c refs/tags/v1.0.0
@@ -55,3 +59,5 @@
 ^b14bad586ac4eb922fe11c1a4f360e223bd8dc8b
 50504c0f3d54a87ed608587010d6358936e1587a refs/tags/v1.9.4
 ^ab81b62ea05814f3eebc0ad545aabcc8b704052b
+a2dd225410da9c21b51df1312dc8aa0bf8358c3c refs/tags/v1.9.5
+^b55b9019a72c7320b5c6dd54d2c31ad89f1e8990
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/.git/refs/heads/master 
new/nebula-1.9.5/.git/refs/heads/master
--- old/nebula-1.9.4/.git/refs/heads/master     2024-09-09 20:11:44.000000000 
+0200
+++ new/nebula-1.9.5/.git/refs/heads/master     2024-12-06 15:50:24.000000000 
+0100
@@ -1 +1 @@
-16eaae306afe95ac9876e333fc1636c98cd999a4
+3e6c75573fd55d4bcdb6ad19f8c362d59bb1d9f0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/CHANGELOG.md 
new/nebula-1.9.5/CHANGELOG.md
--- old/nebula-1.9.4/CHANGELOG.md       2024-09-09 20:11:44.000000000 +0200
+++ new/nebula-1.9.5/CHANGELOG.md       2024-12-06 15:50:24.000000000 +0100
@@ -7,6 +7,16 @@
 
 ## [Unreleased]
 
+## [1.9.5] - 2024-12-05
+
+### Added
+
+- Gracefully ignore v2 certificates. (#1282)
+
+### Fixed
+
+- Fix relays that refuse to re-establish after one of the remote tunnel pairs 
breaks. (#1277)
+
 ## [1.9.4] - 2024-09-09
 
 ### Added
@@ -664,7 +674,8 @@
 
 - Initial public release.
 
-[Unreleased]: https://github.com/slackhq/nebula/compare/v1.9.4...HEAD
+[Unreleased]: https://github.com/slackhq/nebula/compare/v1.9.5...HEAD
+[1.9.5]: https://github.com/slackhq/nebula/releases/tag/v1.9.5
 [1.9.4]: https://github.com/slackhq/nebula/releases/tag/v1.9.4
 [1.9.3]: https://github.com/slackhq/nebula/releases/tag/v1.9.3
 [1.9.2]: https://github.com/slackhq/nebula/releases/tag/v1.9.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/cert/ca.go new/nebula-1.9.5/cert/ca.go
--- old/nebula-1.9.4/cert/ca.go 2024-09-09 20:11:44.000000000 +0200
+++ new/nebula-1.9.5/cert/ca.go 2024-12-06 15:50:24.000000000 +0100
@@ -24,31 +24,39 @@
 
 // NewCAPoolFromBytes will create a new CA pool from the provided
 // input bytes, which must be a PEM-encoded set of nebula certificates.
+// If the pool contains unsupported certificates, they will generate warnings
+// in the []error return arg.
 // If the pool contains any expired certificates, an ErrExpired will be
 // returned along with the pool. The caller must handle any such errors.
-func NewCAPoolFromBytes(caPEMs []byte) (*NebulaCAPool, error) {
+func NewCAPoolFromBytes(caPEMs []byte) (*NebulaCAPool, []error, error) {
        pool := NewCAPool()
        var err error
-       var expired bool
+       var warnings []error
+       good := 0
+
        for {
                caPEMs, err = pool.AddCACertificate(caPEMs)
                if errors.Is(err, ErrExpired) {
-                       expired = true
-                       err = nil
-               }
-               if err != nil {
-                       return nil, err
+                       warnings = append(warnings, err)
+               } else if errors.Is(err, ErrInvalidPEMCertificateUnsupported) {
+                       warnings = append(warnings, err)
+               } else if err != nil {
+                       return nil, warnings, err
+               } else {
+                       // Only consider a good certificate if there were no 
errors present
+                       good++
                }
+
                if len(caPEMs) == 0 || strings.TrimSpace(string(caPEMs)) == "" {
                        break
                }
        }
 
-       if expired {
-               return pool, ErrExpired
+       if good == 0 {
+               return nil, warnings, errors.New("no valid CA certificates 
present")
        }
 
-       return pool, nil
+       return pool, warnings, nil
 }
 
 // AddCACertificate verifies a Nebula CA certificate and adds it to the pool
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/cert/cert.go 
new/nebula-1.9.5/cert/cert.go
--- old/nebula-1.9.4/cert/cert.go       2024-09-09 20:11:44.000000000 +0200
+++ new/nebula-1.9.5/cert/cert.go       2024-12-06 15:50:24.000000000 +0100
@@ -28,6 +28,7 @@
 
 const (
        CertBanner                       = "NEBULA CERTIFICATE"
+       CertificateV2Banner              = "NEBULA CERTIFICATE V2"
        X25519PrivateKeyBanner           = "NEBULA X25519 PRIVATE KEY"
        X25519PublicKeyBanner            = "NEBULA X25519 PUBLIC KEY"
        EncryptedEd25519PrivateKeyBanner = "NEBULA ED25519 ENCRYPTED PRIVATE 
KEY"
@@ -163,6 +164,9 @@
        if p == nil {
                return nil, r, fmt.Errorf("input did not contain a valid PEM 
encoded block")
        }
+       if p.Type == CertificateV2Banner {
+               return nil, r, fmt.Errorf("%w: %s", 
ErrInvalidPEMCertificateUnsupported, p.Type)
+       }
        if p.Type != CertBanner {
                return nil, r, fmt.Errorf("bytes did not contain a proper 
nebula certificate banner")
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/cert/cert_test.go 
new/nebula-1.9.5/cert/cert_test.go
--- old/nebula-1.9.4/cert/cert_test.go  2024-09-09 20:11:44.000000000 +0200
+++ new/nebula-1.9.5/cert/cert_test.go  2024-12-06 15:50:24.000000000 +0100
@@ -5,6 +5,7 @@
        "crypto/ecdsa"
        "crypto/elliptic"
        "crypto/rand"
+       "errors"
        "fmt"
        "io"
        "net"
@@ -574,6 +575,13 @@
 -----END NEBULA CERTIFICATE-----
 `
 
+       v2 := `
+# valid PEM with the V2 header
+-----BEGIN NEBULA CERTIFICATE V2-----
+CmYKEG5lYnVsYSBQMjU2IHRlc3Qo4s+7mgYw4tXrsAc6QQRkaW2jFmllYvN4+/k2
+-----END NEBULA CERTIFICATE V2-----
+`
+
        rootCA := NebulaCertificate{
                Details: NebulaCertificateDetails{
                        Name: "nebula root ca",
@@ -592,33 +600,46 @@
                },
        }
 
-       p, err := NewCAPoolFromBytes([]byte(noNewLines))
+       p, warn, err := NewCAPoolFromBytes([]byte(noNewLines))
        assert.Nil(t, err)
+       assert.Nil(t, warn)
        assert.Equal(t, 
p.CAs[string("c9bfaf7ce8e84b2eeda2e27b469f4b9617bde192efd214b68891ecda6ed49522")].Details.Name,
 rootCA.Details.Name)
        assert.Equal(t, 
p.CAs[string("5c9c3f23e7ee7fe97637cbd3a0a5b854154d1d9aaaf7b566a51f4a88f76b64cd")].Details.Name,
 rootCA01.Details.Name)
 
-       pp, err := NewCAPoolFromBytes([]byte(withNewLines))
+       pp, warn, err := NewCAPoolFromBytes([]byte(withNewLines))
        assert.Nil(t, err)
+       assert.Nil(t, warn)
        assert.Equal(t, 
pp.CAs[string("c9bfaf7ce8e84b2eeda2e27b469f4b9617bde192efd214b68891ecda6ed49522")].Details.Name,
 rootCA.Details.Name)
        assert.Equal(t, 
pp.CAs[string("5c9c3f23e7ee7fe97637cbd3a0a5b854154d1d9aaaf7b566a51f4a88f76b64cd")].Details.Name,
 rootCA01.Details.Name)
 
        // expired cert, no valid certs
-       ppp, err := NewCAPoolFromBytes([]byte(expired))
-       assert.Equal(t, ErrExpired, err)
-       assert.Equal(t, 
ppp.CAs[string("152070be6bb19bc9e3bde4c2f0e7d8f4ff5448b4c9856b8eccb314fade0229b0")].Details.Name,
 "expired")
+       ppp, warn, err := NewCAPoolFromBytes([]byte(expired))
+       assert.Error(t, err, "no valid CA certificates present")
+       assert.Len(t, warn, 1)
+       assert.Error(t, warn[0], ErrExpired)
+       assert.Nil(t, ppp)
 
        // expired cert, with valid certs
-       pppp, err := NewCAPoolFromBytes(append([]byte(expired), noNewLines...))
-       assert.Equal(t, ErrExpired, err)
+       pppp, warn, err := NewCAPoolFromBytes(append([]byte(expired), 
noNewLines...))
+       assert.Len(t, warn, 1)
+       assert.Nil(t, err)
+       assert.Error(t, warn[0], ErrExpired)
        assert.Equal(t, 
pppp.CAs[string("c9bfaf7ce8e84b2eeda2e27b469f4b9617bde192efd214b68891ecda6ed49522")].Details.Name,
 rootCA.Details.Name)
        assert.Equal(t, 
pppp.CAs[string("5c9c3f23e7ee7fe97637cbd3a0a5b854154d1d9aaaf7b566a51f4a88f76b64cd")].Details.Name,
 rootCA01.Details.Name)
        assert.Equal(t, 
pppp.CAs[string("152070be6bb19bc9e3bde4c2f0e7d8f4ff5448b4c9856b8eccb314fade0229b0")].Details.Name,
 "expired")
        assert.Equal(t, len(pppp.CAs), 3)
 
-       ppppp, err := NewCAPoolFromBytes([]byte(p256))
+       ppppp, warn, err := NewCAPoolFromBytes([]byte(p256))
        assert.Nil(t, err)
+       assert.Nil(t, warn)
        assert.Equal(t, 
ppppp.CAs[string("a7938893ec8c4ef769b06d7f425e5e46f7a7f5ffa49c3bcf4a86b608caba9159")].Details.Name,
 rootCAP256.Details.Name)
        assert.Equal(t, len(ppppp.CAs), 1)
+
+       pppppp, warn, err := NewCAPoolFromBytes(append([]byte(p256), 
[]byte(v2)...))
+       assert.Nil(t, err)
+       assert.True(t, errors.Is(warn[0], ErrInvalidPEMCertificateUnsupported))
+       assert.Equal(t, 
pppppp.CAs[string("a7938893ec8c4ef769b06d7f425e5e46f7a7f5ffa49c3bcf4a86b608caba9159")].Details.Name,
 rootCAP256.Details.Name)
+       assert.Equal(t, len(pppppp.CAs), 1)
 }
 
 func appendByteSlices(b ...[]byte) []byte {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/cert/errors.go 
new/nebula-1.9.5/cert/errors.go
--- old/nebula-1.9.4/cert/errors.go     2024-09-09 20:11:44.000000000 +0200
+++ new/nebula-1.9.5/cert/errors.go     2024-12-06 15:50:24.000000000 +0100
@@ -5,10 +5,11 @@
 )
 
 var (
-       ErrRootExpired       = errors.New("root certificate is expired")
-       ErrExpired           = errors.New("certificate is expired")
-       ErrNotCA             = errors.New("certificate is not a CA")
-       ErrNotSelfSigned     = errors.New("certificate is not self-signed")
-       ErrBlockListed       = errors.New("certificate is in the block list")
-       ErrSignatureMismatch = errors.New("certificate signature did not match")
+       ErrRootExpired                      = errors.New("root certificate is 
expired")
+       ErrExpired                          = errors.New("certificate is 
expired")
+       ErrNotCA                            = errors.New("certificate is not a 
CA")
+       ErrNotSelfSigned                    = errors.New("certificate is not 
self-signed")
+       ErrBlockListed                      = errors.New("certificate is in the 
block list")
+       ErrSignatureMismatch                = errors.New("certificate signature 
did not match")
+       ErrInvalidPEMCertificateUnsupported = errors.New("bytes contain an 
unsupported certificate format")
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/e2e/handshakes_test.go 
new/nebula-1.9.5/e2e/handshakes_test.go
--- old/nebula-1.9.4/e2e/handshakes_test.go     2024-09-09 20:11:44.000000000 
+0200
+++ new/nebula-1.9.5/e2e/handshakes_test.go     2024-12-06 15:50:24.000000000 
+0100
@@ -6,9 +6,12 @@
 import (
        "fmt"
        "net/netip"
+       "slices"
        "testing"
        "time"
 
+       "github.com/google/gopacket"
+       "github.com/google/gopacket/layers"
        "github.com/sirupsen/logrus"
        "github.com/slackhq/nebula"
        "github.com/slackhq/nebula/e2e/router"
@@ -369,6 +372,137 @@
        //TODO: assert we actually used the relay even though it should be 
impossible for a tunnel to have occurred without it
 }
 
+func TestReestablishRelays(t *testing.T) {
+       ca, _, caKey, _ := NewTestCaCert(time.Now(), 
time.Now().Add(10*time.Minute), nil, nil, []string{})
+       myControl, myVpnIpNet, _, _ := newSimpleServer(ca, caKey, "me     ", 
"10.128.0.1/24", m{"relay": m{"use_relays": true}})
+       relayControl, relayVpnIpNet, relayUdpAddr, _ := newSimpleServer(ca, 
caKey, "relay  ", "10.128.0.128/24", m{"relay": m{"am_relay": true}})
+       theirControl, theirVpnIpNet, theirUdpAddr, _ := newSimpleServer(ca, 
caKey, "them   ", "10.128.0.2/24", m{"relay": m{"use_relays": true}})
+
+       // Teach my how to get to the relay and that their can be reached via 
the relay
+       myControl.InjectLightHouseAddr(relayVpnIpNet.Addr(), relayUdpAddr)
+       myControl.InjectRelays(theirVpnIpNet.Addr(), 
[]netip.Addr{relayVpnIpNet.Addr()})
+       relayControl.InjectLightHouseAddr(theirVpnIpNet.Addr(), theirUdpAddr)
+
+       // Build a router so we don't have to reason who gets which packet
+       r := router.NewR(t, myControl, relayControl, theirControl)
+       defer r.RenderFlow()
+
+       // Start the servers
+       myControl.Start()
+       relayControl.Start()
+       theirControl.Start()
+
+       t.Log("Trigger a handshake from me to them via the relay")
+       myControl.InjectTunUDPPacket(theirVpnIpNet.Addr(), 80, 80, []byte("Hi 
from me"))
+
+       p := r.RouteForAllUntilTxTun(theirControl)
+       r.Log("Assert the tunnel works")
+       assertUdpPacket(t, []byte("Hi from me"), p, myVpnIpNet.Addr(), 
theirVpnIpNet.Addr(), 80, 80)
+
+       t.Log("Ensure packet traversal from them to me via the relay")
+       theirControl.InjectTunUDPPacket(myVpnIpNet.Addr(), 80, 80, []byte("Hi 
from them"))
+
+       p = r.RouteForAllUntilTxTun(myControl)
+       r.Log("Assert the tunnel works")
+       assertUdpPacket(t, []byte("Hi from them"), p, theirVpnIpNet.Addr(), 
myVpnIpNet.Addr(), 80, 80)
+
+       // If we break the relay's connection to 'them', 'me' needs to detect 
and recover the connection
+       r.Log("Close the tunnel")
+       relayControl.CloseTunnel(theirVpnIpNet.Addr(), true)
+
+       start := len(myControl.GetHostmap().Indexes)
+       curIndexes := len(myControl.GetHostmap().Indexes)
+       for curIndexes >= start {
+               curIndexes = len(myControl.GetHostmap().Indexes)
+               r.Logf("Wait for the dead index to go away:start=%v indexes, 
currnet=%v indexes", start, curIndexes)
+               myControl.InjectTunUDPPacket(theirVpnIpNet.Addr(), 80, 80, 
[]byte("Hi from me should fail"))
+
+               r.RouteForAllExitFunc(func(p *udp.Packet, c *nebula.Control) 
router.ExitType {
+                       return router.RouteAndExit
+               })
+               time.Sleep(2 * time.Second)
+       }
+       r.Log("Dead index went away. Woot!")
+       r.RenderHostmaps("Me removed hostinfo", myControl, relayControl, 
theirControl)
+       // Next packet should re-establish a relayed connection and work just 
great.
+
+       t.Logf("Assert the tunnel...")
+       for {
+               t.Log("RouteForAllUntilTxTun")
+               myControl.InjectLightHouseAddr(relayVpnIpNet.Addr(), 
relayUdpAddr)
+               myControl.InjectRelays(theirVpnIpNet.Addr(), 
[]netip.Addr{relayVpnIpNet.Addr()})
+               relayControl.InjectLightHouseAddr(theirVpnIpNet.Addr(), 
theirUdpAddr)
+               myControl.InjectTunUDPPacket(theirVpnIpNet.Addr(), 80, 80, 
[]byte("Hi from me"))
+
+               p = r.RouteForAllUntilTxTun(theirControl)
+               r.Log("Assert the tunnel works")
+               packet := gopacket.NewPacket(p, layers.LayerTypeIPv4, 
gopacket.Lazy)
+               v4 := packet.Layer(layers.LayerTypeIPv4).(*layers.IPv4)
+               if slices.Compare(v4.SrcIP, myVpnIpNet.Addr().AsSlice()) != 0 {
+                       t.Logf("SrcIP is unexpected...this is not the packet 
I'm looking for. Keep looking")
+                       continue
+               }
+               if slices.Compare(v4.DstIP, theirVpnIpNet.Addr().AsSlice()) != 
0 {
+                       t.Logf("DstIP is unexpected...this is not the packet 
I'm looking for. Keep looking")
+                       continue
+               }
+
+               udp := packet.Layer(layers.LayerTypeUDP).(*layers.UDP)
+               if udp == nil {
+                       t.Log("Not a UDP packet. This is not the packet I'm 
looking for. Keep looking")
+                       continue
+               }
+               data := packet.ApplicationLayer()
+               if data == nil {
+                       t.Log("No data found in packet. This is not the packet 
I'm looking for. Keep looking.")
+                       continue
+               }
+               if string(data.Payload()) != "Hi from me" {
+                       t.Logf("Unexpected payload: '%v', keep looking", 
string(data.Payload()))
+                       continue
+               }
+               t.Log("I found my lost packet. I am so happy.")
+               break
+       }
+       t.Log("Assert the tunnel works the other way, too")
+       for {
+               t.Log("RouteForAllUntilTxTun")
+               theirControl.InjectTunUDPPacket(myVpnIpNet.Addr(), 80, 80, 
[]byte("Hi from them"))
+
+               p = r.RouteForAllUntilTxTun(myControl)
+               r.Log("Assert the tunnel works")
+               packet := gopacket.NewPacket(p, layers.LayerTypeIPv4, 
gopacket.Lazy)
+               v4 := packet.Layer(layers.LayerTypeIPv4).(*layers.IPv4)
+               if slices.Compare(v4.DstIP, myVpnIpNet.Addr().AsSlice()) != 0 {
+                       t.Logf("Dst is unexpected...this is not the packet I'm 
looking for. Keep looking")
+                       continue
+               }
+               if slices.Compare(v4.SrcIP, theirVpnIpNet.Addr().AsSlice()) != 
0 {
+                       t.Logf("SrcIP is unexpected...this is not the packet 
I'm looking for. Keep looking")
+                       continue
+               }
+
+               udp := packet.Layer(layers.LayerTypeUDP).(*layers.UDP)
+               if udp == nil {
+                       t.Log("Not a UDP packet. This is not the packet I'm 
looking for. Keep looking")
+                       continue
+               }
+               data := packet.ApplicationLayer()
+               if data == nil {
+                       t.Log("No data found in packet. This is not the packet 
I'm looking for. Keep looking.")
+                       continue
+               }
+               if string(data.Payload()) != "Hi from them" {
+                       t.Logf("Unexpected payload: '%v', keep looking", 
string(data.Payload()))
+                       continue
+               }
+               t.Log("I found my lost packet. I am so happy.")
+               break
+       }
+       r.RenderHostmaps("Final hostmaps", myControl, relayControl, 
theirControl)
+
+}
+
 func TestStage1RaceRelays(t *testing.T) {
        //NOTE: this is a race between me and relay resulting in a full tunnel 
from me to them via relay
        ca, _, caKey, _ := NewTestCaCert(time.Now(), 
time.Now().Add(10*time.Minute), nil, nil, []string{})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/handshake_ix.go 
new/nebula-1.9.5/handshake_ix.go
--- old/nebula-1.9.4/handshake_ix.go    2024-09-09 20:11:44.000000000 +0200
+++ new/nebula-1.9.5/handshake_ix.go    2024-12-06 15:50:24.000000000 +0100
@@ -322,6 +322,9 @@
                        return
                }
                hostinfo.relayState.InsertRelayTo(via.relayHI.vpnIp)
+               // I successfully received a handshake. Just in case I marked 
this tunnel as 'Disestablished', ensure
+               // it's correctly marked as working.
+               via.relayHI.relayState.UpdateRelayForByIdxState(via.remoteIdx, 
Established)
                f.SendVia(via.relayHI, via.relay, msg, make([]byte, 12), 
make([]byte, mtu), false)
                f.l.WithField("vpnIp", vpnIp).WithField("relay", 
via.relayHI.vpnIp).
                        WithField("certName", certName).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/handshake_manager.go 
new/nebula-1.9.5/handshake_manager.go
--- old/nebula-1.9.4/handshake_manager.go       2024-09-09 20:11:44.000000000 
+0200
+++ new/nebula-1.9.5/handshake_manager.go       2024-12-06 15:50:24.000000000 
+0100
@@ -278,48 +278,8 @@
                                continue
                        }
                        // Check the relay HostInfo to see if we already 
established a relay through it
-                       if existingRelay, ok := 
relayHostInfo.relayState.QueryRelayForByIp(vpnIp); ok {
-                               switch existingRelay.State {
-                               case Established:
-                                       
hostinfo.logger(hm.l).WithField("relay", relay.String()).Info("Send handshake 
via relay")
-                                       hm.f.SendVia(relayHostInfo, 
existingRelay, hostinfo.HandshakePacket[0], make([]byte, 12), make([]byte, 
mtu), false)
-                               case Requested:
-                                       
hostinfo.logger(hm.l).WithField("relay", relay.String()).Info("Re-send 
CreateRelay request")
-
-                                       //TODO: IPV6-WORK
-                                       myVpnIpB := hm.f.myVpnNet.Addr().As4()
-                                       theirVpnIpB := vpnIp.As4()
-
-                                       // Re-send the CreateRelay request, in 
case the previous one was lost.
-                                       m := NebulaControl{
-                                               Type:                
NebulaControl_CreateRelayRequest,
-                                               InitiatorRelayIndex: 
existingRelay.LocalIndex,
-                                               RelayFromIp:         
binary.BigEndian.Uint32(myVpnIpB[:]),
-                                               RelayToIp:           
binary.BigEndian.Uint32(theirVpnIpB[:]),
-                                       }
-                                       msg, err := m.Marshal()
-                                       if err != nil {
-                                               hostinfo.logger(hm.l).
-                                                       WithError(err).
-                                                       Error("Failed to 
marshal Control message to create relay")
-                                       } else {
-                                               // This must send over the 
hostinfo, not over hm.Hosts[ip]
-                                               
hm.f.SendMessageToHostInfo(header.Control, 0, relayHostInfo, msg, make([]byte, 
12), make([]byte, mtu))
-                                               hm.l.WithFields(logrus.Fields{
-                                                       "relayFrom":           
hm.f.myVpnNet.Addr(),
-                                                       "relayTo":             
vpnIp,
-                                                       "initiatorRelayIndex": 
existingRelay.LocalIndex,
-                                                       "relay":               
relay}).
-                                                       Info("send 
CreateRelayRequest")
-                                       }
-                               default:
-                                       hostinfo.logger(hm.l).
-                                               WithField("vpnIp", vpnIp).
-                                               WithField("state", 
existingRelay.State).
-                                               WithField("relay", 
relayHostInfo.vpnIp).
-                                               Errorf("Relay unexpected state")
-                               }
-                       } else {
+                       existingRelay, ok := 
relayHostInfo.relayState.QueryRelayForByIp(vpnIp)
+                       if !ok {
                                // No relays exist or requested yet.
                                if relayHostInfo.remote.IsValid() {
                                        idx, err := AddRelay(hm.l, 
relayHostInfo, hm.mainHostMap, vpnIp, nil, TerminalType, Requested)
@@ -352,6 +312,52 @@
                                                        Info("send 
CreateRelayRequest")
                                        }
                                }
+                               continue
+                       }
+                       switch existingRelay.State {
+                       case Established:
+                               hostinfo.logger(hm.l).WithField("relay", 
relay.String()).Info("Send handshake via relay")
+                               hm.f.SendVia(relayHostInfo, existingRelay, 
hostinfo.HandshakePacket[0], make([]byte, 12), make([]byte, mtu), false)
+                       case Disestablished:
+                               // Mark this relay as 'requested'
+                               
relayHostInfo.relayState.UpdateRelayForByIpState(vpnIp, Requested)
+                               fallthrough
+                       case Requested:
+                               hostinfo.logger(hm.l).WithField("relay", 
relay.String()).Info("Re-send CreateRelay request")
+                               // Re-send the CreateRelay request, in case the 
previous one was lost.
+                               relayFrom := hm.f.myVpnNet.Addr().As4()
+                               relayTo := vpnIp.As4()
+                               m := NebulaControl{
+                                       Type:                
NebulaControl_CreateRelayRequest,
+                                       InitiatorRelayIndex: 
existingRelay.LocalIndex,
+                                       RelayFromIp:         
binary.BigEndian.Uint32(relayFrom[:]),
+                                       RelayToIp:           
binary.BigEndian.Uint32(relayTo[:]),
+                               }
+
+                               msg, err := m.Marshal()
+                               if err != nil {
+                                       hostinfo.logger(hm.l).
+                                               WithError(err).
+                                               Error("Failed to marshal 
Control message to create relay")
+                               } else {
+                                       // This must send over the hostinfo, 
not over hm.Hosts[ip]
+                                       
hm.f.SendMessageToHostInfo(header.Control, 0, relayHostInfo, msg, make([]byte, 
12), make([]byte, mtu))
+                                       hm.l.WithFields(logrus.Fields{
+                                               "relayFrom":           
hm.f.myVpnNet,
+                                               "relayTo":             vpnIp,
+                                               "initiatorRelayIndex": 
existingRelay.LocalIndex,
+                                               "relay":               relay}).
+                                               Info("send CreateRelayRequest")
+                               }
+                       case PeerRequested:
+                               // PeerRequested only occurs in Forwarding 
relays, not Terminal relays, and this is a Terminal relay case.
+                               fallthrough
+                       default:
+                               hostinfo.logger(hm.l).
+                                       WithField("vpnIp", vpnIp).
+                                       WithField("state", existingRelay.State).
+                                       WithField("relay", relay).
+                                       Errorf("Relay unexpected state")
                        }
                }
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/hostmap.go new/nebula-1.9.5/hostmap.go
--- old/nebula-1.9.4/hostmap.go 2024-09-09 20:11:44.000000000 +0200
+++ new/nebula-1.9.5/hostmap.go 2024-12-06 15:50:24.000000000 +0100
@@ -35,6 +35,7 @@
        Requested = iota
        PeerRequested
        Established
+       Disestablished
 )
 
 const (
@@ -79,6 +80,28 @@
        delete(rs.relays, ip)
 }
 
+func (rs *RelayState) UpdateRelayForByIpState(vpnIp netip.Addr, state int) {
+       rs.Lock()
+       defer rs.Unlock()
+       if r, ok := rs.relayForByIp[vpnIp]; ok {
+               newRelay := *r
+               newRelay.State = state
+               rs.relayForByIp[newRelay.PeerIp] = &newRelay
+               rs.relayForByIdx[newRelay.LocalIndex] = &newRelay
+       }
+}
+
+func (rs *RelayState) UpdateRelayForByIdxState(idx uint32, state int) {
+       rs.Lock()
+       defer rs.Unlock()
+       if r, ok := rs.relayForByIdx[idx]; ok {
+               newRelay := *r
+               newRelay.State = state
+               rs.relayForByIp[newRelay.PeerIp] = &newRelay
+               rs.relayForByIdx[newRelay.LocalIndex] = &newRelay
+       }
+}
+
 func (rs *RelayState) CopyAllRelayFor() []*Relay {
        rs.RLock()
        defer rs.RUnlock()
@@ -361,6 +384,7 @@
 
 func (hm *HostMap) unlockedDeleteHostInfo(hostinfo *HostInfo) {
        primary, ok := hm.Hosts[hostinfo.vpnIp]
+       isLastHostinfo := hostinfo.next == nil && hostinfo.prev == nil
        if ok && primary == hostinfo {
                // The vpnIp pointer points to the same hostinfo as the local 
index id, we can remove it
                delete(hm.Hosts, hostinfo.vpnIp)
@@ -410,6 +434,12 @@
                        Debug("Hostmap hostInfo deleted")
        }
 
+       if isLastHostinfo {
+               // I have lost connectivity to my peers. My relay tunnel is 
likely broken. Mark the next
+               // hops as 'Disestablished' so that new relay tunnels are 
created in the future.
+               hm.unlockedDisestablishVpnAddrRelayFor(hostinfo)
+       }
+       // Clean up any local relay indexes for which I am acting as a relay hop
        for _, localRelayIdx := range hostinfo.relayState.CopyRelayForIdxs() {
                delete(hm.Relays, localRelayIdx)
        }
@@ -470,6 +500,27 @@
        return nil, nil, errors.New("unable to find host with relay")
 }
 
+func (hm *HostMap) unlockedDisestablishVpnAddrRelayFor(hi *HostInfo) {
+       for _, relayHostIp := range hi.relayState.CopyRelayIps() {
+               if h, ok := hm.Hosts[relayHostIp]; ok {
+                       for h != nil {
+                               h.relayState.UpdateRelayForByIpState(hi.vpnIp, 
Disestablished)
+                               h = h.next
+                       }
+               }
+       }
+       for _, rs := range hi.relayState.CopyAllRelayFor() {
+               if rs.Type == ForwardingType {
+                       if h, ok := hm.Hosts[rs.PeerIp]; ok {
+                               for h != nil {
+                                       
h.relayState.UpdateRelayForByIpState(hi.vpnIp, Disestablished)
+                                       h = h.next
+                               }
+                       }
+               }
+       }
+}
+
 func (hm *HostMap) queryVpnIp(vpnIp netip.Addr, promoteIfce *Interface) 
*HostInfo {
        hm.RLock()
        if h, ok := hm.Hosts[vpnIp]; ok {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/pki.go new/nebula-1.9.5/pki.go
--- old/nebula-1.9.4/pki.go     2024-09-09 20:11:44.000000000 +0200
+++ new/nebula-1.9.5/pki.go     2024-12-06 15:50:24.000000000 +0100
@@ -223,22 +223,13 @@
                }
        }
 
-       caPool, err := cert.NewCAPoolFromBytes(rawCA)
-       if errors.Is(err, cert.ErrExpired) {
-               var expired int
-               for _, crt := range caPool.CAs {
-                       if crt.Expired(time.Now()) {
-                               expired++
-                               l.WithField("cert", crt).Warn("expired 
certificate present in CA pool")
-                       }
-               }
-
-               if expired >= len(caPool.CAs) {
-                       return nil, errors.New("no valid CA certificates 
present")
-               }
+       caPool, warnings, err := cert.NewCAPoolFromBytes(rawCA)
+       for _, w := range warnings {
+               l.WithError(w).Warn("parsing a CA certificate failed")
+       }
 
-       } else if err != nil {
-               return nil, fmt.Errorf("error while adding CA certificate to CA 
trust store: %s", err)
+       if err != nil {
+               return nil, fmt.Errorf("could not create CA certificate pool: 
%s", err)
        }
 
        for _, fp := range c.GetStringSlice("pki.blocklist", []string{}) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nebula-1.9.4/relay_manager.go 
new/nebula-1.9.5/relay_manager.go
--- old/nebula-1.9.4/relay_manager.go   2024-09-09 20:11:44.000000000 +0200
+++ new/nebula-1.9.5/relay_manager.go   2024-12-06 15:50:24.000000000 +0100
@@ -146,10 +146,14 @@
                rm.l.WithField("relayTo", peerHostInfo.vpnIp).Error("peerRelay 
does not have Relay state for relayTo")
                return
        }
-       if peerRelay.State == PeerRequested {
+       switch peerRelay.State {
+       case Requested:
+               // I initiated the request to this peer, but haven't heard back 
from the peer yet. I must wait for this peer
+               // to respond to complete the connection.
+       case PeerRequested, Disestablished, Established:
+               peerHostInfo.relayState.UpdateRelayForByIpState(targetAddr, 
Established)
                //TODO: IPV6-WORK
                b = peerHostInfo.vpnIp.As4()
-               peerRelay.State = Established
                resp := NebulaControl{
                        Type:                NebulaControl_CreateRelayResponse,
                        ResponderRelayIndex: peerRelay.LocalIndex,
@@ -215,6 +219,21 @@
                                                "existingRemoteIndex": 
existingRelay.RemoteIndex}).Error("Existing relay mismatch with 
CreateRelayRequest")
                                        return
                                }
+                       case Disestablished:
+                               if existingRelay.RemoteIndex != 
m.InitiatorRelayIndex {
+                                       // We got a brand new Relay request, 
because its index is different than what we saw before.
+                                       // This should never happen. The peer 
should never change an index, once created.
+                                       logMsg.WithFields(logrus.Fields{
+                                               "existingRemoteIndex": 
existingRelay.RemoteIndex}).Error("Existing relay mismatch with 
CreateRelayRequest")
+                                       return
+                               }
+                               // Mark the relay as 'Established' because it's 
safe to use again
+                               h.relayState.UpdateRelayForByIpState(from, 
Established)
+                       case PeerRequested:
+                               // I should never be in this state, because I 
am terminal, not forwarding.
+                               logMsg.WithFields(logrus.Fields{
+                                       "existingRemoteIndex": 
existingRelay.RemoteIndex,
+                                       "state":               
existingRelay.State}).Error("Unexpected Relay State found")
                        }
                } else {
                        _, err := AddRelay(rm.l, h, f.hostMap, from, 
&m.InitiatorRelayIndex, TerminalType, Established)
@@ -226,7 +245,7 @@
 
                relay, ok := h.relayState.QueryRelayForByIp(from)
                if !ok {
-                       logMsg.Error("Relay State not found")
+                       logMsg.WithField("from", from).Error("Relay State not 
found")
                        return
                }
 
@@ -273,103 +292,52 @@
                        // Only create relays to peers for whom I have a direct 
connection
                        return
                }
-               sendCreateRequest := false
                var index uint32
                var err error
                targetRelay, ok := peer.relayState.QueryRelayForByIp(from)
                if ok {
                        index = targetRelay.LocalIndex
-                       if targetRelay.State == Requested {
-                               sendCreateRequest = true
-                       }
                } else {
                        // Allocate an index in the hostMap for this relay peer
                        index, err = AddRelay(rm.l, peer, f.hostMap, from, nil, 
ForwardingType, Requested)
                        if err != nil {
                                return
                        }
-                       sendCreateRequest = true
                }
-               if sendCreateRequest {
-                       //TODO: IPV6-WORK
-                       fromB := h.vpnIp.As4()
-                       targetB := target.As4()
-
-                       // Send a CreateRelayRequest to the peer.
-                       req := NebulaControl{
-                               Type:                
NebulaControl_CreateRelayRequest,
-                               InitiatorRelayIndex: index,
-                               RelayFromIp:         
binary.BigEndian.Uint32(fromB[:]),
-                               RelayToIp:           
binary.BigEndian.Uint32(targetB[:]),
-                       }
-                       msg, err := req.Marshal()
-                       if err != nil {
-                               logMsg.
-                                       WithError(err).Error("relayManager 
Failed to marshal Control message to create relay")
-                       } else {
-                               f.SendMessageToHostInfo(header.Control, 0, 
peer, msg, make([]byte, 12), make([]byte, mtu))
-                               rm.l.WithFields(logrus.Fields{
-                                       //TODO: IPV6-WORK another lazy used to 
use the req object
-                                       "relayFrom":           h.vpnIp,
-                                       "relayTo":             target,
-                                       "initiatorRelayIndex": 
req.InitiatorRelayIndex,
-                                       "responderRelayIndex": 
req.ResponderRelayIndex,
-                                       "vpnIp":               target}).
-                                       Info("send CreateRelayRequest")
-                       }
+               peer.relayState.UpdateRelayForByIpState(from, Requested)
+               // Send a CreateRelayRequest to the peer.
+               fromB := from.As4()
+               targetB := target.As4()
+               req := NebulaControl{
+                       Type:                NebulaControl_CreateRelayRequest,
+                       InitiatorRelayIndex: index,
+                       RelayFromIp:         binary.BigEndian.Uint32(fromB[:]),
+                       RelayToIp:           
binary.BigEndian.Uint32(targetB[:]),
                }
-               // Also track the half-created Relay state just received
-               relay, ok := h.relayState.QueryRelayForByIp(target)
-               if !ok {
-                       // Add the relay
-                       state := PeerRequested
-                       if targetRelay != nil && targetRelay.State == 
Established {
-                               state = Established
-                       }
-                       _, err := AddRelay(rm.l, h, f.hostMap, target, 
&m.InitiatorRelayIndex, ForwardingType, state)
-                       if err != nil {
-                               logMsg.
-                                       WithError(err).Error("relayManager 
Failed to allocate a local index for relay")
-                               return
-                       }
+               msg, err := req.Marshal()
+               if err != nil {
+                       logMsg.
+                               WithError(err).Error("relayManager Failed to 
marshal Control message to create relay")
                } else {
-                       switch relay.State {
-                       case Established:
-                               if relay.RemoteIndex != m.InitiatorRelayIndex {
-                                       // We got a brand new Relay request, 
because its index is different than what we saw before.
-                                       // This should never happen. The peer 
should never change an index, once created.
-                                       logMsg.WithFields(logrus.Fields{
-                                               "existingRemoteIndex": 
relay.RemoteIndex}).Error("Existing relay mismatch with CreateRelayRequest")
-                                       return
-                               }
-                               //TODO: IPV6-WORK
-                               fromB := h.vpnIp.As4()
-                               targetB := target.As4()
-                               resp := NebulaControl{
-                                       Type:                
NebulaControl_CreateRelayResponse,
-                                       ResponderRelayIndex: relay.LocalIndex,
-                                       InitiatorRelayIndex: relay.RemoteIndex,
-                                       RelayFromIp:         
binary.BigEndian.Uint32(fromB[:]),
-                                       RelayToIp:           
binary.BigEndian.Uint32(targetB[:]),
-                               }
-                               msg, err := resp.Marshal()
+                       f.SendMessageToHostInfo(header.Control, 0, peer, msg, 
make([]byte, 12), make([]byte, mtu))
+                       rm.l.WithFields(logrus.Fields{
+                               //TODO: IPV6-WORK another lazy used to use the 
req object
+                               "relayFrom":           h.vpnIp,
+                               "relayTo":             target,
+                               "initiatorRelayIndex": req.InitiatorRelayIndex,
+                               "responderRelayIndex": req.ResponderRelayIndex,
+                               "vpnAddr":             target}).
+                               Info("send CreateRelayRequest")
+                       // Also track the half-created Relay state just received
+                       _, ok := h.relayState.QueryRelayForByIp(target)
+                       if !ok {
+                               // Add the relay
+                               _, err := AddRelay(rm.l, h, f.hostMap, target, 
&m.InitiatorRelayIndex, ForwardingType, PeerRequested)
                                if err != nil {
-                                       rm.l.
-                                               
WithError(err).Error("relayManager Failed to marshal Control 
CreateRelayResponse message to create relay")
-                               } else {
-                                       f.SendMessageToHostInfo(header.Control, 
0, h, msg, make([]byte, 12), make([]byte, mtu))
-                                       rm.l.WithFields(logrus.Fields{
-                                               //TODO: IPV6-WORK more lazy, 
used to use resp object
-                                               "relayFrom":           h.vpnIp,
-                                               "relayTo":             target,
-                                               "initiatorRelayIndex": 
resp.InitiatorRelayIndex,
-                                               "responderRelayIndex": 
resp.ResponderRelayIndex,
-                                               "vpnIp":               
h.vpnIp}).
-                                               Info("send CreateRelayResponse")
+                                       logMsg.
+                                               
WithError(err).Error("relayManager Failed to allocate a local index for relay")
+                                       return
                                }
-
-                       case Requested:
-                               // Keep waiting for the other relay to complete
                        }
                }
        }

++++++ vendor.tar.zst ++++++

Reply via email to