summaryrefslogtreecommitdiff
path: root/70/3254176e5dc26c3134159725fd7037184eed1f
blob: bbe915816a59fd500268695e2a98dc6819b16f19 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
Return-Path: <tamas@bitsofproof.com>
Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org
	[172.17.192.35])
	by mail.linuxfoundation.org (Postfix) with ESMTPS id 48BAC273
	for <bitcoin-dev@lists.linuxfoundation.org>;
	Sat, 22 Aug 2015 11:04:53 +0000 (UTC)
X-Greylist: from auto-whitelisted by SQLgrey-1.7.6
Received: from wp059.webpack.hosteurope.de (wp059.webpack.hosteurope.de
	[80.237.132.66])
	by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 14B2B11E
	for <bitcoin-dev@lists.linuxfoundation.org>;
	Sat, 22 Aug 2015 11:04:52 +0000 (UTC)
Received: from [37.143.74.116] (helo=[192.168.2.11]); authenticated
	by wp059.webpack.hosteurope.de running ExIM with esmtpsa
	(TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)
	id 1ZT6bO-0001H8-6f; Sat, 22 Aug 2015 13:04:46 +0200
Mime-Version: 1.0 (Mac OS X Mail 8.2 \(2104\))
Content-Type: multipart/signed;
	boundary="Apple-Mail=_0AC7FFE2-27D0-42BB-AD83-48BBC8CA66FA";
	protocol="application/pgp-signature"; micalg=pgp-sha512
X-Pgp-Agent: GPGMail 2.5.1
From: Tamas Blummer <tamas@bitsofproof.com>
In-Reply-To: <CABm2gDpcEmiPNQWeUk5aTjuTSRAJSPYfgAKc7B_qrqw0w04xoA@mail.gmail.com>
Date: Sat, 22 Aug 2015 13:04:44 +0200
Message-Id: <C486E9D9-D799-48B9-B80F-1A165DFD6536@bitsofproof.com>
References: <CABm2gDrApVuxF8DFf32V=pQhDKvvVfcDK=LeCXJ9h9o8CY+wNQ@mail.gmail.com>
	<55B723EA.7010700@voskuil.org>
	<CABm2gDok2gH2R8=x3a8PmPiM56WFg3TKzCum_WS=uV9-T1Ss3g@mail.gmail.com>
	<55B939CF.1080903@voskuil.org>
	<CABm2gDq1wHP01Tncw3hu=SCWQHaAOMjWOVYQWdQsOZ+E7zp9Yw@mail.gmail.com>
	<CABm2gDr_ePfPeWB8pEO8QNHDjUZpybVuCAdDmMxJxMaC8+2bGA@mail.gmail.com>
	<C4EA4A39-1920-4F33-822C-FBD12DF81004@bitsofproof.com>
	<CABm2gDqkF20ZoexQSV8iORb3ukxxZr5RasTLxJqQfSTsTqHvog@mail.gmail.com>
	<3390F712-879A-46E9-ABCD-D35B51190304@bitsofproof.com>
	<CABm2gDpcEmiPNQWeUk5aTjuTSRAJSPYfgAKc7B_qrqw0w04xoA@mail.gmail.com>
To: =?utf-8?Q?Jorge_Tim=C3=B3n?= <jtimon@jtimon.cc>,
	Matt Corallo <lf-lists@mattcorallo.com>
X-Mailer: Apple Mail (2.2104)
X-bounce-key: webpack.hosteurope.de; tamas@bitsofproof.com; 1440241492;
	4fdc44cc; 
X-Spam-Status: No, score=-0.9 required=5.0 tests=BAYES_00,HTML_MESSAGE,
	RCVD_IN_DNSWL_LOW,URIBL_BLACK autolearn=no version=3.3.1
X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
	smtp1.linux-foundation.org
Cc: Bitcoin Dev <bitcoin-dev@lists.linuxfoundation.org>,
	Libbitcoin <libbitcoin@lists.dyne.org>
Subject: Re: [bitcoin-dev] Libconsensus separated repository (was Bitcoin
	Core and hard forks)
X-BeenThere: bitcoin-dev@lists.linuxfoundation.org
X-Mailman-Version: 2.1.12
Precedence: list
List-Id: Bitcoin Development Discussion <bitcoin-dev.lists.linuxfoundation.org>
List-Unsubscribe: <https://lists.linuxfoundation.org/mailman/options/bitcoin-dev>,
	<mailto:bitcoin-dev-request@lists.linuxfoundation.org?subject=unsubscribe>
List-Archive: <http://lists.linuxfoundation.org/pipermail/bitcoin-dev/>
List-Post: <mailto:bitcoin-dev@lists.linuxfoundation.org>
List-Help: <mailto:bitcoin-dev-request@lists.linuxfoundation.org?subject=help>
List-Subscribe: <https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev>,
	<mailto:bitcoin-dev-request@lists.linuxfoundation.org?subject=subscribe>
X-List-Received-Date: Sat, 22 Aug 2015 11:04:53 -0000


--Apple-Mail=_0AC7FFE2-27D0-42BB-AD83-48BBC8CA66FA
Content-Type: multipart/alternative;
	boundary="Apple-Mail=_03E79B10-48E5-4696-8CD0-8A433D1AD39B"


--Apple-Mail=_03E79B10-48E5-4696-8CD0-8A433D1AD39B
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8

> On Aug 21, 2015, at 21:46, Jorge Tim=C3=B3n <jtimon@jtimon.cc> wrote:
>=20
> On Thu, Aug 20, 2015 at 10:35 AM, Tamas Blummer <tamas@bitsofproof.com =
<mailto:tamas@bitsofproof.com>> wrote:
>> Every re-implementation, re-factoring even copy-paste introduces a =
risk of disagreement,
>> but also open the chance of doing the work better, in the sense of =
software engineering.
>=20
> But you don't want something better, you want something functionally =
identical.
> You may want to watch sipa's explanation on why "the implementation is
> the specification" and the reasons to separate libconsensus:
> https://youtu.be/l3O4nh79CUU?t=3D764 =
<https://youtu.be/l3O4nh79CUU?t=3D764>

I do want something better, but not for the focus you have.

Not because what you produce was not high quality, but because quality =
is achieved at a very
high cost and is hard to uphold over generations of developer. You focus =
on a single use case
while there are many out there for distributed ledgers.

I think in an infrastructure for enterprise applications, building =
consensus on the ledger is a
cornerstone there, but is only a piece of the solution. I built several =
commercially successful
deployments where I delegated the consensus building to a border router, =
a Bitcoin Core,
then interfaced that trusted peer with my  implementation that accepted =
Core=E2=80=99s decisions
in an SPV manner. One might think of this setup as wasteful and =
unsuitable for =E2=80=9Csmall devices=E2=80=9D
therefore an example of centralization people here try to avoid.

Enterprises have sufficient resources. Solving the business problem is =
valuable to them even at
magnitudes higher cost than a hobbyist would bear.

For mainstream adoption you need to get enterprises on board too, and  =
that is what I care of.
Enterprises want code that is not only high quality, but is easy to =
maintain with a development
team with high attrition. One has to take whatever help is offered for =
that, and one is modern
languages and runtimes.

Bits of Proof=E2=80=99s own implementation of the scripts was not =
practically relevant in my commercially
successful deployments, because of the use of a border router, but it =
helped development,
enabling easier debug and precise error feedback esp. end even after =
Core had a reject message.

I integrated libconsensus only for the hope that is significantly =
fastens application side tx verification,
 which it has turned out it does not, until secp265k1 is integrated.

I would likely use an other extended libconsensus too, but do not think =
there was a dependency on
that for enterprise development.

It would help there more to have a slim protocol server, no wallet, no =
rpc, no qt but a high
performance remoting API.

> Since you already depend on libconsensus for VerifyScript, wouldn't it
> be nice that it also offered VerifyTx, VerifyHeader and VerifyBlock?
> You would still have complete control over storage, concurrency,
> networking, policy...
> My plan is for the C API to interface with the external storage by
> passing a function pointer to it.


Storage and validation is non-trivially interconnected, but I now the =
separation can be done,
since I did it.

Excuse me, but function pointers is a pattern I used in the 80=E2=80=99s. =
I know that they are behind
the curtain of modern abstractions with similar use, I still prefer not =
to see them again.

Tamas Blummer


--Apple-Mail=_03E79B10-48E5-4696-8CD0-8A433D1AD39B
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
	charset=utf-8

<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html =
charset=3Dutf-8"></head><body style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" =
class=3D""><div><blockquote type=3D"cite" class=3D""><div class=3D"">On =
Aug 21, 2015, at 21:46, Jorge Tim=C3=B3n &lt;<a =
href=3D"mailto:jtimon@jtimon.cc" class=3D"">jtimon@jtimon.cc</a>&gt; =
wrote:</div><br class=3D"Apple-interchange-newline"><div class=3D""><span =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D"">On Thu, Aug 20, 2015 at 10:35 AM, Tamas Blummer =
&lt;</span><a href=3D"mailto:tamas@bitsofproof.com" style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px;" class=3D"">tamas@bitsofproof.com</a><span=
 style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D"">&gt; wrote:</span><br style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px;" class=3D""><blockquote type=3D"cite" =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D"">Every =
re-implementation, re-factoring even copy-paste introduces a risk of =
disagreement,<br class=3D"">but also open the chance of doing the work =
better, in the sense of software engineering.<br =
class=3D""></blockquote><br style=3D"font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" =
class=3D""><span style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: =
none; display: inline !important;" class=3D"">But you don't want =
something better, you want something functionally identical.</span><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><span =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D"">You may want to watch sipa's explanation on why =
"the implementation is</span><br style=3D"font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant: normal; font-weight: =
normal; letter-spacing: normal; line-height: normal; orphans: auto; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: =
0px;" class=3D""><span style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: =
none; display: inline !important;" class=3D"">the specification" and the =
reasons to separate libconsensus:</span><br style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px;" class=3D""><a =
href=3D"https://youtu.be/l3O4nh79CUU?t=3D764" =
class=3D"">https://youtu.be/l3O4nh79CUU?t=3D764</a><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" =
class=3D""></div></blockquote><div><br class=3D""></div><div>I do want =
something better, but not for the focus you have.&nbsp;</div><div><br =
class=3D""></div><div>Not because what you produce was not high quality, =
but because quality is achieved at a very</div><div>high cost and is =
hard to uphold over generations of developer. You focus on a single use =
case</div><div>while there are many out there for distributed =
ledgers.</div><div><br class=3D""></div><div>I think in an =
infrastructure for enterprise applications, building consensus on the =
ledger is a&nbsp;</div><div>cornerstone there, but is only a piece of =
the solution. I built several commercially =
successful</div><div>deployments where I delegated the consensus =
building to a border router, a Bitcoin Core,&nbsp;</div><div>then =
interfaced that trusted peer with my &nbsp;implementation that accepted =
Core=E2=80=99s decisions&nbsp;</div><div>in an SPV manner. One might =
think of this setup as wasteful and unsuitable for =E2=80=9Csmall =
devices=E2=80=9D</div><div>therefore an example of centralization people =
here try to avoid.</div><div><br class=3D""></div><div>Enterprises have =
sufficient resources. Solving the business problem is valuable to them =
even at&nbsp;</div><div>magnitudes higher cost than a hobbyist would =
bear.</div><div><br class=3D""></div><div>For mainstream adoption you =
need to get enterprises on board too, and &nbsp;that is what I care =
of.&nbsp;</div><div>Enterprises want code that is not only high quality, =
but is easy to maintain with a development&nbsp;</div><div>team with =
high attrition. One has to take whatever help is offered for that, and =
one is modern&nbsp;</div><div>languages and runtimes.</div><div><br =
class=3D""></div><div><div>Bits of Proof=E2=80=99s own implementation of =
the scripts was not practically relevant in my =
commercially</div><div>successful deployments, because of the use of a =
border router, but it helped development,&nbsp;</div><div>enabling =
easier debug and precise error feedback esp. end even after Core had a =
reject message.&nbsp;</div></div><div><br class=3D""></div><div>I =
integrated libconsensus only for the hope that is significantly fastens =
application side tx verification,</div><div>&nbsp;which it has turned =
out it does not, until secp265k1 is integrated.</div><div><br =
class=3D""></div><div>I would likely use an other extended libconsensus =
too, but do not think there was a dependency on&nbsp;</div><div>that for =
enterprise development.&nbsp;</div><div><br class=3D""></div><div>It =
would help there more to have a slim protocol server, no wallet, no rpc, =
no qt but a high&nbsp;</div><div>performance remoting API.</div><div><br =
class=3D""></div><blockquote type=3D"cite" class=3D""><div =
class=3D""><span style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: =
none; display: inline !important;" class=3D"">Since you already depend =
on libconsensus for VerifyScript, wouldn't it</span><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><span =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D"">be nice that it also offered VerifyTx, =
VerifyHeader and VerifyBlock?</span><br style=3D"font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant: normal; font-weight: =
normal; letter-spacing: normal; line-height: normal; orphans: auto; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: =
0px;" class=3D""><span style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: =
none; display: inline !important;" class=3D"">You would still have =
complete control over storage, concurrency,</span><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><span =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D"">networking, policy...</span><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><span =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D"">My plan is for the C API to interface with the =
external storage by</span><br style=3D"font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant: normal; font-weight: =
normal; letter-spacing: normal; line-height: normal; orphans: auto; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: =
0px;" class=3D""><span style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: =
none; display: inline !important;" class=3D"">passing a function pointer =
to it.</span></div></blockquote></div><div class=3D""><br =
class=3D""></div><div class=3D"">Storage and validation is non-trivially =
interconnected, but I now the separation can be done,</div><div =
class=3D"">since I did it.&nbsp;</div><div class=3D""><br =
class=3D""></div><div class=3D"">Excuse me, but function pointers is a =
pattern I used in the 80=E2=80=99s. I know that they are =
behind&nbsp;</div><div class=3D"">the curtain of modern abstractions =
with similar use, I still prefer not to see them again.</div><div =
class=3D""><br class=3D""></div><div class=3D""><div =
apple-content-edited=3D"true" class=3D""><div class=3D"">Tamas =
Blummer</div><div class=3D""><br class=3D""></div></div><div><blockquote =
type=3D"cite" class=3D""></blockquote></div></div></body></html>=

--Apple-Mail=_03E79B10-48E5-4696-8CD0-8A433D1AD39B--

--Apple-Mail=_0AC7FFE2-27D0-42BB-AD83-48BBC8CA66FA
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename=signature.asc
Content-Type: application/pgp-signature;
	name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iQEcBAEBCgAGBQJV2FdNAAoJEPZykcUXcTkcbhYH/R1Z7RlCBucHlUiz8EaQQz95
unJunq3QESYqCkmW2QWUiSmMPOYC6+rSUOpu9OprNLyXdiQzantRwOh7tY6Hd6ut
b59R1/RzW5i7Q/2G0TqgMnXh1D3HrMWvMjihZeuWG5pen6RKZhAASz2rccAxoHWL
teoooe5jBFihg1uMtkyTwdQWUF16TVmqkNksgi5TW+oZt82EQ2WjxuG9E1GbloR4
oRHqa/QzAGowOIaAoRBACUh83b9+3Hv6zG55Go3n/qxWVBBSftU3iCbFvrWraKX0
u2OmKv5SMhyBwuxIgd116r2qx7REYXMBzY581q6Wq76bKqormF28ZOG2/tFzS2c=
=TQyS
-----END PGP SIGNATURE-----

--Apple-Mail=_0AC7FFE2-27D0-42BB-AD83-48BBC8CA66FA--