From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============0494785345840558352==" MIME-Version: 1.0 From: Harris, James R Subject: Re: [SPDK] Regarding NVMe driver command queue depth. Date: Fri, 17 Nov 2017 16:44:14 +0000 Message-ID: List-ID: To: spdk@lists.01.org --===============0494785345840558352== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Hi Sreeni, Can you step through your second call to spdk_nvme_ctrlr_alloc_io_qpair? T= he callstack clearly shows that qpair=3D0x0 was passed into stellus_spdk_nv= me_ns_cmd_write() at frame #3. So I think we should back up and figure out= why no I/O qpair was allocated (or maybe it was allocated but not saved in= a structure or something). -Jim From: SPDK on behalf of "Sreeni (Sreenivasa) = Busam (Stellus)" Reply-To: Storage Performance Development Kit Date: Thursday, November 16, 2017 at 4:57 PM To: Storage Performance Development Kit Subject: Re: [SPDK] Regarding NVMe driver command queue depth. I have been trying to test the number of commands that can be given to the = device at a time. I verified that a maximum of 254 commands could be issued= for a qpair. So I created a 2nd qpair for ns_entry and issued the I/O comm= ands, it was failing in the first command itself. Is it invalid to create 2= qpair for the same ns_entry and send command to device? The qpair is succe= ssfully created, but I could not submit command. I modified the hello_world program to test this and attached the related co= de. Please take a look and let me know what is the problem. 0x000000000040bae2 in nvme_allocate_request (qpair=3D0x0, payload=3D0x7fffa4726ba0, payload_size=3D512, cb_fn=3D0x4041a4 , cb_arg=3D0x7b4270) at nvme.c:85 #1 0x000000000040996c in _nvme_ns_cmd_rw (ns=3D0x100ff8ee40, qpair=3D0x0, payload=3D0x7fffa4726ba0, payload_offset=3D0, md_offset=3D0, lba=3D0, l= ba_count=3D1, cb_fn=3D0x4041a4 , cb_arg=3D0x7b4270, opc=3D1, io_flags= =3D0, apptag_mask=3D0, apptag=3D0, check_sgl=3Dtrue) at nvme_ns_cmd.c:440 #2 0x0000000000409fea in spdk_nvme_ns_cmd_write (ns=3D0x100ff8ee40, qpair= =3D0x0, buffer=3D0x10000f7000, lba=3D0, lba_count=3D1, cb_fn=3D0x4041a4 , cb_arg=3D0x7b4270, io_flags=3D0) at nvme_ns_cmd.c:649 #3 0x000000000040439d in stellus_spdk_nvme_ns_cmd_write (ns_entry=3D0x7b13= c0, qpair=3D0x0, buffer=3D0x10000f7000, lba=3D0, lba_count=3D1, cb_fn=3D0x40420d , cb_arg=3D0x7b4270, ioflags=3D0) at iost= at.c:233 #4 0x00000000004046b8 in test_io_func1 () at iostat.c:342 #5 0x0000000000404a94 in main (argc=3D1, argv=3D0x7fffa4726db8) at iostat.= c:503 (gdb) f 3 #3 0x000000000040439d in stellus_spdk_nvme_ns_cmd_write (ns_entry=3D0x7b13= c0, qpair=3D0x0, buffer=3D0x10000f7000, lba=3D0, lba_count=3D1, cb_fn=3D0x40420d , cb_arg=3D0x7b4270, ioflags=3D0) at iost= at.c:233 233 rc =3D spdk_nvme_ns_cmd_write(ns_entry->ns, qpair, = buffer, (gdb) p qpair $1 =3D (struct spdk_nvme_qpair *) 0x0 If any of you get time, please look at it. Thank you for your suggestion. From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Sreeni (Sreeni= vasa) Busam (Stellus) Sent: Thursday, November 16, 2017 11:26 AM To: spdk(a)lists.01.org Subject: [SPDK] Regarding NVMe driver command queue depth. Hi Paul, I was reading about the driver from SPDK site, and interested in understand= ing the queue depth for a device. =E2=80=9CThe specification allows for thousands, but most devices support b= etween 32 and 128. The specification makes no guarantees about the performa= nce available from each queue pair, but in practice the full performance of= a device is almost always achievable using just one queue pair. For exampl= e, if a device claims to be capable of 450,000 I/O per second at queue dept= h 128, in practice it does not matter if the driver is using 4 queue pairs = each with queue depth 32, or a single queue pair with queue depth 128=E2=80= =9D When queue depth is mentioned for device, is it the number of commands that= can be issued from application to controller, and outstanding at any time? Is there NVMe driver API to set the queue depth? Is my understanding correc= t if I think that the size of queue is at firmware level? Please give some detail about the parameter. Thanks, Sreeni --===============0494785345840558352== Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.html" PGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4 bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIiB4bWxuczptPSJo dHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA0LzEyL29tbWwiIHhtbG5zPSJo dHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4NCjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVp dj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KPG1l dGEgbmFtZT0iVGl0bGUiIGNvbnRlbnQ9IiI+DQo8bWV0YSBuYW1lPSJLZXl3b3JkcyIgY29udGVu dD0iIj4NCjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTUg KGZpbHRlcmVkIG1lZGl1bSkiPg0KPHN0eWxlPjwhLS0NCi8qIEZvbnQgRGVmaW5pdGlvbnMgKi8N CkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6QXJpYWw7DQoJcGFub3NlLTE6MiAxMSA2IDQgMiAy IDIgMiAyIDQ7fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWlseToiQ291cmllciBOZXciOw0KCXBh bm9zZS0xOjIgNyAzIDkgMiAyIDUgMiA0IDQ7fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWlseToi Q2FtYnJpYSBNYXRoIjsNCglwYW5vc2UtMToyIDQgNSAzIDUgNCA2IDMgMiA0O30NCkBmb250LWZh Y2UNCgl7Zm9udC1mYW1pbHk6RGVuZ1hpYW47DQoJcGFub3NlLTE6MiAxIDYgMCAzIDEgMSAxIDEg MTt9DQpAZm9udC1mYWNlDQoJe2ZvbnQtZmFtaWx5OkNhbGlicmk7DQoJcGFub3NlLTE6MiAxNSA1 IDIgMiAyIDQgMyAyIDQ7fQ0KLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8NCnAuTXNvTm9ybWFsLCBs aS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwNCgl7bWFyZ2luOjBpbjsNCgltYXJnaW4tYm90dG9t Oi4wMDAxcHQ7DQoJZm9udC1zaXplOjExLjBwdDsNCglmb250LWZhbWlseTpDYWxpYnJpO30NCmE6 bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsNCgl7bXNvLXN0eWxlLXByaW9yaXR5Ojk5Ow0KCWNvbG9y OiMwNTYzQzE7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQphOnZpc2l0ZWQsIHNwYW4u TXNvSHlwZXJsaW5rRm9sbG93ZWQNCgl7bXNvLXN0eWxlLXByaW9yaXR5Ojk5Ow0KCWNvbG9yOiM5 NTRGNzI7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQpzcGFuLkVtYWlsU3R5bGUxNw0K CXttc28tc3R5bGUtdHlwZTpwZXJzb25hbDsNCglmb250LWZhbWlseTpDYWxpYnJpOw0KCWNvbG9y OndpbmRvd3RleHQ7fQ0Kc3Bhbi5FbWFpbFN0eWxlMTgNCgl7bXNvLXN0eWxlLXR5cGU6cGVyc29u YWw7DQoJZm9udC1mYW1pbHk6Q2FsaWJyaTsNCgljb2xvcjojMUY0OTdEO30NCnNwYW4uRW1haWxT dHlsZTE5DQoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsLXJlcGx5Ow0KCWZvbnQtZmFtaWx5OkNh bGlicmk7DQoJY29sb3I6d2luZG93dGV4dDt9DQpzcGFuLm1zb0lucw0KCXttc28tc3R5bGUtdHlw ZTpleHBvcnQtb25seTsNCgltc28tc3R5bGUtbmFtZToiIjsNCgl0ZXh0LWRlY29yYXRpb246dW5k ZXJsaW5lOw0KCWNvbG9yOnRlYWw7fQ0KLk1zb0NocERlZmF1bHQNCgl7bXNvLXN0eWxlLXR5cGU6 ZXhwb3J0LW9ubHk7DQoJZm9udC1zaXplOjEwLjBwdDt9DQpAcGFnZSBXb3JkU2VjdGlvbjENCgl7 c2l6ZTo4LjVpbiAxMS4waW47DQoJbWFyZ2luOjEuMGluIDEuMGluIDEuMGluIDEuMGluO30NCmRp di5Xb3JkU2VjdGlvbjENCgl7cGFnZTpXb3JkU2VjdGlvbjE7fQ0KLS0+PC9zdHlsZT4NCjwvaGVh ZD4NCjxib2R5IGJnY29sb3I9IndoaXRlIiBsYW5nPSJFTi1VUyIgbGluaz0iIzA1NjNDMSIgdmxp bms9IiM5NTRGNzIiPg0KPGRpdiBjbGFzcz0iV29yZFNlY3Rpb24xIj4NCjxwIGNsYXNzPSJNc29O b3JtYWwiPkhpIFNyZWVuaSw8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxv OnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+Q2FuIHlvdSBzdGVwIHRo cm91Z2ggeW91ciBzZWNvbmQgY2FsbCB0byBzcGRrX252bWVfY3RybHJfYWxsb2NfaW9fcXBhaXI/ Jm5ic3A7IFRoZSBjYWxsc3RhY2sgY2xlYXJseSBzaG93cyB0aGF0IHFwYWlyPTB4MCB3YXMgcGFz c2VkIGludG8gc3RlbGx1c19zcGRrX252bWVfbnNfY21kX3dyaXRlKCkgYXQgZnJhbWUgIzMuJm5i c3A7IFNvIEkgdGhpbmsgd2Ugc2hvdWxkIGJhY2sgdXAgYW5kIGZpZ3VyZSBvdXQgd2h5IG5vIEkv TyBxcGFpcg0KIHdhcyBhbGxvY2F0ZWQgKG9yIG1heWJlIGl0IHdhcyBhbGxvY2F0ZWQgYnV0IG5v dCBzYXZlZCBpbiBhIHN0cnVjdHVyZSBvciBzb21ldGhpbmcpLjxvOnA+PC9vOnA+PC9wPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj4tSmltPG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNw OzwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0K PGRpdiBzdHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAjQjVDNERGIDEuMHB0O3Bh ZGRpbmc6My4wcHQgMGluIDBpbiAwaW4iPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1h cmdpbi1sZWZ0Oi41aW4iPjxiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+RnJvbTogPC9zcGFu Pg0KPC9iPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+U1BESyAmbHQ7c3Bkay1ib3VuY2VzQGxp c3RzLjAxLm9yZyZndDsgb24gYmVoYWxmIG9mICZxdW90O1NyZWVuaSAoU3JlZW5pdmFzYSkgQnVz YW0gKFN0ZWxsdXMpJnF1b3Q7ICZsdDtzLmJ1c2FtQHN0ZWxsdXMuY29tJmd0Ozxicj4NCjxiPlJl cGx5LVRvOiA8L2I+U3RvcmFnZSBQZXJmb3JtYW5jZSBEZXZlbG9wbWVudCBLaXQgJmx0O3NwZGtA bGlzdHMuMDEub3JnJmd0Ozxicj4NCjxiPkRhdGU6IDwvYj5UaHVyc2RheSwgTm92ZW1iZXIgMTYs IDIwMTcgYXQgNDo1NyBQTTxicj4NCjxiPlRvOiA8L2I+U3RvcmFnZSBQZXJmb3JtYW5jZSBEZXZl bG9wbWVudCBLaXQgJmx0O3NwZGtAbGlzdHMuMDEub3JnJmd0Ozxicj4NCjxiPlN1YmplY3Q6IDwv Yj5SZTogW1NQREtdIFJlZ2FyZGluZyBOVk1lIGRyaXZlciBjb21tYW5kIHF1ZXVlIGRlcHRoLjwv c3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtjb2xvcjpibGFjayI+PG86cD48L286 cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9 Im1hcmdpbi1sZWZ0Oi41aW4iPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtUaW1lcyBO ZXcgUm9tYW4mcXVvdDsiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPjxzcGFuIHN0eWxlPSJj b2xvcjojMUY0OTdEIj5JIGhhdmUgYmVlbiB0cnlpbmcgdG8gdGVzdCB0aGUgbnVtYmVyIG9mIGNv bW1hbmRzIHRoYXQgY2FuIGJlIGdpdmVuIHRvIHRoZSBkZXZpY2UgYXQgYSB0aW1lLiBJIHZlcmlm aWVkIHRoYXQgYSBtYXhpbXVtIG9mIDI1NCBjb21tYW5kcyBjb3VsZCBiZSBpc3N1ZWQgZm9yIGEg cXBhaXIuIFNvIEkgY3JlYXRlZCBhIDI8c3VwPm5kPC9zdXA+DQogcXBhaXIgZm9yIG5zX2VudHJ5 IGFuZCBpc3N1ZWQgdGhlIEkvTyBjb21tYW5kcywgaXQgd2FzIGZhaWxpbmcgaW4gdGhlIGZpcnN0 IGNvbW1hbmQgaXRzZWxmLiBJcyBpdCBpbnZhbGlkIHRvIGNyZWF0ZSAyIHFwYWlyIGZvciB0aGUg c2FtZSBuc19lbnRyeSBhbmQgc2VuZCBjb21tYW5kIHRvIGRldmljZT8gVGhlIHFwYWlyIGlzIHN1 Y2Nlc3NmdWxseSBjcmVhdGVkLCBidXQgSSBjb3VsZCBub3Qgc3VibWl0IGNvbW1hbmQuPC9zcGFu PjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0 Oi41aW4iPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj5JIG1vZGlmaWVkIHRoZSBoZWxsb193 b3JsZCBwcm9ncmFtIHRvIHRlc3QgdGhpcyBhbmQgYXR0YWNoZWQgdGhlIHJlbGF0ZWQgY29kZS4g Jm5ic3A7PC9zcGFuPjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9 Im1hcmdpbi1sZWZ0Oi41aW4iPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj5QbGVhc2UgdGFr ZSBhIGxvb2sgYW5kIGxldCBtZSBrbm93IHdoYXQgaXMgdGhlIHByb2JsZW0uPC9zcGFuPjxvOnA+ PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4i PjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj4mbmJzcDs8L3NwYW4+PG86cD48L286cD48L3A+ DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbjt0ZXh0LWF1dG9z cGFjZTpub25lIj48YSBuYW1lPSJfTWFpbEVuZENvbXBvc2UiPjxzcGFuIHN0eWxlPSJmb250LWZh bWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90OyI+MHgwMDAwMDAwMDAwNDBiYWUyIGluIG52bWVf YWxsb2NhdGVfcmVxdWVzdCAocXBhaXI9MHgwLDwvc3Bhbj48L2E+PG86cD48L286cD48L3A+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbjt0ZXh0LWF1dG9zcGFj ZTpub25lIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDsi PiZuYnNwOyZuYnNwOyZuYnNwOyBwYXlsb2FkPTB4N2ZmZmE0NzI2YmEwLCBwYXlsb2FkX3NpemU9 NTEyLCBjYl9mbj0weDQwNDFhNCAmbHQ7d3JpdGVfY29tcGxldGUmZ3Q7LDwvc3Bhbj48bzpwPjwv bzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluO3Rl eHQtYXV0b3NwYWNlOm5vbmUiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVy IE5ldyZxdW90OyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNiX2FyZz0weDdiNDI3MCkgYXQgbnZtZS5j Ojg1PC9zcGFuPjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1h cmdpbi1sZWZ0Oi41aW47dGV4dC1hdXRvc3BhY2U6bm9uZSI+PHNwYW4gc3R5bGU9ImZvbnQtZmFt aWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7Ij4jMSZuYnNwOyAweDAwMDAwMDAwMDA0MDk5NmMg aW4gX252bWVfbnNfY21kX3J3IChucz0weDEwMGZmOGVlNDAsIHFwYWlyPTB4MCw8L3NwYW4+PG86 cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVp bjt0ZXh0LWF1dG9zcGFjZTpub25lIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291 cmllciBOZXcmcXVvdDsiPiZuYnNwOyZuYnNwOyZuYnNwOyBwYXlsb2FkPTB4N2ZmZmE0NzI2YmEw LCBwYXlsb2FkX29mZnNldD0wLCBtZF9vZmZzZXQ9MCwgbGJhPTAsIGxiYV9jb3VudD0xLDwvc3Bh bj48bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVm dDouNWluO3RleHQtYXV0b3NwYWNlOm5vbmUiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVv dDtDb3VyaWVyIE5ldyZxdW90OyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNiX2ZuPTB4NDA0MWE0ICZs dDt3cml0ZV9jb21wbGV0ZSZndDssIGNiX2FyZz0weDdiNDI3MCwgb3BjPTEsIGlvX2ZsYWdzPTAs PC9zcGFuPjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdp bi1sZWZ0Oi41aW47dGV4dC1hdXRvc3BhY2U6bm9uZSI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5 OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7Ij4mbmJzcDsmbmJzcDsmbmJzcDsgYXBwdGFnX21hc2s9 MCwgYXBwdGFnPTAsIGNoZWNrX3NnbD10cnVlKSBhdCBudm1lX25zX2NtZC5jOjQ0MDwvc3Bhbj48 bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDou NWluO3RleHQtYXV0b3NwYWNlOm5vbmUiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtD b3VyaWVyIE5ldyZxdW90OyI+IzImbmJzcDsgMHgwMDAwMDAwMDAwNDA5ZmVhIGluIHNwZGtfbnZt ZV9uc19jbWRfd3JpdGUgKG5zPTB4MTAwZmY4ZWU0MCwgcXBhaXI9MHgwLDwvc3Bhbj48bzpwPjwv bzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluO3Rl eHQtYXV0b3NwYWNlOm5vbmUiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVy IE5ldyZxdW90OyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1ZmZlcj0weDEwMDAwZjcwMDAsIGxiYT0w LCBsYmFfY291bnQ9MSwgY2JfZm49MHg0MDQxYTQgJmx0O3dyaXRlX2NvbXBsZXRlJmd0Oyw8L3Nw YW4+PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxl ZnQ6LjVpbjt0ZXh0LWF1dG9zcGFjZTpub25lIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1 b3Q7Q291cmllciBOZXcmcXVvdDsiPiZuYnNwOyZuYnNwOyZuYnNwOyBjYl9hcmc9MHg3YjQyNzAs IGlvX2ZsYWdzPTApIGF0IG52bWVfbnNfY21kLmM6NjQ5PC9zcGFuPjxvOnA+PC9vOnA+PC9wPg0K PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW47dGV4dC1hdXRvc3Bh Y2U6bm9uZSI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7 Ij4jMyZuYnNwOyAweDAwMDAwMDAwMDA0MDQzOWQgaW4gc3RlbGx1c19zcGRrX252bWVfbnNfY21k X3dyaXRlIChuc19lbnRyeT0weDdiMTNjMCw8L3NwYW4+PG86cD48L286cD48L3A+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbjt0ZXh0LWF1dG9zcGFjZTpub25l Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDsiPiZuYnNw OyZuYnNwOyZuYnNwOyBxcGFpcj0weDAsIGJ1ZmZlcj0weDEwMDAwZjcwMDAsIGxiYT0wLCBsYmFf Y291bnQ9MSw8L3NwYW4+PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHls ZT0ibWFyZ2luLWxlZnQ6LjVpbjt0ZXh0LWF1dG9zcGFjZTpub25lIj48c3BhbiBzdHlsZT0iZm9u dC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDsiPiZuYnNwOyZuYnNwOyZuYnNwOyBjYl9m bj0weDQwNDIwZCAmbHQ7aW9fY29tcGxldGUmZ3Q7LCBjYl9hcmc9MHg3YjQyNzAsIGlvZmxhZ3M9 MCkgYXQgaW9zdGF0LmM6MjMzPC9zcGFuPjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW47dGV4dC1hdXRvc3BhY2U6bm9uZSI+PHNwYW4g c3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7Ij4jNCZuYnNwOyAweDAw MDAwMDAwMDA0MDQ2YjggaW4gdGVzdF9pb19mdW5jMSAoKSBhdCBpb3N0YXQuYzozNDI8L3NwYW4+ PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6 LjVpbjt0ZXh0LWF1dG9zcGFjZTpub25lIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7 Q291cmllciBOZXcmcXVvdDsiPiM1Jm5ic3A7IDB4MDAwMDAwMDAwMDQwNGE5NCBpbiBtYWluIChh cmdjPTEsIGFyZ3Y9MHg3ZmZmYTQ3MjZkYjgpIGF0IGlvc3RhdC5jOjUwMzwvc3Bhbj48bzpwPjwv bzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluO3Rl eHQtYXV0b3NwYWNlOm5vbmUiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVy IE5ldyZxdW90OyI+KGdkYikgZiAzPC9zcGFuPjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1z b05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW47dGV4dC1hdXRvc3BhY2U6bm9uZSI+PHNw YW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7Ij4jMyZuYnNwOyAw eDAwMDAwMDAwMDA0MDQzOWQgaW4gc3RlbGx1c19zcGRrX252bWVfbnNfY21kX3dyaXRlIChuc19l bnRyeT0weDdiMTNjMCw8L3NwYW4+PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFs IiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbjt0ZXh0LWF1dG9zcGFjZTpub25lIj48c3BhbiBzdHls ZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDsiPiZuYnNwOyZuYnNwOyZuYnNw OyBxcGFpcj0weDAsIGJ1ZmZlcj0weDEwMDAwZjcwMDAsIGxiYT0wLCBsYmFfY291bnQ9MSw8L3Nw YW4+PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxl ZnQ6LjVpbjt0ZXh0LWF1dG9zcGFjZTpub25lIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1 b3Q7Q291cmllciBOZXcmcXVvdDsiPiZuYnNwOyZuYnNwOyZuYnNwOyBjYl9mbj0weDQwNDIwZCAm bHQ7aW9fY29tcGxldGUmZ3Q7LCBjYl9hcmc9MHg3YjQyNzAsIGlvZmxhZ3M9MCkgYXQgaW9zdGF0 LmM6MjMzPC9zcGFuPjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9 Im1hcmdpbi1sZWZ0Oi41aW47dGV4dC1hdXRvc3BhY2U6bm9uZSI+PHNwYW4gc3R5bGU9ImZvbnQt ZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7Ij4yMzMmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcmMgPSBzcGRrX252bWVf bnNfY21kX3dyaXRlKG5zX2VudHJ5LSZndDtucywgcXBhaXIsIGJ1ZmZlciw8L3NwYW4+PG86cD48 L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbjt0 ZXh0LWF1dG9zcGFjZTpub25lIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmll ciBOZXcmcXVvdDsiPihnZGIpIHAgcXBhaXI8L3NwYW4+PG86cD48L286cD48L3A+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+PHNwYW4gc3R5bGU9ImZvbnQt ZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7Ij4kMSA9IChzdHJ1Y3Qgc3Bka19udm1lX3Fw YWlyICopIDB4MDwvc3Bhbj48bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0 eWxlPSJtYXJnaW4tbGVmdDouNWluIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+Jm5ic3A7 PC9zcGFuPjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdp bi1sZWZ0Oi41aW4iPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj5JZiBhbnkgb2YgeW91IGdl dCB0aW1lLCBwbGVhc2UgbG9vayBhdCBpdC4gVGhhbmsgeW91IGZvciB5b3VyIHN1Z2dlc3Rpb24u DQo8L3NwYW4+PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFy Z2luLWxlZnQ6LjVpbiI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPiZuYnNwOzwvc3Bhbj48 bzpwPjwvbzpwPjwvcD4NCjxkaXY+DQo8ZGl2IHN0eWxlPSJib3JkZXI6bm9uZTtib3JkZXItdG9w OnNvbGlkICNFMUUxRTEgMS4wcHQ7cGFkZGluZzozLjBwdCAwaW4gMGluIDBpbiI+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+PGI+RnJvbTo8L2I+IFNQREsg W21haWx0bzpzcGRrLWJvdW5jZXNAbGlzdHMuMDEub3JnXQ0KPGI+T24gQmVoYWxmIE9mIDwvYj5T cmVlbmkgKFNyZWVuaXZhc2EpIEJ1c2FtIChTdGVsbHVzKTxicj4NCjxiPlNlbnQ6PC9iPiBUaHVy c2RheSwgTm92ZW1iZXIgMTYsIDIwMTcgMTE6MjYgQU08YnI+DQo8Yj5Ubzo8L2I+IHNwZGtAbGlz dHMuMDEub3JnPGJyPg0KPGI+U3ViamVjdDo8L2I+IFtTUERLXSBSZWdhcmRpbmcgTlZNZSBkcml2 ZXIgY29tbWFuZCBxdWV1ZSBkZXB0aC48bzpwPjwvbzpwPjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+Jm5ic3A7PG86cD48 L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+ SGkgUGF1bCw8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJn aW4tbGVmdDouNWluIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi IHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj5JIHdhcyByZWFkaW5nIGFib3V0IHRoZSBkcml2ZXIg ZnJvbSBTUERLIHNpdGUsIGFuZCBpbnRlcmVzdGVkIGluIHVuZGVyc3RhbmRpbmcgdGhlIHF1ZXVl IGRlcHRoIGZvciBhIGRldmljZS48bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi IHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEzLjVwdDtm b250LWZhbWlseTpBcmlhbDtjb2xvcjojMzMzMzMzO2JhY2tncm91bmQ6d2hpdGUiPuKAnFRoZSBz cGVjaWZpY2F0aW9uIGFsbG93cyBmb3IgdGhvdXNhbmRzLCBidXQgbW9zdCBkZXZpY2VzIHN1cHBv cnQgYmV0d2VlbiAzMiBhbmQgMTI4LiBUaGUgc3BlY2lmaWNhdGlvbiBtYWtlcyBubyBndWFyYW50 ZWVzIGFib3V0IHRoZQ0KIHBlcmZvcm1hbmNlIGF2YWlsYWJsZSBmcm9tIGVhY2ggcXVldWUgcGFp ciwgYnV0IGluIHByYWN0aWNlIHRoZSBmdWxsIHBlcmZvcm1hbmNlIG9mIGEgZGV2aWNlIGlzIGFs bW9zdCBhbHdheXMgYWNoaWV2YWJsZSB1c2luZyBqdXN0IG9uZSBxdWV1ZSBwYWlyLiBGb3IgZXhh bXBsZSwgaWYgYSBkZXZpY2UgY2xhaW1zIHRvIGJlIGNhcGFibGUgb2YgNDUwLDAwMCBJL08gcGVy IHNlY29uZCBhdCBxdWV1ZSBkZXB0aCAxMjgsIGluIHByYWN0aWNlIGl0IGRvZXMNCiBub3QgbWF0 dGVyIGlmIHRoZSBkcml2ZXIgaXMgdXNpbmcgNCBxdWV1ZSBwYWlycyBlYWNoIHdpdGggcXVldWUg ZGVwdGggMzIsIG9yIGEgc2luZ2xlIHF1ZXVlIHBhaXIgd2l0aCBxdWV1ZSBkZXB0aCAxMjjigJ08 L3NwYW4+PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2lu LWxlZnQ6LjVpbiI+V2hlbiBxdWV1ZSBkZXB0aCBpcyBtZW50aW9uZWQgZm9yIGRldmljZSwgaXMg aXQgdGhlIG51bWJlciBvZiBjb21tYW5kcyB0aGF0IGNhbiBiZSBpc3N1ZWQgZnJvbSBhcHBsaWNh dGlvbiB0byBjb250cm9sbGVyLCBhbmQgb3V0c3RhbmRpbmcgYXQgYW55IHRpbWU/DQo8bzpwPjwv bzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj5J cyB0aGVyZSBOVk1lIGRyaXZlciBBUEkgdG8gc2V0IHRoZSBxdWV1ZSBkZXB0aD8gSXMgbXkgdW5k ZXJzdGFuZGluZyBjb3JyZWN0IGlmIEkgdGhpbmsgdGhhdCB0aGUgc2l6ZSBvZiBxdWV1ZSBpcyBh dCBmaXJtd2FyZSBsZXZlbD8NCjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIg c3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPlBsZWFzZSBnaXZlIHNvbWUgZGV0YWlsIGFib3V0IHRo ZSBwYXJhbWV0ZXIuPG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0i bWFyZ2luLWxlZnQ6LjVpbiI+Jm5ic3A7PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+VGhhbmtzLDxvOnA+PC9vOnA+PC9wPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPlNyZWVuaTxvOnA+PC9v OnA+PC9wPg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= --===============0494785345840558352==--