From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============6602940988968599428==" MIME-Version: 1.0 From: Chang, Cunyin Subject: Re: [SPDK] SPDK + user space appliance Date: Thu, 18 Jan 2018 23:53:39 +0000 Message-ID: <2BFA8F2383C3784C90698C10BC0963195EF544A7@SHSMSX103.ccr.corp.intel.com> In-Reply-To: AM5PR04MB307489E0EB9C162E7F761E3D89150@AM5PR04MB3074.eurprd04.prod.outlook.com List-ID: To: spdk@lists.01.org --===============6602940988968599428== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable I suppose your use application just works as the new type "bdev" which will= be the namespace of the nvmf target? If so, the SPDK user space nvme Bdev and aio bdev should be a good reference: In general bdev layer, when you try to call spdk_bdev_register(), we provid= e the io channel creation callback as: spdk_bdev_channel_create(), In this function, we actually will try to call the backend bdev->fn_table->= get_io_channel(bdev->ctxt), this should be provided by your application, in This function, you should implement the poll function just as bdev_nvme_pol= l(), so, you could keep your our poller for the backend bdev in your own application without modify of the nvmf target driver. When the nvmf target = driver try to call spdk_bdev_get_io_channel() in the function poll_group_up= date_subsystem(), it will trigger all the process which I mentioned above. -Cunyin From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Shahar Salzman Sent: Sunday, January 14, 2018 5:10 PM To: Storage Performance Development Kit Cc: Yael Shavit ; Amir Sasson ; Ilan Steinberg Subject: [SPDK] SPDK + user space appliance Hi experts, We have been integrating spdk into our system using a blockdev module, curr= ently only a POC version. Our use case is a user space appliance processing IOs, with an SPDK fronten= d to do the NVMeF. Currently all of the user bdevs are created via configuration file, but we = are working to add functions + rpc's which allow creation/deletion of these= namespaces. IO is sent to user space via callback, implementation is up to user space, = but obviously the longer it lingers there the lower the performance, we use= a set of rings + threads processing them, so that the time spent in the ap= pliance is minimal. Going back from user space we use a single ring (multiple producers single = consumer) onto which the completions are inserted, and the ring poll functi= on is registered with spdk core (spdk_poller_register). Does this seem like a sane design? We'd really like your feedback, and if t= his can be useful to others, push the code into spdk. Obviously we are willing to go through any review/testing process that is r= equired. And share performance results and issues. Cheers, Shahar --===============6602940988968599428== 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 IDQ7fQpAZm9udC1mYWNlCgl7Zm9udC1mYW1pbHk6IlxAU2ltU3VuIjsKCXBhbm9zZS0xOjIgMSA2 IDAgMyAxIDEgMSAxIDE7fQovKiBTdHlsZSBEZWZpbml0aW9ucyAqLwpwLk1zb05vcm1hbCwgbGku TXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCgl7bWFyZ2luOjBpbjsKCW1hcmdpbi1ib3R0b206LjAw MDFwdDsKCWZvbnQtc2l6ZToxMi4wcHQ7Cglmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIixz ZXJpZjt9CmE6bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsKCXttc28tc3R5bGUtcHJpb3JpdHk6OTk7 Cgljb2xvcjojMDU2M0MxOwoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9CmE6dmlzaXRlZCwg c3Bhbi5Nc29IeXBlcmxpbmtGb2xsb3dlZAoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsKCWNvbG9y OiM5NTRGNzI7Cgl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30KcAoJe21zby1zdHlsZS1wcmlv cml0eTo5OTsKCW1hcmdpbjowaW47CgltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Cglmb250LXNpemU6 MTIuMHB0OwoJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsc2VyaWY7fQpzcGFuLkVtYWls U3R5bGUxOAoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsLXJlcGx5OwoJZm9udC1mYW1pbHk6IkNh bGlicmkiLHNhbnMtc2VyaWY7Cgljb2xvcjojMUY0OTdEO30KLk1zb0NocERlZmF1bHQKCXttc28t c3R5bGUtdHlwZTpleHBvcnQtb25seTsKCWZvbnQtc2l6ZToxMC4wcHQ7fQpAcGFnZSBXb3JkU2Vj dGlvbjEKCXtzaXplOjguNWluIDExLjBpbjsKCW1hcmdpbjoxLjBpbiAxLjBpbiAxLjBpbiAxLjBp bjt9CmRpdi5Xb3JkU2VjdGlvbjEKCXtwYWdlOldvcmRTZWN0aW9uMTt9Ci0tPjwvc3R5bGU+PCEt LVtpZiBndGUgbXNvIDldPjx4bWw+CjxvOnNoYXBlZGVmYXVsdHMgdjpleHQ9ImVkaXQiIHNwaWRt YXg9IjEwMjYiIC8+CjwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgo8 bzpzaGFwZWxheW91dCB2OmV4dD0iZWRpdCI+CjxvOmlkbWFwIHY6ZXh0PSJlZGl0IiBkYXRhPSIx IiAvPgo8L286c2hhcGVsYXlvdXQ+PC94bWw+PCFbZW5kaWZdLS0+CjwvaGVhZD4KPGJvZHkgbGFu Zz0iRU4tVVMiIGxpbms9IiMwNTYzQzEiIHZsaW5rPSIjOTU0RjcyIj4KPGRpdiBjbGFzcz0iV29y ZFNlY3Rpb24xIj4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTox MS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOiMx RjQ5N0QiPkkgc3VwcG9zZSB5b3VyIHVzZSBhcHBsaWNhdGlvbiBqdXN0IHdvcmtzIGFzIHRoZSBu ZXcgdHlwZSAmIzgyMjA7YmRldiYjODIyMTsgd2hpY2ggd2lsbCBiZSB0aGUgbmFtZXNwYWNlIG9m IHRoZSBudm1mIHRhcmdldD8gSWYgc28sIHRoZSBTUERLIHVzZXIgc3BhY2UgbnZtZTxvOnA+PC9v OnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6 ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9y OiMxRjQ5N0QiPkJkZXYgYW5kIGFpbyBiZGV2IHNob3VsZCBiZSBhIGdvb2QgcmVmZXJlbmNlPGEg bmFtZT0iX01haWxFbmRDb21wb3NlIj46PG86cD48L286cD48L2E+PC9zcGFuPjwvcD4KPHAgY2xh c3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6 JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5N0QiPkluIGdlbmVyYWwg YmRldiBsYXllciwgd2hlbiB5b3UgdHJ5IHRvIGNhbGwgc3Bka19iZGV2X3JlZ2lzdGVyKCksIHdl IHByb3ZpZGUgdGhlIGlvIGNoYW5uZWwgY3JlYXRpb24gY2FsbGJhY2sgYXM6IHNwZGtfYmRldl9j aGFubmVsX2NyZWF0ZSgpLDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1h bCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJy aSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5N0QiPkluIHRoaXMgZnVuY3Rpb24sIHdlIGFj dHVhbGx5IHdpbGwgdHJ5IHRvIGNhbGwgdGhlIGJhY2tlbmQgYmRldi0mZ3Q7Zm5fdGFibGUtJmd0 O2dldF9pb19jaGFubmVsKGJkZXYtJmd0O2N0eHQpLCB0aGlzIHNob3VsZCBiZSBwcm92aWRlZCBi eSB5b3VyIGFwcGxpY2F0aW9uLCBpbjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7 Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5N0QiPlRoaXMgZnVuY3Rpb24sIHlv dSBzaG91bGQgaW1wbGVtZW50IHRoZSBwb2xsIGZ1bmN0aW9uIGp1c3QgYXMgYmRldl9udm1lX3Bv bGwoKSwgc28sIHlvdSBjb3VsZCBrZWVwIHlvdXIgb3VyIHBvbGxlciBmb3IgdGhlIGJhY2tlbmQg YmRldiBpbiB5b3VyIG93bjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1h bCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJy aSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5N0QiPmFwcGxpY2F0aW9uIHdpdGhvdXQgbW9k aWZ5IG9mIHRoZSBudm1mIHRhcmdldCBkcml2ZXIuIFdoZW4gdGhlIG52bWYgdGFyZ2V0IGRyaXZl ciB0cnkgdG8gY2FsbCBzcGRrX2JkZXZfZ2V0X2lvX2NoYW5uZWwoKSBpbiB0aGUgZnVuY3Rpb24g cG9sbF9ncm91cF91cGRhdGVfc3Vic3lzdGVtKCksPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBj bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWls eTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6IzFGNDk3RCI+aXQgd2lsbCB0 cmlnZ2VyIGFsbCB0aGUgcHJvY2VzcyB3aGljaCBJIG1lbnRpb25lZCBhYm92ZS48bzpwPjwvbzpw Pjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6 MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJpZjtjb2xvcjoj MUY0OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkm cXVvdDssc2Fucy1zZXJpZjtjb2xvcjojMUY0OTdEIj4tQ3VueWluPG86cD48L286cD48L3NwYW4+ PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtm b250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6IzFGNDk3RCI+ PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8ZGl2IHN0eWxlPSJib3JkZXI6bm9uZTtib3Jk ZXItbGVmdDpzb2xpZCBibHVlIDEuNXB0O3BhZGRpbmc6MGluIDBpbiAwaW4gNC4wcHQiPgo8ZGl2 Pgo8ZGl2IHN0eWxlPSJib3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNFMUUxRTEgMS4wcHQ7 cGFkZGluZzozLjBwdCAwaW4gMGluIDBpbiI+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxhIG5hbWU9 Il9fX19fcmVwbHlzZXBhcmF0b3IiPjwvYT48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBw dDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWYiPkZyb206PC9zcGFu PjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxp YnJpJnF1b3Q7LHNhbnMtc2VyaWYiPiBTUERLIFttYWlsdG86c3Bkay1ib3VuY2VzQGxpc3RzLjAx Lm9yZ10KPGI+T24gQmVoYWxmIE9mIDwvYj5TaGFoYXIgU2Fsem1hbjxicj4KPGI+U2VudDo8L2I+ IFN1bmRheSwgSmFudWFyeSAxNCwgMjAxOCA1OjEwIFBNPGJyPgo8Yj5Ubzo8L2I+IFN0b3JhZ2Ug UGVyZm9ybWFuY2UgRGV2ZWxvcG1lbnQgS2l0ICZsdDtzcGRrQGxpc3RzLjAxLm9yZyZndDs8YnI+ CjxiPkNjOjwvYj4gWWFlbCBTaGF2aXQgJmx0O3lhZWwuc2hhdml0QGthbWluYXJpby5jb20mZ3Q7 OyBBbWlyIFNhc3NvbiAmbHQ7YW1pci5zYXNzb25Aa2FtaW5hcmlvLmNvbSZndDs7IElsYW4gU3Rl aW5iZXJnICZsdDtpbGFuLnN0ZWluYmVyZ0BrYW1pbmFyaW8uY29tJmd0Ozxicj4KPGI+U3ViamVj dDo8L2I+IFtTUERLXSBTUERLICYjNDM7IHVzZXIgc3BhY2UgYXBwbGlhbmNlPG86cD48L286cD48 L3NwYW4+PC9wPgo8L2Rpdj4KPC9kaXY+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7 PC9vOnA+PC9wPgo8ZGl2IGlkPSJkaXZ0YWdkZWZhdWx0d3JhcHBlciI+CjxwPjxzcGFuIHN0eWxl PSJmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6YmxhY2si PkhpIGV4cGVydHMsPG86cD48L286cD48L3NwYW4+PC9wPgo8cD48c3BhbiBzdHlsZT0iZm9udC1m YW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOmJsYWNrIj48bzpwPiZu YnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtD YWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6YmxhY2siPldlIGhhdmUgYmVlbiBpbnRlZ3Jh dGluZyBzcGRrIGludG8gb3VyIHN5c3RlbSB1c2luZyBhIGJsb2NrZGV2IG1vZHVsZSwgY3VycmVu dGx5IG9ubHkgYSBQT0MgdmVyc2lvbi48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwPjxzcGFuIHN0 eWxlPSJmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6Ymxh Y2siPk91ciB1c2UmbmJzcDtjYXNlIGlzIGEgdXNlciBzcGFjZSBhcHBsaWFuY2UgcHJvY2Vzc2lu ZyBJT3MsIHdpdGggYW4gU1BESyBmcm9udGVuZCB0byBkbyB0aGUgTlZNZUYuPG86cD48L286cD48 L3NwYW4+PC9wPgo8cD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90 OyxzYW5zLXNlcmlmO2NvbG9yOmJsYWNrIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+Cjxw PjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7 Y29sb3I6YmxhY2siPkN1cnJlbnRseSBhbGwgb2YgdGhlIHVzZXIgYmRldnMgYXJlIGNyZWF0ZWQg dmlhIGNvbmZpZ3VyYXRpb24gZmlsZSwgYnV0IHdlIGFyZSB3b3JraW5nIHRvIGFkZCBmdW5jdGlv bnMgJiM0MzsgcnBjJ3Mgd2hpY2ggYWxsb3cgY3JlYXRpb24vZGVsZXRpb24gb2YgdGhlc2UgbmFt ZXNwYWNlcy48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwPjxzcGFuIHN0eWxlPSJmb250LWZhbWls eTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6YmxhY2siPklPIGlzIHNlbnQm bmJzcDt0byB1c2VyIHNwYWNlIHZpYSBjYWxsYmFjaywmbmJzcDtpbXBsZW1lbnRhdGlvbiBpcyB1 cCB0byB1c2VyIHNwYWNlLCBidXQgb2J2aW91c2x5IHRoZSBsb25nZXIgaXQgbGluZ2VycyB0aGVy ZSB0aGUgbG93ZXIgdGhlIHBlcmZvcm1hbmNlLCB3ZSB1c2UgYSBzZXQgb2YgcmluZ3MgJiM0Mzsg dGhyZWFkcyBwcm9jZXNzaW5nIHRoZW0sIHNvCiB0aGF0IHRoZSB0aW1lIHNwZW50IGluIHRoZSBh cHBsaWFuY2UgaXMgbWluaW1hbC48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwPjxzcGFuIHN0eWxl PSJmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6YmxhY2si PkdvaW5nIGJhY2sgZnJvbSB1c2VyIHNwYWNlIHdlIHVzZSBhIHNpbmdsZSByaW5nIChtdWx0aXBs ZSBwcm9kdWNlcnMgc2luZ2xlIGNvbnN1bWVyKSBvbnRvIHdoaWNoIHRoZSBjb21wbGV0aW9ucyBh cmUgaW5zZXJ0ZWQsIGFuZCB0aGUgcmluZyBwb2xsIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQgd2l0 aCBzcGRrIGNvcmUgKHNwZGtfcG9sbGVyX3JlZ2lzdGVyKS48bzpwPjwvbzpwPjwvc3Bhbj48L3A+ CjxwPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2Vy aWY7Y29sb3I6YmxhY2siPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4KPHA+PHNwYW4gc3R5 bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJpZjtjb2xvcjpibGFj ayI+RG9lcyB0aGlzIHNlZW0gbGlrZSBhIHNhbmUgZGVzaWduPyBXZSdkIHJlYWxseSBsaWtlIHlv dXIgZmVlZGJhY2ssIGFuZCBpZiB0aGlzIGNhbiBiZSB1c2VmdWwgdG8gb3RoZXJzLCBwdXNoIHRo ZSBjb2RlIGludG8gc3Bkay48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwPjxzcGFuIHN0eWxlPSJm b250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6YmxhY2siPk9i dmlvdXNseSB3ZSBhcmUgd2lsbGluZyB0byBnbyB0aHJvdWdoIGFueSByZXZpZXcvdGVzdGluZyBw cm9jZXNzJm5ic3A7dGhhdCBpcyByZXF1aXJlZC4gQW5kIHNoYXJlIHBlcmZvcm1hbmNlIHJlc3Vs dHMgYW5kIGlzc3Vlcy48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwPjxzcGFuIHN0eWxlPSJmb250 LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6YmxhY2siPjxvOnA+ Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4KPHA+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90 O0NhbGlicmkmcXVvdDssc2Fucy1zZXJpZjtjb2xvcjpibGFjayI+Q2hlZXJzLDxvOnA+PC9vOnA+ PC9zcGFuPjwvcD4KPHA+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVv dDssc2Fucy1zZXJpZjtjb2xvcjpibGFjayI+U2hhaGFyPG86cD48L286cD48L3NwYW4+PC9wPgo8 L2Rpdj4KPC9kaXY+CjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4K --===============6602940988968599428==--