From 94f864cda4a905f6631643a1035abedf69ede111 Mon Sep 17 00:00:00 2001 From: "David A. Harding" Date: Tue, 7 Feb 2023 14:37:10 -1000 Subject: [PATCH] CH04::intro: retitle and replace intro - Introduce the problem keys solve (pseudonymonous encumbrance and satisfaction) and tell the user that we'll build up to addresses --- ch04.asciidoc | 89 +++++++++---------------------------- images/bitcoin-01-send.png | Bin 0 -> 11072 bytes 2 files changed, 22 insertions(+), 67 deletions(-) create mode 100644 images/bitcoin-01-send.png diff --git a/ch04.asciidoc b/ch04.asciidoc index 5bd92ab3..45f2a2a4 100644 --- a/ch04.asciidoc +++ b/ch04.asciidoc @@ -1,75 +1,30 @@ [[ch04_keys_addresses]] -== Keys, Addresses +== Keys and Addresses -((("cryptography", "defined")))((("cryptography", see="also keys and -addresses")))You may have heard that bitcoin is based on _cryptography_, -which is a branch of mathematics used extensively in computer security. -Cryptography means "secret writing" in Greek, but the science of -cryptography encompasses more than just secret writing, which is -referred to as encryption. Cryptography can also be used to prove -knowledge of a secret without revealing that secret (digital signature), -or prove the authenticity of data (digital fingerprint). These types of -cryptographic proofs are the mathematical tools critical to bitcoin and -used extensively in bitcoin applications. -((("encryption")))((("encryption", see="also keys and -addresses")))Ironically, encryption is not an important part of bitcoin, -as its communications and transaction data are not encrypted and do not -need to be encrypted to protect the funds. In this chapter we will -introduce some of the cryptography used in bitcoin to control ownership -of funds, in the form of keys, addresses, and wallets. +Alice wants to pay Bob, but the the thousands of Bitcoin full nodes who +will verify her transaction don't know who Alice or Bob are--and we want +to keep it that way to protect their privacy. Alice needs to +communicate that Bob should receive some of her bitcoins without tying +any aspect of that transaction to Bob's real-world identity or to other +Bitcoin payments that Bob receives. The method Alice uses must ensure +that only Bob can further spend the bitcoins he receives. -=== Introduction +The original Bitcoin paper describes a very simple scheme for achieving +those goals, shown in <>. A receiver like Bob +accepts bitcoins to a public key in a transaction which is signed by the +spender (like Alice). The bitcoins which Alice is spending had been +previously received to one her public keys, and she uses the +corresponding private key to generate her signature. Full nodes can +verify that Alice's signature commits to the output of a hash function +that itself commits to Bob's public key and other transaction details. -((("digital keys", see="keys and addresses")))((("keys and addresses", -"overview of", id="KAover04")))((("digital signatures", "purpose -of")))Ownership of bitcoin is established through _digital keys_, -_Bitcoin addresses_, and _digital signatures_. The digital keys are not -actually stored in the network, but are instead created and stored by -users in a file, or simple database, called a _wallet_. The digital keys -in a user's wallet are completely independent of the Bitcoin protocol -and can be generated and managed by the user's wallet software without -reference to the blockchain or access to the internet. Keys enable many -of the interesting properties of bitcoin, including decentralized trust -and control, ownership attestation, and the cryptographic-proof security -model. +[[pay-to-pure-pubkey]] +.Transaction chain from original Bitcoin paper +image::images/mbc2_abin01.png["Transaction chain from original Bitcoin paper"] -Most bitcoin transactions require a valid digital signature to be -included in the blockchain, which can only be generated with a secret -key; therefore, anyone with a copy of that key has control of the -bitcoin. ((("witnesses")))The digital signature used to spend funds is -also referred to as a _witness_, a term used in cryptography. The -witness data in a bitcoin transaction testifies to the true ownership of -the funds being spent. - -((("public and private keys", "key pairs")))((("public and private -keys", see="also keys and addresses")))Keys come in pairs consisting of -a private (secret) key and a public key. Think of the public key as -similar to a bank account number and the private key as similar to the -secret PIN, or signature on a check, that provides control over the -account. These digital keys are very rarely seen by the users of -bitcoin. For the most part, they are stored inside the wallet file and -managed by the bitcoin wallet software. - -In the payment portion of a bitcoin transaction, the recipient's public -key is represented by its digital fingerprint, called a _Bitcoin -address_, which is used in the same way as the beneficiary name on a -check (i.e., "Pay to the order of"). In most cases, a Bitcoin address is -generated from and corresponds to a public key. However, not all Bitcoin -addresses represent public keys; they can also represent other -beneficiaries such as scripts, as we will see later in this chapter. -This way, Bitcoin addresses abstract the recipient of funds, making -transaction destinations flexible, similar to paper checks: a single -payment instrument that can be used to pay into people's accounts, pay -into company accounts, pay for bills, or pay to cash. The Bitcoin -address is the only representation of the keys that users will routinely -see, because this is the part they need to share with the world. - -First, we will introduce cryptography and explain the mathematics used -in bitcoin. Next, we will look at how keys are generated, stored, and -managed. We will review the various encoding formats used to represent -private and public keys, addresses, and script addresses. Finally, we -will look at advanced use of keys and addresses: vanity, multisignature, -and script addresses and paper wallets. +We'll examine public keys, private keys, signatures, and hash functions +in the following sections, and then use all of them together to describe +the addresses used by modern Bitcoin software. ==== Public Key Cryptography and Cryptocurrency diff --git a/images/bitcoin-01-send.png b/images/bitcoin-01-send.png new file mode 100644 index 0000000000000000000000000000000000000000..61cc270e54d7c583ef8cb31bffcec86f88b9b9f8 GIT binary patch literal 11072 zcmb7qXIN8Pw>2Uvf)oMa(4n&adwm57}$4IoDisjycv?JHiO0MMc3vK|(@8rK7E3OhQ8H zK|*rwIyouu3oI8G2>c;)xNUHogrqc<^5DS*5)z>u9gW)%f9qe!`Y2YNx`uf>R{779 zyp-ZK$CJ!rPhL`HJP4C~T=J4K`ALxbTdL#-VRjkxlCpo>hdumwpZS*TTdFJNU%tx9 z#wEV+_?z?6MY+E_$*37*js6aOMzvX2*q@}kRZw7wH!j$hOfo2ds;F2&Gcn0|^Aq;v zKQh)fRF3z9=k#K@NY0U~l91ApUzOcmbDS0R!0i19_7?crT%I@`oQ^zHN>oRbT0TdMry@25q-@Z_!M~nx zHY6lOPgO(^m?BbU)~XQy6|L0+N;0BE)Unct7hfz6Cp+~6u%t%Tgs|0L%j?Iyt@sm^ z@Ys0Pe$D^hcZhMuG5pJz*MElTUVe46IqijcD}98BvS>PdZA5#8JhPr9JoCSnsqq3&z395PZ9LurI(=`2C>~wn7`{CrTSWrDQs9+VLul1mW zXORa7M*W23NOf_sE#)mw@1ugJ2`rQ^z!MA>qR~2MD{KJK3Z(CC-rrkx-)rpKL@^D# zX&taJ=3zC;j>xN$S;&qNOr_PwMGOk;n^v62cIB7eG< zs*I#l&1==MtrP6}JWqqOuCE$7LO(c>$>od-ksXYMHobw^fewd$KfS)4ac#$cj1z=# zmryWYHgTISfXK5cKJnP8UkUV`@19cl;pDGXbUjmhB9qA&(omGkk0p9Cs2<|+{B>ed$~&FGDicX&6`7jRb8tK;gg=nK&` zM@`wb{mrZWS0=2ff>;ThAf*iUiL|l(>E&44-X8l*^V^{7`ZSCd(sa7ix}oa`TggVB z7%X$-?b(B<`pgfBl1`_^lQmC9fl?l}afIs2(d3zImBO8`YBa`fQ=(WdG630Tap2nJ zVzdvbF8dwj6lt=Y3bhNR6P*r`+^o`I7DcN@F>Olup(KQHU>oKlXY7T^G!(aFX{l zE4?E^{MRtQ*L86~o zE2<1$$J=f*VhAFc{!!++8AX^+xbWfcj5+&@L2c*AY{_1`sIq>N!aK8`n-!GC|K$S) zA)PBfA`8NHnPF=`2!u~UIzJ&wepqHvq!0}>fk{3;px)DO=t`L|bYuWq9kA1~lVsEd z+52;_^Kc>`HBZ4H)RmrAJmzSx#GRlhV4kXmpCGf&-?^3gKB0n-?dIat`0BzT z{x?$5Citq_#6H$5PzwSN_6+8N+=$REkcdAHchl19iNc~6z%g56rW?0DG~rb|teivr;d%4R@9j?)hwy4I+SUwF>qUBO7hpTrmX62c1# zmOK<+fjRU!^4VcLb89M~>%jq>SH;AlR!Nv_O!i#7_cl`4IF1izmfvgy*o>;|E<$Fr zw(QyU_%shVq8#nntX6)HX?OA~=m~0qIx@@>+CpbO+!MYas%(g5)1>H6`L+$g!#tef z8IeT%9pf_^tv@9E)c$I-!*S3$Z;{!ND!;HnhmzgJtLs3YGCIGt-TXO-HsvUqajS0* z3mSJ*O#Qwxsk8Qga9FP>yX&xK$MJ(&k8bxqG>~TD=g|KAG0Us(v+qq(eMH2ed~`ov zKV%GC^Y#BTqm2#VqOL>vW9|uE%79fJE8A70^t#qnxhttsg(SJ}1s}shN4pEEg}k@piqO?uk%U zQgq3lNxbaA_86M&8}k-dK29BJTK#P7pgp_8FQO{{s5&V!?Mqi3El<3DAu#IygT-Fhi+$5ic3_%rP^_UJbjwrCjw{+6bs=LuSNxr0)sx89hqL*)5;WAa*jU&nRx>g6(!vYqlRG1XG#V>xX|78LgI@)kCq>$h9*|oJY zCw80I%co2PnC3k_Z9t@Y^ZTfPdRb{C`^_^N!*?#d!>1fX7m5j@P_Es+B0-p2U4ITKg&hosgRJ9!QlKCeS`>%Y2@}P_w`>K1pk8WFu z)2Fj|!vuR-*gZ_)`nhmI8^X956~XfO#*na^t1ee|OP*neJzuW0Nc5!cFloYDb*Jhc zgiFibqt1@8H2a>K~?fiVJ zy5EM4R+#c+XAE{tb#^@uQ1)(-uzBw~Xy44vYI4<@l=0Cw!+5sOrcFqWE;Vdp3$_Eg zb7%bJo0ae>u+Egmv~N}0?8bIJlbgx3uD~JMsy~DyXC?b+UyfcXnRxX6>@X`@eL(I{1j)4T%?5kB*jnZK`10_{VPj z7SFhKG3Le*^<}(Ba{-lKMzkTfYo?A9vW{&$Lc0IvXRw3QQ{iWFTH&hD+D)j|JLwNo zH%f&b_;p(B2I$G`8+SNH_v|k=b_FZVlRNiP_T!;sE;jqBRb#LL&lmKyZS>mi z*HlLAfX&k&8LwBbtz}YWJoEip5j|C@Ap88@}=L)w8(XB!*%`$9raI z{j0SUSCFO2gH> z{!hAl(gtjl5nhg?==k^rt9i|q7}K8I=VL{7P$z@d=Zp@EOs-wNi0)h2ptSJ^#=~?r zxLY&bMpd$v2OGGykBI8dyAQCNYC|4s1NkXBk2=lzaC+sKz1M#C!!a=F)(@)rw&RR7 zE<1y*AF5dXa#dIJAHis0Gl{inKv-6;!AEZuS#N?5A3* zwp9JDn0Zjnct(zRwF1|j+E6h8N#Nn{@oz>8=3)#Aa_u<; z>=vkH+}4{c%)-8dmz*__vm<|%|7 z6%Exx|3>TYU#>tkPD9d%%}EDq73{2Ei5!3vs(C;Gb8nJKvRTIXdNI_o;D857uCW3Z zClH;*OZHD}8=ayL{_%P>3)-Dv0jjLK zhpI0yL0>YBT(+LhL)O}FeMa{0C1>sD-q!3t^d2y9Y(Yct+H-4$(5^@{U7_bzyOHwv zHe4Y#h8dQ+^Z7-0VM#U9lTa;N3l38)DSN9N?Je#nd7ECVv-vkgP2O1zH~Ku+J(N@$ zNxC@4ooH;*Gd+p(K@!;iUZTm^3`&t0dOx2$wd~_LP$pGV6BCio{p}uoS*kQj%Yvo- z3$lJRSM~kKdz`3*LGc6!H+IOfx``q@Z>vdhV5G9WkBPuVh0pe_s-!QH`yTL?4RsL- z6Dv|@?Tx!KS}`Z2oK)_kTt`#FxWCfUo%(gOa~c83wN$@ptX@ruc>bP}qU-bco*93a zzWyYati7jj-49=;O3jws8BNpL1B%xk6A`Mp;krzxw{8hEiY7C*2(RR2*6rRq{}9oo4i$#dTC88vTglec)N zoT27xItz3Yd%7#js*m@4Z*OyC=FWDovxN-%^fmX-5{se+{EH^-3TFLU=882tgw{8F zxnW)_+1sdm0bE?a*aI#qY(-wPKc;t9+esVkKkB2}f#X<}v(Jc+ zTEOe*F6P;E6|6S@#XZSxV1nSzX;*kE@^%nfgsadtiGMuyvlluqJtmf3dma?s<0{zL zqwuxTRKz(oP;8|feiQppIR^}Of8v}WTUz^0$lxznSqjv)GR+I7(c{VyH6rht)CT*I zff@)*E^GVktC^_!)ST9Kb~{wJVW7Nl9+zh@ka^$%TTN$~_>mOj1|qFmxzZaB8n?4c=Q1@-=@k>E>h0fBcfqi$d{m-|y zw?hv*MFoOdwhZ71?g4DBlJn+EM>A%4gdjQmyQTS}ANXGGKKb1B6MFH(}(R7TS8k~UC z;lJogdT5zDa#PsZS^KS$NACRgVH>Efko75?$X!(TE9J{c;v3RVNN`D(jju(Re3DX2 zW`RrouG#t=R?XIsGSL?Rq2?2Y+7~9uSfzcJ zQj;_uqnr=qQcE3ExGb>4!3pPYyRF)^EDwFYH`%_}JW{~M3u$}ktrYK>>+P2*1R66b z6q35ndiO@JJFLIUn)&?5NB5-5=g7U|LWa;~>gLOKR~~UKP6`Y zHKRpWYaukGRyQWS2u3TauBAxhz0JfWoahiNO4T@WTdff-E1kPRdkL_Ar{R;~SRI%@ zBaq6g+uw~I8Wku0^#*Wu7MdshDTES&x1+|l@~Kg z_u>#?p9>Or=8U9|`~QqBOjVGQD%{R81#NZvj9~R$5d^$LH4;;3w5l^`zs@4}7UVPQ z5NY(IPkx#LUs=Yxs7(#s5RbMgR*9z|rOnskoWd=7+h6cn@toMoi06s839YalTpw#m zT0O)B)aTZqb@@#4U|Za|Lm@Y6?9i&@!`-9%(wb)Kkr-qp{he*J$HNzl8jI+ug3n0@ z>QzND>~X-nW{Ij$6b#MN!Fe;a+ZTnjxJC`K8ZFt9hl(5Dvx9FrAuAHJ-dpydxqj9J zm|G<#1=I`fgWUS!_ddvJ#R05do1fN;(Dk^Mh2r*jMqewunS3U4B=p^4aTqfh~$A{CMW2rveda z_w0-bkZO}TW@KT&WMOuZm+jN)P(IpU7WCTWF%iNVH^$8lU76A`Kb#B*lF1C}FcBZv zf=7-ADm6{dG-dot%>xuS?hZ;@B3zZ1^eQT5_6udf1H0r;f#2lO)`aJSr81YwlZ;Wd zl@dJ*Q={i2@<6rtDARtIcxDw`f6_Auo15#Jy~V2U7j*LP&(9$I)l-mPqQwm#5~b4# zT`CYqfn(hpnQcHh(35e4u(cUxw_7}CUhfteztE@x)jqLs&_x2BlEL>qsVl-*2rUV@ zR$>jeOf`v)W{ZQOgRiz1Jdo7UZdut05_PH(_c7fVUxu!xvW_N6uKmgOD+En6 zvE9x9Ovs161*^O+Hc{sa`OUm!wbif4EPrc5#18`&Mk!t;N{zuU5m zK4B~I)|kM0}zVIt8%omap?D$;?!Y3YIT4bi-BfD&>haBSoXvV#8-Dx0-GlmLh- z3w-JEVC&eMAiL|&Nyt2}zLNF%vklwG#-Y=SjraAM&|4haOGiPlqHIlN zAP6*<{gLqbsKzg8KbzC~<{EdGLX(uSYX?@TqJyvvHX+1c&#ELR?qW)7I^RAIgwgOT zr(OwtN&XSUUeBTA@9B9wGQBaxgs|Ucix*!B_B!~z*#20)e7@6V5Ju@7CG>Y=?_AFp z{Db4ZpFh5Zdh^JAPYm|tDW2ub$@IM`%zXazyj(;6abWV1V$eb3;=IlE_J>O{%#ZkM zkC!X_^^aC#z{Ra27(Cx)oPaPj6{^U`(x2%KIgS}ng|3Az`pY96$i_Q09!sm^l`6%w zc@F~lu9dufln?zi_ngke#eV$H<=&4wQATISb!>T7^8e^wI#C^$sGto|pSH`Cgv%3EA@Q}?*Dem>t zTX(X$^h^oBVSMvB35ZHwdi6$8Tj5>O42Ps*6Bnbe^to_zG&65y&DWJ_zomg;z__B7ep{gF-%BBWf{+}Up62u{}3#gT`Bmb@Y z*a90&*qvy#IoV38^2D^31DRr7`!{7Pv)9zBfaKr> z)CQl-NU+Re8^-P@PPZ}Rq%_sZEaoBDSSgy#Zv609!hS(yOwA=|>l~FCduu08g-chN zVf2J>5r%3?3lJq<@{ymkQ=zNhsZbUjxH_CcpnYzjQ&Di_Smk{y4X%=nl?BZ2;&7ghj+}QyL50J%&1#Z zx8p>~IE^A2s1=~hH#ZA&d-*@eBPw?)^P5)>UG=XqBx#eNOjx!xUXqZpaQBL#ZsFQk zeoWysQYv{^K!ttnI;7{wAMpbZYBNzUgNAq&$hXm=r4O;NNnD;5*)Fhaf@H(9xFi-g zKI(lO+;zl6D7`kt<2I08s_7&kgTR>ns>io$1c9BDWGCb7y?Bytd9nq+JltWd_Vffm zEt&)xy;g?~LP7x!(WJuMU8n3F_1tq_t>MKX8T^%#Zfx9`55{t|~& zH9%PeFGvMco(<j>&hVBiYG=Jc2 z;QH!+i+Ixi<$b_iPp=p0;COA_8J`0N!}V1M>18Whhcfes+o%lGA%~vlv(t;AARq${ z>y9d}6WzM{JqA46{$e*(6?C?46WX>_$i|oYY`!U+$-SpS=T28?epzY?V$~R@-~k(q z(zZVx+e<;p>WLZujJbnawzCWk*FC#1O*k1llr`9mA4Qcp7}S|*0IdW_J`;M!CUow_ zW^~~S1BCk2J`CWj2!(a{C9U5R^8`8~wm^I1-Qx zt(ZA6K*i)U-k2HUbqN5iDGh(%k6#{Yg#(vBWhHT8O1u18>lV}>{6C+r1BeGFhy+z6 za&tlKEM~+1fa?wS57>MzVxf2gS@n-}N18wCqdoN_-{AjjETGP|4o9)j5&d`g*BRk^ ziY6l!F%bVBCSmeEZbvz$jDz30Kgc?g6YGEz35dkyw{-YH`lp^O2!-x}u5rT(U`NH) zaKBQxjkD&fCK}$p7rtAVUa`|L-!(~7kgzdY-&uz{CI05FzAi3vjO`9g;^%z;j01Lu zn%3+ax@cxI59|ijQ+XntXhuDlTsh?(qF?|dCNN;-Dv(^_IdSIG`xbul!&pkyC}P8t zBpdX>T)bNA<*X?XooQ>nlkDkGbm?rZW4v)c&>g;WMczm^o;CK|v0rAmlfnS#2hN*d zuf3-EzRNw2;nc@AwX8gF;VO4cJxw`ic73i2WS~t+EL3fNqXG2dg;T}_c+*QyDvOvG zI7=jA^WJ`R`HmzJ!qon`Gg^$UXWN|$QaYSX|IfvP+&O3FyAx>1ptB1GB|grj%jv_@ zONIldGc{=4mtZy}&6%3U>Gr<5a_S3~GmA|Qk(n03#`H6h!j!IM+AfZq4%|J7v);VI z0-UgbQi5I;c~Tx+W6sO-oy9m+A0g=Q$2Ric~DFiT2TRStUOhm@~g{51zv z*lH}fjUw=GCRf#DfT2Rdh5N=(^&u{ZFncQ;=HWCOL3A3)Q{s(r2$!$F_LLQ;?6bM@ zP7r0m5;fgD3o*^i(-l4U=^ZqF37VI97;)z$J`0keFTg6%g_d=V-zdTPd*iFWe`Q@o z)mljGB#pCYZ>KD3u7V&=;uUFEm~TROMemlI1g@x8u%A{Q!?|LxX16TV*dQ#h#)OU7qv<+a+#&k4^#=cq1!aD8OhI;uT)2nBnZ>ypQ_`1}8DrtQEM; z!1W>=R-odUh1)LVeby(#Q$u_)PrnS&5~h~w@=VfvFtb%{ht?YxKlsfPu(jC+u>8?i zZDZA=u--;uZibUxL3Nlur7TRXSGh4VFx7c+8$Fyf#}xB9O&hzo$tQ?)S#nh>ES9a= z@hPNJudRfQH+E|zo^1YRdIJV*8uX;aKhJp0EVpF`tyE7Z#c>)JU!-a$x_Sa+%#k;R zv#KA&5r0nQ1#W6v`=)Nz3&$Qrg(_z2HECDP*>}0K#U5b z&6Q+=)E~CoIaWPlCm{*Fc$tAld(TXfQDt_X&=^<0l}s8bOGHR5(&m8;H@=)5^(U(R zzt<0@qMu9hGt6tPUR+NPOdoEwR!bwM|BHr?f2de)&MJtH?o3c_zuG-a&;Uu&)|qDwAm|ZX2`*nF?hmdE$*wKDWPUpK7U>SjXGNY zBy~vOJ$u=he8GV}5*n4cYr`iKb~NC2QYX#oZ`@%NmQ$x4NwuC_0L5qs_Dm;M$@K^M z>3a`ef%oy6jsSxLT;-uNlgF2=v=lsU^7neLVV`_#UB{Z?RRV)bN*wO!new)ZF3C24lLagm`z=~Wi7QYm* zZWuFD$!50ZPlQ4u;k7ci?X^1H7ZTFS%m32P0`97-5hHlzUsOt=yzL#=sV$?lf3@RE zCTSibL+J(x$p5|IER~EBVF7qLkVyYEnU&tK@XK-2SGM-^ceOt*e-E4WQYE!88eGr) zenB>s4kXH#8DP7A!w(KNH^gJNkGy-s-GRe$xFM)zC}(XyL5EJ(zNeLF zQMKllMm|kOy7gx)Y$Z0mLTJ8kOJi8LP|Qjw0vy_?jL5MUfEL;5pQCsf{?!^tA}!5WvV}+6$14; zBQ_|IE>fP9dM7AF<0PK%>EcGx9B+85lga|}1iN#n>xM?;bLvXCHpkP;=w(HnEgqU@lH_90U>Ivk8!`X ztf6nOeSZfYdNkGimWct>j6B&07*KLs_P4rNA|ryZSB84HAfX)~t75KN7OF}CH{hmf z&WtegF72fKAjltoM}Ko!8Z{P9tFm-^VpxQB5Z*OOXOXbs<->5fCcJ)ncBx~O7~)Hq z8ITI-1=n|&TNAi(9vvyml?hi0wOJpV%?*nBU7%!lZk5$ zyP%g6L)y8JI)W`*1(9G6ApnL#Q^}G+hkw^~uyk6c$~y!aBL&&KEc2DO`8qADJ3w7p zEiOnOzHSXKF#6u>rLeDP=~m<1W|5N(luM6iMlnEe@_m$6gyFuv-kio z>D%`hzaMx*$9k?S7&(fO_d%BViiv^><&x!V7V_=_A>bv|L)Edy!s&$+DrFwMr#Y*w z)3<+)6dXOrfPT?1I|-h=BP41c0gxE)gb>-SZl>@snZ_uYoTKL(L+72gHtkvJ^BQjM z{=O1;?}T(^y>8g=3*+bCsaH}C4(ww^Sp%QU{rNeN_`}