From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============5772662407141818924==" MIME-Version: 1.0 From: Cao, Gang Subject: [SPDK] About per client QoS (IOPS rate limiting) Date: Tue, 10 Apr 2018 04:02:41 +0000 Message-ID: List-ID: To: spdk@lists.01.org --===============5772662407141818924== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Hi all, There has been some work done to have SPDK support the QoS per bdev which m= eans that each bdev has its assigned IOPS rate limiting. This QoS functiona= lity is below the storage protocols like NVMe-oF, iSCSI and so on. At the time of last PRC SPDK summit, there are some questions on the per cl= ient QoS (i.e., the NVMe-oF iniator / host) besides the per bdev QoS. Each = client like NVMe-oF initiator can see its own IOPS rate limiting not matter= whether the connected device is exclusive or shared at the target side. Based on Paul's great stuff of the Passthru vbdev, I've updated through bel= ow three patches to achieve the per client QoS. Each client sees its own pa= ssthru vbdev and QoS assigned on this vbdev. These vbdev shares the same bd= ev. Currently it only supports shareable and read only vbdev on same bdev. https://review.gerrithub.io/#/c/406888/ vbdev: update and have a create= _passthru_disk function https://review.gerrithub.io/#/c/406891/ vbdev: add the construct_passth= ru_bdev RPC method https://review.gerrithub.io/#/c/406977/ vbdev: make the passthru vbdev = share the same underlying bdev The possible usage as following: [Take NVMe-oF target as example] 1. In the nvmf.conf file, # Configure the Passthru vbdev on same bdev like Malloc0 [Passthru] PT Malloc0 PT0 PT Malloc0 PT1 # The subsystem is configured with shareable bdev by Passthru vbdevs [Subsystem2] NQN nqn.2016-06.io.spdk:cnode2 Listen RDMA 192.168.2.21:4420 AllowAnyHost No Host nqn.2016-06.io.spdk:init SN SPDK00000000000002 Namespace PT0 >>>> This can be connected by one client Namespace PT1 >>>> This can be connected by another client # Assign different QoS IOPS limiting on Passthru vbdevs [QoS] Limit_IOPS PT0 20000 Limit_IOPS PT1 30000 2. Use RPC method to add the Passthru vbdev at runtime a. python ./scripts/rpc.py construct_passthru_bdev Malloc0 PT3 b. python ./scripts/rpc.py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode2= PT3 c. python ./scripts/rpc.py enable_bdev_qos PT3 20000 If there is any concern or comment, please feel free to let me know. Thanks, Gang --===============5772662407141818924== Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.html" PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVy bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVt YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWlj cm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv VFIvUkVDLWh0bWw0MCI+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNv bnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSI+CjxtZXRhIG5hbWU9IkdlbmVyYXRv ciIgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTUgKGZpbHRlcmVkIG1lZGl1bSkiPgo8c3R5bGU+ PCEtLQovKiBGb250IERlZmluaXRpb25zICovCkBmb250LWZhY2UKCXtmb250LWZhbWlseTpTaW1T dW47CglwYW5vc2UtMToyIDEgNiAwIDMgMSAxIDEgMSAxO30KQGZvbnQtZmFjZQoJe2ZvbnQtZmFt aWx5OiJDYW1icmlhIE1hdGgiOwoJcGFub3NlLTE6MiA0IDUgMyA1IDQgNiAzIDIgNDt9CkBmb250 LWZhY2UKCXtmb250LWZhbWlseTpDYWxpYnJpOwoJcGFub3NlLTE6MiAxNSA1IDIgMiAyIDQgMyAy IDQ7fQpAZm9udC1mYWNlCgl7Zm9udC1mYW1pbHk6U2ltU3VuOwoJcGFub3NlLTE6MiAxIDYgMCAz IDEgMSAxIDEgMTt9Ci8qIFN0eWxlIERlZmluaXRpb25zICovCnAuTXNvTm9ybWFsLCBsaS5Nc29O b3JtYWwsIGRpdi5Nc29Ob3JtYWwKCXttYXJnaW46MGNtOwoJbWFyZ2luLWJvdHRvbTouMDAwMXB0 OwoJdGV4dC1hbGlnbjpqdXN0aWZ5OwoJdGV4dC1qdXN0aWZ5OmludGVyLWlkZW9ncmFwaDsKCWZv bnQtc2l6ZToxMC41cHQ7Cglmb250LWZhbWlseToiQ2FsaWJyaSIsc2Fucy1zZXJpZjt9CmE6bGlu aywgc3Bhbi5Nc29IeXBlcmxpbmsKCXttc28tc3R5bGUtcHJpb3JpdHk6OTk7Cgljb2xvcjojMDU2 M0MxOwoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9CmE6dmlzaXRlZCwgc3Bhbi5Nc29IeXBl cmxpbmtGb2xsb3dlZAoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsKCWNvbG9yOiM5NTRGNzI7Cgl0 ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30Kc3Bhbi5FbWFpbFN0eWxlMTcKCXttc28tc3R5bGUt dHlwZTpwZXJzb25hbC1jb21wb3NlOwoJZm9udC1mYW1pbHk6IkNhbGlicmkiLHNhbnMtc2VyaWY7 Cgljb2xvcjp3aW5kb3d0ZXh0O30KLk1zb0NocERlZmF1bHQKCXttc28tc3R5bGUtdHlwZTpleHBv cnQtb25seTsKCWZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNlcmlmO30KLyogUGFnZSBEZWZp bml0aW9ucyAqLwpAcGFnZSBXb3JkU2VjdGlvbjEKCXtzaXplOjYxMi4wcHQgNzkyLjBwdDsKCW1h cmdpbjo3Mi4wcHQgOTAuMHB0IDcyLjBwdCA5MC4wcHQ7fQpkaXYuV29yZFNlY3Rpb24xCgl7cGFn ZTpXb3JkU2VjdGlvbjE7fQotLT48L3N0eWxlPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgo8bzpz aGFwZWRlZmF1bHRzIHY6ZXh0PSJlZGl0IiBzcGlkbWF4PSIxMDI2IiAvPgo8L3htbD48IVtlbmRp Zl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KPG86c2hhcGVsYXlvdXQgdjpleHQ9ImVkaXQi Pgo8bzppZG1hcCB2OmV4dD0iZWRpdCIgZGF0YT0iMSIgLz4KPC9vOnNoYXBlbGF5b3V0PjwveG1s PjwhW2VuZGlmXS0tPgo8L2hlYWQ+Cjxib2R5IGxhbmc9IlpILUNOIiBsaW5rPSIjMDU2M0MxIiB2 bGluaz0iIzk1NEY3MiIgc3R5bGU9InRleHQtanVzdGlmeS10cmltOnB1bmN0dWF0aW9uIj4KPGRp diBjbGFzcz0iV29yZFNlY3Rpb24xIj4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0i RU4tVVMiPkhpIGFsbCw8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxzcGFuIGxhbmc9IkVOLVVTIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNz PSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj5UaGVyZSBoYXMgYmVlbiBzb21lIHdvcmsg ZG9uZSB0byBoYXZlIFNQREsgc3VwcG9ydCB0aGUgUW9TIHBlciBiZGV2IHdoaWNoIG1lYW5zIHRo YXQgZWFjaCBiZGV2IGhhcyBpdHMgYXNzaWduZWQgSU9QUyByYXRlIGxpbWl0aW5nLiBUaGlzIFFv UyBmdW5jdGlvbmFsaXR5IGlzIGJlbG93IHRoZSBzdG9yYWdlIHByb3RvY29scyBsaWtlIE5WTWUt b0YsIGlTQ1NJIGFuZCBzbyBvbi48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29O b3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+Cjxw IGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj5BdCB0aGUgdGltZSBvZiBsYXN0 IFBSQyBTUERLIHN1bW1pdCwgdGhlcmUgYXJlIHNvbWUgcXVlc3Rpb25zIG9uIHRoZSBwZXIgY2xp ZW50IFFvUyAoaS5lLiwgdGhlIE5WTWUtb0YgaW5pYXRvciAvIGhvc3QpIGJlc2lkZXMgdGhlIHBl ciBiZGV2IFFvUy4gRWFjaCBjbGllbnQgbGlrZSBOVk1lLW9GIGluaXRpYXRvciBjYW4gc2VlIGl0 cyBvd24gSU9QUyByYXRlIGxpbWl0aW5nIG5vdAogbWF0dGVyIHdoZXRoZXIgdGhlIGNvbm5lY3Rl ZCBkZXZpY2UgaXMgZXhjbHVzaXZlIG9yIHNoYXJlZCBhdCB0aGUgdGFyZ2V0IHNpZGUuPG86cD48 L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+ PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBs YW5nPSJFTi1VUyI+QmFzZWQgb24gUGF1bCYjODIxNztzIGdyZWF0IHN0dWZmIG9mIHRoZSBQYXNz dGhydSB2YmRldiwgSSYjODIxNzt2ZSB1cGRhdGVkIHRocm91Z2ggYmVsb3cgdGhyZWUgcGF0Y2hl cyB0byBhY2hpZXZlIHRoZSBwZXIgY2xpZW50IFFvUy4gRWFjaCBjbGllbnQgc2VlcyBpdHMgb3du IHBhc3N0aHJ1IHZiZGV2IGFuZCBRb1MgYXNzaWduZWQgb24gdGhpcyB2YmRldi4gVGhlc2UgdmJk ZXYgc2hhcmVzIHRoZQogc2FtZSBiZGV2LiBDdXJyZW50bHkgaXQgb25seSBzdXBwb3J0cyBzaGFy ZWFibGUgYW5kIHJlYWQgb25seSB2YmRldiBvbiBzYW1lIGJkZXYuPG86cD48L286cD48L3NwYW4+ PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+PG86cD4mbmJzcDs8 L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+ PGEgaHJlZj0iaHR0cHM6Ly9yZXZpZXcuZ2Vycml0aHViLmlvLyMvYy80MDY4ODgvIj5odHRwczov L3Jldmlldy5nZXJyaXRodWIuaW8vIy9jLzQwNjg4OC88L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7IHZiZGV2OiB1cGRhdGUgYW5kIGhhdmUgYSBjcmVhdGVfcGFzc3RocnVfZGlzayBmdW5jdGlv bjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0i RU4tVVMiPjxhIGhyZWY9Imh0dHBzOi8vcmV2aWV3LmdlcnJpdGh1Yi5pby8jL2MvNDA2ODkxLyI+ aHR0cHM6Ly9yZXZpZXcuZ2Vycml0aHViLmlvLyMvYy80MDY4OTEvPC9hPiZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyB2YmRldjogYWRkIHRoZSBjb25zdHJ1Y3RfcGFzc3RocnVfYmRldiBSUEMgbWV0 aG9kPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5n PSJFTi1VUyI+PGEgaHJlZj0iaHR0cHM6Ly9yZXZpZXcuZ2Vycml0aHViLmlvLyMvYy80MDY5Nzcv Ij5odHRwczovL3Jldmlldy5nZXJyaXRodWIuaW8vIy9jLzQwNjk3Ny88L2E+Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7IHZiZGV2OiBtYWtlIHRoZSBwYXNzdGhydSB2YmRldiBzaGFyZSB0aGUgc2Ft ZSB1bmRlcmx5aW5nIGJkZXY8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3Jt YWwiPjxzcGFuIGxhbmc9IkVOLVVTIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNs YXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj5UaGUgcG9zc2libGUgdXNhZ2UgYXMg Zm9sbG93aW5nOjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNw YW4gbGFuZz0iRU4tVVMiPltUYWtlIE5WTWUtb0YgdGFyZ2V0IGFzIGV4YW1wbGVdPG86cD48L286 cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+PG86 cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5n PSJFTi1VUyI+MS4mbmJzcDsgSW4gdGhlIG52bWYuY29uZiBmaWxlLCA8bzpwPjwvbzpwPjwvc3Bh bj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj4jIENvbmZpZ3Vy ZSB0aGUgUGFzc3RocnUgdmJkZXYgb24gc2FtZSBiZGV2IGxpa2UgTWFsbG9jMDxvOnA+PC9vOnA+ PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPltQYXNz dGhydV08bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxh bmc9IkVOLVVTIj5QVCBNYWxsb2MwIFBUMDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPlBUIE1hbGxvYzAgUFQxPG86cD48L286cD48 L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+PG86cD4m bmJzcDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJF Ti1VUyI+IyBUaGUgc3Vic3lzdGVtIGlzIGNvbmZpZ3VyZWQgd2l0aCBzaGFyZWFibGUgYmRldiBi eSBQYXNzdGhydSB2YmRldnM8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3Jt YWwiPjxzcGFuIGxhbmc9IkVOLVVTIj5bU3Vic3lzdGVtMl08bzpwPjwvbzpwPjwvc3Bhbj48L3A+ CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj4mbmJzcDsgTlFOIG5xbi4y MDE2LTA2LmlvLnNwZGs6Y25vZGUyPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNv Tm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+Jm5ic3A7IExpc3RlbiBSRE1BIDE5Mi4xNjguMi4y MTo0NDIwPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBs YW5nPSJFTi1VUyI+Jm5ic3A7IEFsbG93QW55SG9zdCBObzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPiZuYnNwOyBIb3N0IG5xbi4y MDE2LTA2LmlvLnNwZGs6aW5pdDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05v cm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPiZuYnNwOyBTTiBTUERLMDAwMDAwMDAwMDAwMDI8bzpw PjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVT Ij4mbmJzcDsgTmFtZXNwYWNlIFBUMCZuYnNwOyZuYnNwOyAmZ3Q7Jmd0OyZndDsmZ3Q7IFRoaXMg Y2FuIGJlIGNvbm5lY3RlZCBieSBvbmUgY2xpZW50PG86cD48L286cD48L3NwYW4+PC9wPgo8cCBj bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+Jm5ic3A7IE5hbWVzcGFjZSBQVDEm bmJzcDsmbmJzcDsgJmd0OyZndDsmZ3Q7Jmd0OyBUaGlzIGNhbiBiZSBjb25uZWN0ZWQgYnkgYW5v dGhlciBjbGllbnQ8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxz cGFuIGxhbmc9IkVOLVVTIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj4jIEFzc2lnbiBkaWZmZXJlbnQgUW9TIElPUFMg bGltaXRpbmcgb24gUGFzc3RocnUgdmJkZXZzPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFz cz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+W1FvU108bzpwPjwvbzpwPjwvc3Bhbj48 L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj5MaW1pdF9JT1BTIFBU MCAyMDAwMDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4g bGFuZz0iRU4tVVMiPkxpbWl0X0lPUFMgUFQxIDMwMDAwPG86cD48L286cD48L3NwYW4+PC9wPgo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+PG86cD4mbmJzcDs8L286cD48 L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+Mi4gVXNl IFJQQyBtZXRob2QgdG8gYWRkIHRoZSBQYXNzdGhydSB2YmRldiBhdCBydW50aW1lPG86cD48L286 cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+YS4g cHl0aG9uIC4vc2NyaXB0cy9ycGMucHkgY29uc3RydWN0X3Bhc3N0aHJ1X2JkZXYgTWFsbG9jMCBQ VDM8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9 IkVOLVVTIj5iLiBweXRob24gLi9zY3JpcHRzL3JwYy5weSBudm1mX3N1YnN5c3RlbV9hZGRfbnMg bnFuLjIwMTYtMDYuaW8uc3Bkazpjbm9kZTIgUFQzPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBj bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+Yy4gcHl0aG9uIC4vc2NyaXB0cy9y cGMucHkgZW5hYmxlX2JkZXZfcW9zIFBUMyAyMDAwMDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPjxvOnA+Jm5ic3A7PC9vOnA+PC9z cGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPklmIHRoZXJl IGlzIGFueSBjb25jZXJuIG9yIGNvbW1lbnQsIHBsZWFzZSBmZWVsIGZyZWUgdG8gbGV0IG1lIGtu b3cuPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5n PSJFTi1VUyI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFs Ij48c3BhbiBsYW5nPSJFTi1VUyI+VGhhbmtzLDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xh c3M9Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0iRU4tVVMiPkdhbmc8bzpwPjwvbzpwPjwvc3Bhbj48 L3A+CjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4K --===============5772662407141818924==--