<signed_datafeed_article>
<datafeed_article>
<datafeed_name>edgecase_datafeed</datafeed_name>
<datafeed_article_id>189</datafeed_article_id>
<date>2020-11-05
<note>This is the date at the time of creation of this datafeed article. A checkpoint article containing a hash of this datafeed article may be created on this date or at a later date.</note>
</date>
<previous_checkpoint>
<datafeed_article_id>144</datafeed_article_id>
<checkpoint_id>9</checkpoint_id>
<date>2020-05-28</date>
<transaction>
<blockchain_name>bitcoin</blockchain_name>
<transaction_id>b27618deae05910f529240cc6960aeb87f017b12d302327253ee893825ce2bd4</transaction_id>
<block_height>632100</block_height>
<source_address>1HtwyqFWNVDoSEVqZwjBRRAV2oEsi8aQXr</source_address>
<destination_address>13MfGs39pR5aEK4iKdoLjVYXKwi6Y3uyPq</destination_address>
</transaction>
</previous_checkpoint>
<signed_article>
<article>
<title>Generating_a_standard_Bitcoin_address_#2</title>
<author_name>stjohn_piano</author_name>
<date>2020-11-03</date>
<signed_by_author>yes</signed_by_author>
<content>



<heading_lines>
GOAL
</heading_lines>


Develop a tool for generating a Bitcoin address from a private key. This tool should have a good command-line interface and a test suite. 




<heading_lines>
CONTENTS
</heading_lines>


- Goal
- Contents
- Summary
- Downloadable Assets
- How To Use The Tools
- Project Log




<heading_lines>
SUMMARY
</heading_lines>


I developed:
- a tool for deriving a Bitcoin address from a private key.
- an accompanying test suite.

The tool has a useful command-line interface. 

Please see the Downloadable Assets section for the tool and the test suite, and the How To Use The Tools section for instructions and examples.










<heading_lines>
DOWNLOADABLE ASSETS
</heading_lines>




<bold_lines>
Assets of this article:
</bold_lines>

List:

<datablock_lines>
- private_key_to_address.py
- test_private_key_to_address.py
</datablock_lines>

Asset: A tool that derives a Bitcoin address from a private key. Python 2.7.12.
<link>
<type>asset</type>
<filename>private_key_to_address.py</filename>
<text>private_key_to_address.py</text>
<sha256>dc6da10180110faf728902eecc6c39da86312a7e82c2966b950cdf54a6a1ecaa</sha256>
</link>

Asset: A test suite for the derivation tool. Python 2.7.12, Pytest 4.6.11.
<link>
<type>asset</type>
<filename>test_private_key_to_address.py</filename>
<text>test_private_key_to_address.py</text>
<sha256>83b6d3501d7b8c7bee6101741b9317076f460a22feda76c0e3196f884c12678d</sha256>
</link>




<bold_lines>
Assets of other articles:
</bold_lines>

List:

<datablock_lines>
- bitcoin_functions_2.py
- bjorn_edstrom_ripemd160.py
- ecdsa-0.10.tar.gz
- pypy_sha256.py
</datablock_lines>

Asset: A library of functions for handling standard Bitcoin data types. Python 2.7. 
<link>
<type>asset_of_another_article</type>
<article_title>Creating_a_Bitcoin_transaction_with_two_outputs</article_title>
<datafeed>edgecase</datafeed>
<datafeed_article_id>85</datafeed_article_id>
<filename>bitcoin_functions_2.py</filename>
<text>bitcoin_functions_2.py</text>
<sha256>653f38ebab7f7c176ce7925364b5916c32b8e97ab5d4c00a66b990a0b6e0074c</sha256>
</link>

Asset: An implementation of RIPEMD-160, written by <latin-1>B_j_o:r_n_  E_d_s_t_r_o:m_</latin-1>. Python 2.7. 
<link>
<type>asset_of_another_article</type>
<article_title>Reading_and_verifying_a_standard_raw_bitcoin_transaction</article_title>
<datafeed>edgecase</datafeed>
<datafeed_article_id>51</datafeed_article_id>
<filename>bjorn_edstrom_ripemd160.py</filename>
<text>bjorn_edstrom_ripemd160.py</text>
<sha256>a5ca6eb289989861e30806ff7e39165622bd366a1c6cd5edd2dbd7dfc4877666</sha256>
</link>

Asset: A Python implementation of ECDSA cryptography, written by Peter Pearson. Python 2.7. 
<link>
<type>asset_of_another_article</type>
<article_title>Reading_and_verifying_a_standard_raw_bitcoin_transaction</article_title>
<datafeed>edgecase</datafeed>
<datafeed_article_id>51</datafeed_article_id>
<filename>ecdsa-0.10.tar.gz</filename>
<text>ecdsa-0.10.tar.gz</text>
<sha256>67dae9e1af2b0fd71bc9a378654f7dc89211c1c5aee71e160f8cfce1fa6d6980</sha256>
</link>

Asset: A Python implementation of SHA256. Author unknown. Python 2.7. 
<link>
<type>asset_of_another_article</type>
<article_title>Reading_and_verifying_a_standard_raw_bitcoin_transaction</article_title>
<datafeed>edgecase</datafeed>
<datafeed_article_id>51</datafeed_article_id>
<filename>pypy_sha256.py</filename>
<text>pypy_sha256.py</text>
<sha256>2bbd4a83b69625e2f7ece5201475af2803f0ea11f3815c83d8afab3773d8f47b</sha256>
</link>




Dependency tree:
<datablock_lines>
- test_private_key_to_address.py
-- private_key_to_address.py
--- bitcoin_functions_2.py
---- bjorn_edstrom_ripemd160.py
---- ecdsa-0.10.tar.gz
---- pypy_sha256.py
</datablock_lines>










<heading_lines>
HOW TO USE THE TOOLS
</heading_lines>



<bold_lines>
Help:
</bold_lines>

<code_lines>
python private_key_to_address.py --help
</code_lines>



<bold_lines>
Main:
</bold_lines>

<code_lines>
python private_key_to_address.py -f privateKey.txt
</code_lines>

Note: By default, the tool looks for a file named 'privateKey.txt' in its local directory, so in the above command the filepath argument is optional.

<code_lines>
python private_key_to_address.py
</code_lines>



<bold_lines>
Test:
</bold_lines>

<code_lines>
pytest -q test_private_key_to_address.py
</code_lines>

Note: The test suite file needs to be in the same directory as the tool file.



<bold_lines>
Examples:
</bold_lines>

<bash_lines>

<input_lines>
stjohn@judgement:work$ python private_key_to_address.py --privateKeyFilePath privateKey.txt
</input_lines>
1QAZz5b4MzqG64Loq3qsvAQiwHqweY7mbT


[same as above, but in shorthand]
<input_lines>
stjohn@judgement:work$ python private_key_to_address.py -f privateKey.txt
</input_lines>
1QAZz5b4MzqG64Loq3qsvAQiwHqweY7mbT


<input_lines>
stjohn@judgement:work$ cat privateKey.txt
</input_lines>
089f7ffa2076aeb36d09a0d095296116cf6e3a93a1fcce0ca31e7628c43001d8


[default privateKey filepath is 'privateKey.txt'.]
<input_lines>
stjohn@judgement:work$ python private_key_to_address.py
</input_lines>
1QAZz5b4MzqG64Loq3qsvAQiwHqweY7mbT


<input_lines>
stjohn@judgement:work$ python private_key_to_address.py --privateKeyString 089f7ffa2076aeb36d09a0d095296116cf6e3a93a1fcce0ca31e7628c43001d8
</input_lines>
1QAZz5b4MzqG64Loq3qsvAQiwHqweY7mbT


<input_lines>
stjohn@judgement:work$ python private_key_to_address.py -f privateKey.txt --debug
</input_lines>
INFO [92: deriveBitcoinAddress] Private key: 089f7ffa2076aeb36d09a0d095296116cf6e3a93a1fcce0ca31e7628c43001d8
INFO [94: deriveBitcoinAddress] Private key (WIF): 5Ht5r13wvzsUJKPoqCasYH1hpBCjKMgQkXE4e538CcQLHum2Uyz
INFO [96: deriveBitcoinAddress] Bitcoin address: 1QAZz5b4MzqG64Loq3qsvAQiwHqweY7mbT
1QAZz5b4MzqG64Loq3qsvAQiwHqweY7mbT


<input_lines>
stjohn@judgement:work$ pytest -q test_private_key_to_address.py
</input_lines>
........................                                                 [100%]
24 passed in 2.94 seconds

</bash_lines>




















<heading_lines>
PROJECT LOG
</heading_lines>



The <link>
<type>article</type>
<article_title>Edgecase_Bitcoin_Storage_Toolset_version_2</article_title>
<datafeed>edgecase</datafeed>
<datafeed_article_id>148</datafeed_article_id>
<text>Edgecase Bitcoin Storage Toolset version 2</text>
</link> already contains a tool for generating a bitcoin address from a private key, called:
generate_bitcoin_address_4.py

I'll reuse the underlying code from it and its dependencies.

The previous project <link>
<type>article</type>
<article_title>Generating_entropy_from_dice_#2</article_title>
<datafeed>edgecase</datafeed>
<datafeed_article_id>188</datafeed_article_id>
<text>Generating entropy from dice #2</text>
</link> contains an good command-line tool and test suite. I'll use the same approach.

Work machine:
- Name: Judgement
- Windows 10
- Windows Subsystem for Linux (WSL): Ubuntu 16.04
- I'm working in the WSL Ubuntu terminal.

My Python version:
<bash_lines>
<input_lines>
stjohn@judgement:work$ python --version
</input_lines>
Python 2.7.12
</bash_lines>

My Pytest version:
<bash_lines>
<input_lines>
stjohn@judgement:work$ pytest --version
</input_lines>
This is pytest version 4.6.11, imported from /home/stjohn/.local/lib/python2.7/site-packages/pytest.pyc
</bash_lines>

Create a project directory, called:
"generating_a_standard_bitcoin_address_2"

Browse to the linked EBSTv2 article and download the various assets for the address generation tool.

Dependency tree:
<datablock_lines>
- generate_bitcoin_address_4.py
-- bitcoin_functions_2.py
--- bjorn_edstrom_ripemd160.py
--- ecdsa-0.10.tar.gz
--- pypy_sha256.py
</datablock_lines>

Create a new directory named "work" in the project directory.


Unpack the zipped tape archive file ecdsa-0.10.tar.gz, by opening a terminal, changing directory to the work directory, and running the following command:
<code_lines>
tar -zxvf ecdsa-0.10.tar.gz
</code_lines>

This unpacking produced a new directory named "ecdsa-0.10" in the work directory. The directory "ecdsa-0.10" contains a directory named "ecdsa". Copy the "ecdsa" directory into the work directory, using the following command:
<code_lines>
cp -r ecdsa-0.10/ecdsa .
</code_lines>

Delete ecdsa-0.10 and ecdsa-0.10.tar.gz.




I'll use the data from the previous project <link>
<type>article</type>
<article_title>Bitcoin_address_test_set</article_title>
<datafeed>edgecase</datafeed>
<datafeed_article_id>146</datafeed_article_id>
<text>Bitcoin address test set</text>
</link> when writing tests. 




[development work occurs here.]




I've written a tool for generating a bitcoin address from a private key, and an accompanying test suite:
- private_key_to_address.py
- test_private_key_to_address.py




Let's record some examples of using
private_key_to_address.py




<bash_lines>

<input_lines>
stjohn@judgement:work$ python private_key_to_address.py --help
</input_lines>
<preserve_whitespace_lines>
usage: private_key_to_address.py [-h] [-f PRIVATEKEYFILEPATH]
                                 [-p PRIVATEKEYSTRING]
                                 [-l {debug,info,warning,error}] [-d]

Derive a Bitcoin address from a Bitcoin private key.

optional arguments:
  -h, --help            show this help message and exit
  -f PRIVATEKEYFILEPATH, --privateKeyFilePath PRIVATEKEYFILEPATH
                        path to file containing the private key (default:
                        'privateKey.txt').
  -p PRIVATEKEYSTRING, --privateKeyString PRIVATEKEYSTRING
                        private key passed as a direct argument. This
                        overrides --privateKeyFilePath.
  -l {debug,info,warning,error}, --logLevel {debug,info,warning,error}
                        Choose logging level (default: 'error').
  -d, --debug           Sets logLevel to 'debug'. This overrides --logLevel.

Supplementary Notes:
- A standard Bitcoin address is an uncompressed single-signature Pay-To-Public-Key-Hash (P2PKH) address.
- A Bitcoin private key is a sequence of 32 bytes. In hex, 1 byte is written as two characters. So, a private key written in hex is 64 characters.
-- Example:
089f7ffa2076aeb36d09a0d095296116cf6e3a93a1fcce0ca31e7628c43001d8
</preserve_whitespace_lines>




<input_lines>
stjohn@judgement:work$ cat privateKey.txt
</input_lines>
089f7ffa2076aeb36d09a0d095296116cf6e3a93a1fcce0ca31e7628c43001d8


<input_lines>
stjohn@judgement:work$ python private_key_to_address.py --privateKeyFilePath privateKey.txt
</input_lines>
1QAZz5b4MzqG64Loq3qsvAQiwHqweY7mbT


[same, but in shorthand]
<input_lines>
stjohn@judgement:work$ python private_key_to_address.py -f privateKey.txt
</input_lines>
1QAZz5b4MzqG64Loq3qsvAQiwHqweY7mbT


[Note: By default, the tool looks for a file named 'privateKey.txt' in its local directory, so the filepath argument is optional.]
<input_lines>
stjohn@judgement:work$ python private_key_to_address.py
</input_lines>
1QAZz5b4MzqG64Loq3qsvAQiwHqweY7mbT


<input_lines>
stjohn@judgement:work$ python private_key_to_address.py --privateKeyString 089f7ffa2076aeb36d09a0d095296116cf6e3a93a1fcce0ca31e7628c43001d8
</input_lines>
1QAZz5b4MzqG64Loq3qsvAQiwHqweY7mbT


[same, but in shorthand]
<input_lines>
stjohn@judgement:work$ python private_key_to_address.py -p 089f7ffa2076aeb36d09a
0d095296116cf6e3a93a1fcce0ca31e7628c43001d8
</input_lines>
1QAZz5b4MzqG64Loq3qsvAQiwHqweY7mbT


<input_lines>
stjohn@judgement:work$ python private_key_to_address.py -f privateKey.txt --debug
</input_lines>
INFO [92: deriveBitcoinAddress] Private key: 089f7ffa2076aeb36d09a0d095296116cf6e3a93a1fcce0ca31e7628c43001d8
INFO [94: deriveBitcoinAddress] Private key (WIF): 5Ht5r13wvzsUJKPoqCasYH1hpBCjKMgQkXE4e538CcQLHum2Uyz
INFO [96: deriveBitcoinAddress] Bitcoin address: 1QAZz5b4MzqG64Loq3qsvAQiwHqweY7mbT
1QAZz5b4MzqG64Loq3qsvAQiwHqweY7mbT


<input_lines>
stjohn@judgement:work$ python private_key_to_address.py -f privateKey.txt --logLevel=info
</input_lines>
- Private key: 089f7ffa2076aeb36d09a0d095296116cf6e3a93a1fcce0ca31e7628c43001d8
- Private key (WIF): 5Ht5r13wvzsUJKPoqCasYH1hpBCjKMgQkXE4e538CcQLHum2Uyz
- Bitcoin address: 1QAZz5b4MzqG64Loq3qsvAQiwHqweY7mbT
1QAZz5b4MzqG64Loq3qsvAQiwHqweY7mbT

</bash_lines>








And some examples of testing the tool.


<bash_lines>

<input_lines>
stjohn@judgement:work$ pytest test_private_key_to_address.py
</input_lines>
============================= test session starts ==============================
platform linux2 -- Python 2.7.12, pytest-4.6.11, py-1.9.0, pluggy-0.13.1
rootdir: /mnt/c/Users/User/Desktop/stuff/articles/generating_a_standard_bitcoin_address_2/work
collected 24 items

test_private_key_to_address.py ........................                  [100%]

========================== 24 passed in 1.52 seconds ===========================




<input_lines>
stjohn@judgement:work$ pytest test_private_key_to_address.py --quiet
</input_lines>
........................                                                 [100%]
24 passed in 1.44 seconds




<input_lines>
stjohn@judgement:work$ pytest test_private_key_to_address.py::test_one --quiet
</input_lines>
.                                                                        [100%]
1 passed in 0.03 seconds




<input_lines>
stjohn@judgement:work$ pytest -o log_cli=true --log-cli-level=DEBUG --log-format="%(levelname)s [%(lineno)s: %(funcName)s] %(message)s" test_private_key_to_address.py::test_one
</input_lines>
============================= test session starts ==============================
platform linux2 -- Python 2.7.12, pytest-4.6.11, py-1.9.0, pluggy-0.13.1
rootdir: /mnt/c/Users/User/Desktop/stuff/articles/generating_a_standard_bitcoin_address_2/work
collected 1 item

test_private_key_to_address.py::test_one
-------------------------------- live log call ---------------------------------
INFO [92: deriveBitcoinAddress] Private key: 0000000000000000000000000000000000000000000000000000000000000001
INFO [94: deriveBitcoinAddress] Private key (WIF): 5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf
INFO [96: deriveBitcoinAddress] Bitcoin address: 1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm
PASSED                                                                   [100%]

=========================== 1 passed in 0.05 seconds ===========================




<input_lines>
stjohn@judgement:work$ pytest -o log_cli=true --log-cli-level=DEBUG --log-format="%(levelname)s [%(lineno)s: %(funcName)s] %(message)s" test_private_key_to_address.py::test_pair_1
</input_lines>
============================= test session starts ==============================
platform linux2 -- Python 2.7.12, pytest-4.6.11, py-1.9.0, pluggy-0.13.1
rootdir: /mnt/c/Users/User/Desktop/stuff/articles/generating_a_standard_bitcoin_address_2/work
collected 1 item

test_private_key_to_address.py::test_pair_1
-------------------------------- live log call ---------------------------------
INFO [92: deriveBitcoinAddress] Private key: 0000000000000000000000007468655f6c6962726172795f6f665f626162656c
INFO [94: deriveBitcoinAddress] Private key (WIF): 5HpHagT65TZzG1PH3CdWbVZG75U59A8FphH7EtKwbFCZf3p6bjg
INFO [96: deriveBitcoinAddress] Bitcoin address: 1CTumCMjzBfccCJBTkHoPQmAwEqU9Uj2sQ
PASSED                                                                   [100%]

=========================== 1 passed in 0.11 seconds ===========================

</bash_lines>








Good. That's the end of this project.










<notes>


List of previous tools for deriving Bitcoin addresses from private keys, together with the projects in which they were published:


Tool 1: <link>
<type>asset_of_another_article</type>
<article_title>Generating_a_standard_Bitcoin_address</article_title>
<datafeed>edgecase</datafeed>
<datafeed_article_id>54</datafeed_article_id>
<filename>generate_bitcoin_address.py</filename>
<text>generate_bitcoin_address.py</text>
<sha256>70f1288a5957ffc02dd43625446043b27c4132c02a609ea959a574f7ff6af563</sha256>
</link>
Project: <link>
<type>article</type>
<article_title>Generating_a_standard_Bitcoin_address</article_title>
<datafeed>edgecase</datafeed>
<datafeed_article_id>54</datafeed_article_id>
<text>Generating a standard Bitcoin address</text>
</link>


Tool 2: <link>
<type>asset_of_another_article</type>
<article_title>Verifying_a_signed_deed_of_the_GPG_1.4.10_source_code</article_title>
<datafeed>edgecase</datafeed>
<datafeed_article_id>60</datafeed_article_id>
<filename>generate_bitcoin_address_2.py</filename>
<text>generate_bitcoin_address_2.py</text>
<sha256>18be6cc5c66f9f672bf2247184b416340a9309de789f9737714d17efffb67a4e</sha256>
</link>
Project: <link>
<type>article</type>
<article_title>Verifying_a_signed_deed_of_the_GPG_1.4.10_source_code</article_title>
<datafeed>edgecase</datafeed>
<datafeed_article_id>60</datafeed_article_id>
<text>Verifying a signed deed of the GPG 1.4.10 source code</text>
</link>


Tool 3: <link>
<type>asset_of_another_article</type>
<article_title>Creating_and_signing_a_standard_raw_Bitcoin_transaction:_Iteration_#2</article_title>
<datafeed>edgecase</datafeed>
<datafeed_article_id>63</datafeed_article_id>
<filename>generate_bitcoin_address_3.py</filename>
<text>generate_bitcoin_address_3.py</text>
<sha256>b18c438fe479095eff17702c52968309351b6e5f9d147758ce5924b116f5a8ef</sha256>
</link>
Project: <link>
<type>article</type>
<article_title>Creating_and_signing_a_standard_raw_Bitcoin_transaction:_Iteration_#2</article_title>
<datafeed>edgecase</datafeed>
<datafeed_article_id>63</datafeed_article_id>
<text>Creating and signing a standard raw Bitcoin transaction: Iteration #2</text>
</link>


Tool 4: <link>
<type>asset_of_another_article</type>
<article_title>Edgecase_Bitcoin_Storage_Toolset_version_2</article_title>
<datafeed>edgecase</datafeed>
<datafeed_article_id>148</datafeed_article_id>
<filename>generate_bitcoin_address_4.py</filename>
<text>generate_bitcoin_address_4.py</text>
<sha256>f8fad8e3c31555b9ff309d52fca360a9e22ea0f8b3689bfa9fc8e6370339f456</sha256>
</link>
Project: <link>
<type>article</type>
<article_title>Edgecase_Bitcoin_Storage_Toolset_version_2</article_title>
<datafeed>edgecase</datafeed>
<datafeed_article_id>148</datafeed_article_id>
<text>Edgecase Bitcoin Storage Toolset version 2</text>
</link>


</notes>










</content>
</article>
<author_signature>
iQIcBAABCgAGBQJfo92nAAoJEC8RP+HmG9MX6OgP/0Z0aqufmfR2i6RWAzKoWlXy
NwI02O2p7AtybNSKAkrkwD+nI67aUdH94zqTvFzjBXdDFM78rxefORtTwZL2jcAl
Qk6eRiyDDkiWijCGImcwBvSnF3ULdjm0+ooBIuzBEOCI508KClnSNfHFGPXT+Mlo
Ge3uM+fgo3aY2autNijtrnmlsLVbz9LBwLx8HOtD8e7EIXv/jRM/RPEfd/P5C7VE
UvXId7M4jpNJaVA9Spy+PE3fjzCE6TKNtYv/M6fsG0zai4wlO4Z/mpnDGOCSk1A2
mm9BO9E9xo7glTo7D6SizwZzGxWDOXrJnC+QqTp7Y/6uZJspBr+1Ksl+VHCF3etJ
DG7gYuZfLIsrloK2M5MuMXFELsrMlumhySemHtWqNkW1Hwg0cmp4K7/addt+roxE
bAmecyapNyWDdoaAGjqq5vpGzLRImkmCUKqmIhNePf+5RD5VeQBO5NDwKDD0/uXF
cUleaONiFqyA5EbaYEGYsR5f646vOXXWdDNjJmQTNSz4wCqDhU7sHQDPVSX7lrF4
20oxROYzT8C43rpnlL4W/Vp47QV4L3Ruo/Cb1spAWTnoJDcftCZYrWDSRfsQGz+I
aySgENzf6v+1oWfZ3ukdffSfP17mPPs3vk/2gPjtGZLq2f5lafz/jKQ/EPf6VId6
Ezohq9RIuLXuln5jEbN1
=wTeG
</author_signature>
</signed_article>
</datafeed_article>
<datafeed_signature>
iQIcBAABCgAGBQJfo935AAoJECL1OzZgiBhw5zEP/AxZuMIPBt3DLtoGcmcTFF2G
iyBgVNm2OAcFBxPD7yy43nWABtvEqAQpvKPDpBjThtlaOAf8uUZ+Dsbd63wU78LY
aOgwQLImZWXm+HbU8PEpeSXUe1+ti1/eX+xt8A3BYtazTcv6wFlo9oWhQZvgrucF
tOLF3fI+7KXSsXRUMwtPvUTAmZCRtgqEhjTKg8ymvn3vsETDTP/WDQnLGRXeJ4Aw
iWAQ53NF4/+smKN8v6qQbUEgretFqTKacISMxQcD3TgvtWS/Zo2RQkhZwIXmLfQv
5+8+8YPKPHz30b0kiqkjrD4I0DMySl5vhl4bBh7sALcz74gajp8yyeJ5CaCSj0yT
6jnjjTRB38RL21pA7rLDi+vosJHHgVP71EUsBtjIShfoziT6WuXBhRRcHgpBREAS
+qq8j7uyYWAirn6TuDbIDIbRgvvdo4vK+HO3zsM020sC6zCEQHqNO/w4oanLNgvR
sKl4zLF5ujCzwyc2/qGH19aEjBQSTOBASXOglD1SZTxpq/fd1cE+nHq2rNf0ZyMu
3t+JW5/SFjRAo7Xmy2aRFvkZqMYiayQU6g8L1hGxbZquEVindKAR2jwhSwIAH5zg
wYBJfQ8iMEE0+c3zZKA6rZPnReDzGQQkCRZvsTsRJGNeG+DI7SwqTfP1F1hPVd9C
hkn+a6zlRwLjEEByovKh
=NMNU
</datafeed_signature>
</signed_datafeed_article>