Re: [OPAE] Main Memory Access from FPGA
Adler, Michael <michael.adler at intel.com> Thu, 07 Feb 2019 16:50:38 +0000
| Newsgroups | dev.linux.lists.opae |
|---|---|
| Message-ID | <[email protected]> |
--===============6613478253623594195== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable C0 read and C1 write requests go to main memory buffers pinned with fpgaPre= pareBuffer(). The transactions will use whatever physical channels are atta= ched to the FPGA, which might be PCIe. The result is reads/writes from/to m= ain memory. -Michael From: David Nicuesa <david.nicuesa.aranda(a)gmail.com> Date: Thursday, February 7, 2019 at 11:23 AM To: "Adler, Michael" <michael.adler(a)intel.com>, "opae(a)lists.01.org" <op= ae(a)lists.01.org> Subject: Re: [OPAE] Main Memory Access from FPGA Hello Michael, thanks for the quick response. So, correct me if I'm wrong, MMIO goes into the c2 on RTL, and Reads/Writes= are managed through c0 and c1, right? This way I can allocate a buffer through software using fpgaPrepareBuffer = and access that buffer from software as a regular array, and using c0/c1 th= e AFU is able to work with it and those will be actual main memory accesses= , not PCIe transactions. Thank you very much for the help. Regards, David El jue., 7 feb. 2019 a las 16:41, Adler, Michael (<michael.adler(a)intel.co= m<mailto:michael.adler(a)intel.com>>) escribi=C3=B3: The CCI-P interface differentiates between MMIO (memory mapped I/O) and mai= n memory read/write requests. MMIO is an FPGA-side address space, mainly us= ed for implementing FPGA-side CSRs. Those CSRs are exposed in the software= =E2=80=99s address space but actually result in PCIe transactions to the FP= GA. CCI-P=E2=80=99s main memory read/write requests are exactly what you are as= king for: DMA to host main memory. The primary address space used for those= requests is a =E2=80=9Cphysical=E2=80=9D I/O address space that maps to ho= st physical addresses. It is also possible to use virtual addresses on the = FPGA that correspond to the software=E2=80=99s virtual address space. For t= hat you can use the MPF VTP extension. See section 3 of the tutorial<https:= //github.com/OPAE/intel-fpga-bbb/tree/master/samples/tutorial/03_ccip>. -Michael From: OPAE <opae-bounces(a)lists.01.org<mailto:opae-bounces(a)lists.01.org>= > on behalf of David Nicuesa <david.nicuesa.aranda(a)gmail.com<mailto:david= .nicuesa.aranda(a)gmail.com>> Date: Thursday, February 7, 2019 at 9:53 AM To: "opae(a)lists.01.org<mailto:opae(a)lists.01.org>" <opae(a)lists.01.org<= mailto:opae(a)lists.01.org>> Subject: [OPAE] Main Memory Access from FPGA Hi all, I'm getting started with the examples, specifically with the hello_world fr= om the intel-fpga-bbb<https://github.com/OPAE/intel-fpga-bbb/tree/master/sa= mples/tutorial/01_hello_world> repository. Everything works just fine but I= was wondering if it is possible for me to access the Main Memory (Not IO) = from the FPGA using the CCI protocol. I have an rtl to sum two vectors, so my idea was to provide the addresses f= or those two vectors from the software application, allocated in General Pu= rpose Memory. This way, ideally, the FPGA should be able to access those ve= ctors without having a shared buffer (MMIO). Is it possible to do this, maybe using some MPF extension? In case this is = not feasible, I should allocate a shared buffer in MMIO space and then comu= nicate the vectors through that buffer, right? Thanks! --===============6613478253623594195== Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.html" PGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4 bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIiB4bWxuczptPSJo dHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA0LzEyL29tbWwiIHhtbG5zPSJo dHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4NCjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVp dj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KPG1l dGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJNaWNyb3NvZnQgV29yZCAxNSAoZmlsdGVyZWQg bWVkaXVtKSI+DQo8c3R5bGU+PCEtLQ0KLyogRm9udCBEZWZpbml0aW9ucyAqLw0KQGZvbnQtZmFj ZQ0KCXtmb250LWZhbWlseToiQ2FtYnJpYSBNYXRoIjsNCglwYW5vc2UtMToyIDQgNSAzIDUgNCA2 IDMgMiA0O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6Q2FsaWJyaTsNCglwYW5vc2UtMToy IDE1IDUgMiAyIDIgNCAzIDIgNDt9DQpAZm9udC1mYWNlDQoJe2ZvbnQtZmFtaWx5OiJIZWx2ZXRp Y2EgTmV1ZSI7DQoJcGFub3NlLTE6MiAwIDUgMyAwIDAgMCAyIDAgNDt9DQpAZm9udC1mYWNlDQoJ e2ZvbnQtZmFtaWx5OkNvbnNvbGFzOw0KCXBhbm9zZS0xOjIgMTEgNiA5IDIgMiA0IDMgMiA0O30N CkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6R2VvcmdpYTsNCglwYW5vc2UtMToyIDQgNSAyIDUg NCA1IDIgMyAzO30NCi8qIFN0eWxlIERlZmluaXRpb25zICovDQpwLk1zb05vcm1hbCwgbGkuTXNv Tm9ybWFsLCBkaXYuTXNvTm9ybWFsDQoJe21hcmdpbjowaW47DQoJbWFyZ2luLWJvdHRvbTouMDAw MXB0Ow0KCWZvbnQtc2l6ZToxMS4wcHQ7DQoJZm9udC1mYW1pbHk6IkNhbGlicmkiLHNhbnMtc2Vy aWY7fQ0KYTpsaW5rLCBzcGFuLk1zb0h5cGVybGluaw0KCXttc28tc3R5bGUtcHJpb3JpdHk6OTk7 DQoJY29sb3I6Ymx1ZTsNCgl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30NCmE6dmlzaXRlZCwg c3Bhbi5Nc29IeXBlcmxpbmtGb2xsb3dlZA0KCXttc28tc3R5bGUtcHJpb3JpdHk6OTk7DQoJY29s b3I6cHVycGxlOw0KCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0KY29kZQ0KCXttc28tc3R5 bGUtcHJpb3JpdHk6OTk7DQoJZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijt9DQpwLm1zb25vcm1h bDAsIGxpLm1zb25vcm1hbDAsIGRpdi5tc29ub3JtYWwwDQoJe21zby1zdHlsZS1uYW1lOm1zb25v cm1hbDsNCgltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsNCgltYXJnaW4tcmlnaHQ6MGluOw0KCW1z by1tYXJnaW4tYm90dG9tLWFsdDphdXRvOw0KCW1hcmdpbi1sZWZ0OjBpbjsNCglmb250LXNpemU6 MTEuMHB0Ow0KCWZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNlcmlmO30NCnNwYW4uRW1haWxT dHlsZTE5DQoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsLXJlcGx5Ow0KCWZvbnQtZmFtaWx5OiJH ZW9yZ2lhIixzZXJpZjsNCgljb2xvcjp3aW5kb3d0ZXh0O30NCi5Nc29DaHBEZWZhdWx0DQoJe21z by1zdHlsZS10eXBlOmV4cG9ydC1vbmx5Ow0KCWZvbnQtc2l6ZToxMC4wcHQ7fQ0KQHBhZ2UgV29y ZFNlY3Rpb24xDQoJe3NpemU6OC41aW4gMTEuMGluOw0KCW1hcmdpbjoxLjBpbiAxLjBpbiAxLjBp biAxLjBpbjt9DQpkaXYuV29yZFNlY3Rpb24xDQoJe3BhZ2U6V29yZFNlY3Rpb24xO30NCi0tPjwv c3R5bGU+DQo8L2hlYWQ+DQo8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz0iYmx1ZSIgdmxpbms9InB1 cnBsZSI+DQo8ZGl2IGNsYXNzPSJXb3JkU2VjdGlvbjEiPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0dlb3JnaWEmcXVvdDssc2VyaWYiPkMwIHJl YWQgYW5kIEMxIHdyaXRlIHJlcXVlc3RzIGdvIHRvIG1haW4gbWVtb3J5IGJ1ZmZlcnMgcGlubmVk IHdpdGggZnBnYVByZXBhcmVCdWZmZXIoKS4gVGhlIHRyYW5zYWN0aW9ucyB3aWxsIHVzZSB3aGF0 ZXZlciBwaHlzaWNhbCBjaGFubmVscyBhcmUgYXR0YWNoZWQgdG8gdGhlIEZQR0EsIHdoaWNoIG1p Z2h0IGJlIFBDSWUuIFRoZSByZXN1bHQNCiBpcyByZWFkcy93cml0ZXMgZnJvbS90byBtYWluIG1l bW9yeS48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBz dHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7R2VvcmdpYSZxdW90OyxzZXJpZiI+PG86cD4mbmJzcDs8 L286cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQt ZmFtaWx5OiZxdW90O0dlb3JnaWEmcXVvdDssc2VyaWYiPi1NaWNoYWVsPG86cD48L286cD48L3Nw YW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZx dW90O0dlb3JnaWEmcXVvdDssc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjxk aXYgc3R5bGU9ImJvcmRlcjpub25lO2JvcmRlci10b3A6c29saWQgI0I1QzRERiAxLjBwdDtwYWRk aW5nOjMuMHB0IDBpbiAwaW4gMGluIj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxiPjxzcGFuIHN0 eWxlPSJmb250LXNpemU6MTIuMHB0O2NvbG9yOmJsYWNrIj5Gcm9tOiA8L3NwYW4+PC9iPjxzcGFu IHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2NvbG9yOmJsYWNrIj5EYXZpZCBOaWN1ZXNhICZsdDtk YXZpZC5uaWN1ZXNhLmFyYW5kYUBnbWFpbC5jb20mZ3Q7PGJyPg0KPGI+RGF0ZTogPC9iPlRodXJz ZGF5LCBGZWJydWFyeSA3LCAyMDE5IGF0IDExOjIzIEFNPGJyPg0KPGI+VG86IDwvYj4mcXVvdDtB ZGxlciwgTWljaGFlbCZxdW90OyAmbHQ7bWljaGFlbC5hZGxlckBpbnRlbC5jb20mZ3Q7LCAmcXVv dDtvcGFlQGxpc3RzLjAxLm9yZyZxdW90OyAmbHQ7b3BhZUBsaXN0cy4wMS5vcmcmZ3Q7PGJyPg0K PGI+U3ViamVjdDogPC9iPlJlOiBbT1BBRV0gTWFpbiBNZW1vcnkgQWNjZXNzIGZyb20gRlBHQTxv OnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+SGVsbG8gTWljaGFlbCwgPG86cD48L286cD48L3A+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj50aGFua3MgZm9yIHRoZSBxdWljayByZXNwb25zZS48bzpwPjwvbzpwPjwvcD4NCjwv ZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0K PC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+U28sIGNvcnJlY3QgbWUgaWYgSSdt IHdyb25nLCBNTUlPIGdvZXMgaW50byB0aGUgYzIgb24gUlRMLCBhbmQgUmVhZHMvV3JpdGVzIGFy ZSBtYW5hZ2VkIHRocm91Z2ggYzAgYW5kIGMxLCByaWdodD8mbmJzcDs8bzpwPjwvbzpwPjwvcD4N CjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPlRoaXMgd2F5IEkgY2FuIGFsbG9j YXRlIGEgYnVmZmVyIHRocm91Z2ggc29mdHdhcmUgdXNpbmcmbmJzcDs8Yj48c3BhbiBzdHlsZT0i Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhIE5ldWUmcXVvdDs7Y29sb3I6IzI5ODBCOTtiYWNr Z3JvdW5kOiNFN0YyRkEiPiZuYnNwOzwvc3Bhbj48L2I+PGNvZGU+PGI+PHNwYW4gc3R5bGU9ImZv bnQtZmFtaWx5OkNvbnNvbGFzO2NvbG9yOmJsYWNrO2JvcmRlcjpub25lIHdpbmRvd3RleHQgMS4w cHQ7cGFkZGluZzowaW4iPmZwZ2FQcmVwYXJlQnVmZmVyPC9zcGFuPjwvYj48L2NvZGU+Jm5ic3A7 YW5kDQogYWNjZXNzIHRoYXQgYnVmZmVyIGZyb20gc29mdHdhcmUgYXMgYSByZWd1bGFyIGFycmF5 LCBhbmQgdXNpbmcgYzAvYzEgdGhlIEFGVSBpcyBhYmxlIHRvIHdvcmsgd2l0aCBpdCBhbmQgdGhv c2Ugd2lsbCBiZSBhY3R1YWwgbWFpbiBtZW1vcnkgYWNjZXNzZXMsIG5vdCBQQ0llIHRyYW5zYWN0 aW9ucy48bzpwPjwvbzpwPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+VGhhbmsgeW91IHZlcnkgbXVjaCBmb3IgdGhlIGhlbHAuPG86cD48L286cD48L3A+DQo8L2Rp dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjwv ZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPlJlZ2FyZHMsPG86cD48L286cD48L3A+ DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5EYXZpZDxvOnA+PC9vOnA+PC9w Pg0KPC9kaXY+DQo8L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+ PC9wPg0KPGRpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5FbCBqdWUuLCA3IGZlYi4g MjAxOSBhIGxhcyAxNjo0MSwgQWRsZXIsIE1pY2hhZWwgKCZsdDs8YSBocmVmPSJtYWlsdG86bWlj aGFlbC5hZGxlckBpbnRlbC5jb20iPm1pY2hhZWwuYWRsZXJAaW50ZWwuY29tPC9hPiZndDspIGVz Y3JpYmnDszo8bzpwPjwvbzpwPjwvcD4NCjwvZGl2Pg0KPGJsb2NrcXVvdGUgc3R5bGU9ImJvcmRl cjpub25lO2JvcmRlci1sZWZ0OnNvbGlkICNDQ0NDQ0MgMS4wcHQ7cGFkZGluZzowaW4gMGluIDBp biA2LjBwdDttYXJnaW4tbGVmdDo0LjhwdDttYXJnaW4tcmlnaHQ6MGluIj4NCjxkaXY+DQo8ZGl2 Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1zby1tYXJnaW4tdG9wLWFsdDphdXRvO21z by1tYXJnaW4tYm90dG9tLWFsdDphdXRvIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7 R2VvcmdpYSZxdW90OyxzZXJpZiI+VGhlIENDSS1QIGludGVyZmFjZSBkaWZmZXJlbnRpYXRlcyBi ZXR3ZWVuIE1NSU8gKG1lbW9yeSBtYXBwZWQgSS9PKSBhbmQgbWFpbiBtZW1vcnkgcmVhZC93cml0 ZSByZXF1ZXN0cy4gTU1JTyBpcyBhbiBGUEdBLXNpZGUgYWRkcmVzcyBzcGFjZSwNCiBtYWlubHkg dXNlZCBmb3IgaW1wbGVtZW50aW5nIEZQR0Etc2lkZSBDU1JzLiBUaG9zZSBDU1JzIGFyZSBleHBv c2VkIGluIHRoZSBzb2Z0d2FyZeKAmXMgYWRkcmVzcyBzcGFjZSBidXQgYWN0dWFsbHkgcmVzdWx0 IGluIFBDSWUgdHJhbnNhY3Rpb25zIHRvIHRoZSBGUEdBLjwvc3Bhbj48bzpwPjwvbzpwPjwvcD4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28t bWFyZ2luLWJvdHRvbS1hbHQ6YXV0byI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0dl b3JnaWEmcXVvdDssc2VyaWYiPiZuYnNwOzwvc3Bhbj48bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJv dHRvbS1hbHQ6YXV0byI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0dlb3JnaWEmcXVv dDssc2VyaWYiPkNDSS1Q4oCZcyBtYWluIG1lbW9yeSByZWFkL3dyaXRlIHJlcXVlc3RzIGFyZSBl eGFjdGx5IHdoYXQgeW91IGFyZSBhc2tpbmcgZm9yOiBETUEgdG8gaG9zdCBtYWluIG1lbW9yeS4g VGhlIHByaW1hcnkgYWRkcmVzcyBzcGFjZSB1c2VkIGZvcg0KIHRob3NlIHJlcXVlc3RzIGlzIGEg 4oCccGh5c2ljYWzigJ0gSS9PIGFkZHJlc3Mgc3BhY2UgdGhhdCBtYXBzIHRvIGhvc3QgcGh5c2lj YWwgYWRkcmVzc2VzLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSB2aXJ0dWFsIGFkZHJlc3Nl cyBvbiB0aGUgRlBHQSB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHNvZnR3YXJl4oCZcyB2aXJ0dWFs IGFkZHJlc3Mgc3BhY2UuIEZvciB0aGF0IHlvdSBjYW4gdXNlIHRoZSBNUEYgVlRQIGV4dGVuc2lv bi4gU2VlDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vT1BBRS9pbnRlbC1mcGdhLWJiYi90 cmVlL21hc3Rlci9zYW1wbGVzL3R1dG9yaWFsLzAzX2NjaXAiIHRhcmdldD0iX2JsYW5rIj4NCnNl Y3Rpb24gMyBvZiB0aGUgdHV0b3JpYWw8L2E+Ljwvc3Bhbj48bzpwPjwvbzpwPjwvcD4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2lu LWJvdHRvbS1hbHQ6YXV0byI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0dlb3JnaWEm cXVvdDssc2VyaWYiPiZuYnNwOzwvc3Bhbj48bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29O b3JtYWwiIHN0eWxlPSJtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1h bHQ6YXV0byI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0dlb3JnaWEmcXVvdDssc2Vy aWYiPi1NaWNoYWVsPC9zcGFuPjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIg c3R5bGU9Im1zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRv Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7R2VvcmdpYSZxdW90OyxzZXJpZiI+Jm5i c3A7PC9zcGFuPjxvOnA+PC9vOnA+PC9wPg0KPGRpdiBzdHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVy LXRvcDpzb2xpZCAjQjVDNERGIDEuMHB0O3BhZGRpbmc6My4wcHQgMGluIDBpbiAwaW4iPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJn aW4tYm90dG9tLWFsdDphdXRvIj48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtjb2xv cjpibGFjayI+RnJvbToNCjwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7 Y29sb3I6YmxhY2siPk9QQUUgJmx0OzxhIGhyZWY9Im1haWx0bzpvcGFlLWJvdW5jZXNAbGlzdHMu MDEub3JnIiB0YXJnZXQ9Il9ibGFuayI+b3BhZS1ib3VuY2VzQGxpc3RzLjAxLm9yZzwvYT4mZ3Q7 IG9uIGJlaGFsZiBvZiBEYXZpZCBOaWN1ZXNhICZsdDs8YSBocmVmPSJtYWlsdG86ZGF2aWQubmlj dWVzYS5hcmFuZGFAZ21haWwuY29tIiB0YXJnZXQ9Il9ibGFuayI+ZGF2aWQubmljdWVzYS5hcmFu ZGFAZ21haWwuY29tPC9hPiZndDs8YnI+DQo8Yj5EYXRlOiA8L2I+VGh1cnNkYXksIEZlYnJ1YXJ5 IDcsIDIwMTkgYXQgOTo1MyBBTTxicj4NCjxiPlRvOiA8L2I+JnF1b3Q7PGEgaHJlZj0ibWFpbHRv Om9wYWVAbGlzdHMuMDEub3JnIiB0YXJnZXQ9Il9ibGFuayI+b3BhZUBsaXN0cy4wMS5vcmc8L2E+ JnF1b3Q7ICZsdDs8YSBocmVmPSJtYWlsdG86b3BhZUBsaXN0cy4wMS5vcmciIHRhcmdldD0iX2Js YW5rIj5vcGFlQGxpc3RzLjAxLm9yZzwvYT4mZ3Q7PGJyPg0KPGI+U3ViamVjdDogPC9iPltPUEFF XSBNYWluIE1lbW9yeSBBY2Nlc3MgZnJvbSBGUEdBPC9zcGFuPjxvOnA+PC9vOnA+PC9wPg0KPC9k aXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1zby1tYXJnaW4tdG9wLWFs dDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4N CjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2luLXRv cC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0byI+SGkgYWxsLA0KPG86cD48L286 cD48L3A+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1zby1tYXJnaW4tdG9w LWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvIj4mbmJzcDs8bzpwPjwvbzpwPjwv cD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2lu LXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0byI+SSdtIGdldHRpbmcgc3Rh cnRlZCB3aXRoIHRoZSBleGFtcGxlcywgc3BlY2lmaWNhbGx5IHdpdGggdGhlIGhlbGxvX3dvcmxk IGZyb20gdGhlJm5ic3A7PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL09QQUUvaW50ZWwtZnBn YS1iYmIvdHJlZS9tYXN0ZXIvc2FtcGxlcy90dXRvcmlhbC8wMV9oZWxsb193b3JsZCIgdGFyZ2V0 PSJfYmxhbmsiPmludGVsLWZwZ2EtYmJiPC9hPiZuYnNwO3JlcG9zaXRvcnkuDQogRXZlcnl0aGlu ZyB3b3JrcyBqdXN0IGZpbmUgYnV0IEkgd2FzIHdvbmRlcmluZyBpZiBpdCBpcyBwb3NzaWJsZSBm b3IgbWUgdG8gYWNjZXNzIHRoZSBNYWluIE1lbW9yeSAoTm90IElPKSBmcm9tIHRoZSBGUEdBIHVz aW5nIHRoZSBDQ0kgcHJvdG9jb2wuJm5ic3A7PG86cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+ DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNv LW1hcmdpbi1ib3R0b20tYWx0OmF1dG8iPiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0KPC9kaXY+DQo8 ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1zby1tYXJnaW4tdG9wLWFsdDphdXRv O21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvIj5JIGhhdmUgYW4gcnRsIHRvIHN1bSB0d28gdmVj dG9ycywgc28gbXkgaWRlYSB3YXMgdG8gcHJvdmlkZSB0aGUgYWRkcmVzc2VzIGZvciB0aG9zZSB0 d28gdmVjdG9ycyBmcm9tIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiwgYWxsb2NhdGVkIGluIEdl bmVyYWwgUHVycG9zZSBNZW1vcnkuIFRoaXMgd2F5LCBpZGVhbGx5LA0KIHRoZSBGUEdBIHNob3Vs ZCBiZSBhYmxlIHRvIGFjY2VzcyB0aG9zZSB2ZWN0b3JzIHdpdGhvdXQgaGF2aW5nIGEgc2hhcmVk IGJ1ZmZlciAoTU1JTykuPG86cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIiBzdHlsZT0ibXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0 b20tYWx0OmF1dG8iPiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xh c3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4t Ym90dG9tLWFsdDphdXRvIj5JcyBpdCBwb3NzaWJsZSB0byBkbyB0aGlzLCBtYXliZSB1c2luZyBz b21lIE1QRiBleHRlbnNpb24/IEluIGNhc2UgdGhpcyBpcyBub3QgZmVhc2libGUsIEkgc2hvdWxk IGFsbG9jYXRlIGEgc2hhcmVkIGJ1ZmZlciBpbiBNTUlPIHNwYWNlIGFuZCB0aGVuIGNvbXVuaWNh dGUgdGhlIHZlY3RvcnMgdGhyb3VnaA0KIHRoYXQgYnVmZmVyLCByaWdodD88bzpwPjwvbzpwPjwv cD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2lu LXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0byI+Jm5ic3A7PG86cD48L286 cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibXNvLW1h cmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG8iPlRoYW5rcyE8bzpw PjwvbzpwPjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ibG9ja3F1b3Rl Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg== --===============6613478253623594195==--