From mboxrd@z Thu Jan 1 00:00:00 1970 From: Juergen Gross Subject: Re: [DRAFT 1] XenSock protocol design document Date: Fri, 8 Jul 2016 14:14:27 +0200 Message-ID: <577F9923.5010406@suse.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bLUfv-0004jM-EL for xen-devel@lists.xenproject.org; Fri, 08 Jul 2016 12:14:31 +0000 In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Stefano Stabellini , xen-devel@lists.xenproject.org Cc: lars.kurth@citrix.com, wei.liu2@citrix.com, david.vrabel@citrix.com, boris.ostrovsky@oracle.com, joao.m.martins@oracle.com, roger.pau@citrix.com List-Id: xen-devel@lists.xenproject.org T24gMDgvMDcvMTYgMTM6MjMsIFN0ZWZhbm8gU3RhYmVsbGluaSB3cm90ZToKPiBIaSBhbGwsCj4g Cj4gYXMgcHJvbWlzZWQsIHRoaXMgaXMgdGhlIGRlc2lnbiBkb2N1bWVudCBmb3IgdGhlIFhlblNv Y2sgcHJvdG9jb2wgSQo+IG1lbnRpb25lZCBoZXJlOgo+IAo+IGh0dHA6Ly9tYXJjLmluZm8vP2w9 eGVuLWRldmVsJm09MTQ2NTIwNTcyNDI4NTgxCj4gCj4gSXQgaXMgc3RpbGwgaW4gaXRzIGVhcmx5 IGRheXMgYnV0IHNob3VsZCBnaXZlIHlvdSBhIGdvb2QgaWRlYSBvZiBob3cgaXQKPiBsb29rcyBs aWtlIGFuZCBob3cgaXQgaXMgc3VwcG9zZWQgdG8gd29yay4gTGV0IG1lIGtub3cgaWYgeW91IGZp bmQgZ2Fwcwo+IGluIHRoZSBkb2N1bWVudCBhbmQgSSdsbCBmaWxsIHRoZW0gaW4gdGhlIG5leHQg dmVyc2lvbi4KPiAKPiBZb3UgY2FuIGZpbmQgcHJvdG90eXBlcyBvZiB0aGUgTGludXggZnJvbnRl bmQgYW5kIGJhY2tlbmQgZHJpdmVycyBoZXJlOgo+IAo+IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1 Yi9zY20vbGludXgva2VybmVsL2dpdC9zc3RhYmVsbGluaS94ZW4uZ2l0IHhlbnNvY2stMQo+IAo+ IFRvIHVzZSB0aGVtLCBtYWtlIHN1cmUgdG8gZW5hYmxlIENPTkZJR19YRU5TT0NLIGluIHlvdXIg a2VybmVsIGNvbmZpZwo+IGFuZCBhZGQgInhlbnNvY2s9MSIgdG8gdGhlIGNvbW1hbmQgbGluZSBv ZiB5b3VyIERvbVUgTGludXgga2VybmVsLiBZb3UKPiBhbHNvIG5lZWQgdGhlIHRvb2xzdGFjayB0 byBjcmVhdGUgdGhlIGluaXRpYWwgeGVuc3RvcmUgbm9kZXMgZm9yIHRoZQo+IHByb3RvY29sLiBU byBkbyB0aGF0LCBwbGVhc2UgYXBwbHkgdGhlIGF0dGFjaGVkIHBhdGNoIHRvIGxpYnhsICh0aGUK PiBwYXRjaCBpcyBiYXNlZCBvbiBYZW4gNC43LjAtcmMzKSBhbmQgYWRkICJ4ZW5zb2NrPTEiIHRv IHlvdXIgRG9tVSBjb25maWcKPiBmaWxlLgo+IAo+IEZlZWwgZnJlZSB0byB0cnkgdGhlbSBvdXQh IFBsZWFzZSBiZSBraW5kLCB0aGV5IGFyZSBvbmx5IHByb3RvdHlwZXMgd2l0aAo+IGEgZmV3IGtu b3duIGlzc3VlcyA6LSkgQnV0IHRoZXkgc2hvdWxkIHdvcmsgd2VsbCBlbm91Z2ggdG8gcnVuIHNp bXBsZQo+IHRlc3RzLiBJZiB5b3UgZmluZCBzb21ldGhpbmcgbWlzc2luZywgbGV0IG1lIGtub3cg b3IsIGV2ZW4gYmV0dGVyLCB3cml0ZQo+IGEgcGF0Y2ghCj4gCj4gSSdsbCBmb2xsb3cgdXAgd2l0 aCBhIHNlcGFyYXRlIGRvY3VtZW50IHRvIGNvdmVyIHRoZSBkZXNpZ24gb2YgbXkKPiBwYXJ0aWN1 bGFyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwcm90b2NvbC4KPiAKPiBDaGVlcnMsCj4gCj4gU3Rl ZmFubwo+IAo+IC0tLQo+IAo+ICMgWGVuU29ja3MgUHJvdG9jb2wgdjEKPiAKPiAjIyBSYXRpb25h bGUKPiAKPiBYZW5Tb2NrcyBpcyBhIHBhcmF2aXJ0dWFsaXplZCBwcm90b2NvbCBmb3IgdGhlIFBP U0lYIHNvY2tldCBBUEkuCj4gCj4gVGhlIHB1cnBvc2Ugb2YgWGVuU29ja3MgaXMgdG8gYWxsb3cg dGhlIGltcGxlbWVudGF0aW9uIG9mIGEgc3BlY2lmaWMgc2V0Cj4gb2YgUE9TSVggY2FsbHMgdG8g YmUgZG9uZSBpbiBhIGRvbWFpbiBvdGhlciB0aGFuIHlvdXIgb3duLiBJdCBhbGxvd3MKPiBjb25u ZWN0LCBhY2NlcHQsIGJpbmQsIHJlbGVhc2UsIGxpc3RlbiwgcG9sbCwgcmVjdm1zZyBhbmQgc2Vu ZG1zZyB0byBiZQo+IGltcGxlbWVudGVkIGluIGFub3RoZXIgZG9tYWluLgo+IAo+IFhlblNvY2tz IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgYmVuZWZpdHM6Cj4gKiBndWVzdCBuZXR3b3JraW5nIHdv cmtzIG91dCBvZiB0aGUgYm94IHdpdGggVlBOcywgd2lyZWxlc3MgbmV0d29ya3MgYW5kCj4gICBh bnkgb3RoZXIgY29tcGxleCBjb25maWd1cmF0aW9ucyBvbiB0aGUgaG9zdAo+ICogZ3Vlc3Qgc2Vy dmljZXMgbGlzdGVuIG9uIHBvcnRzIGJvdW5kIGRpcmVjdGx5IHRvIHRoZSBiYWNrZW5kIGRvbWFp biBJUAo+ICAgYWRkcmVzc2VzCj4gKiBsb2NhbGhvc3QgYmVjb21lcyBhIHNlY3VyZSBuYW1lc3Bh Y2UgZm9yIGludHJhLVZNcyBjb21tdW5pY2F0aW9ucwo+ICogZnVsbCB2aXNpYmlsaXR5IG9mIHRo ZSBndWVzdCBiZWhhdmlvciBvbiB0aGUgYmFja2VuZCBkb21haW4sIGFsbG93aW5nCj4gICBmb3Ig aW5leHBlbnNpdmUgZmlsdGVyaW5nIGFuZCBtYW5pcHVsYXRpb24gb2YgYW55IGd1ZXN0IGNhbGxz Cj4gKiBleGNlbGxlbnQgcGVyZm9ybWFuY2UKPiAKPiAKPiAjIyBEZXNpZ24KPiAKPiAjIyMgWGVu c3RvcmUKPiAKPiBUaGUgZnJvbnRlbmQgYW5kIHRoZSBiYWNrZW5kIGNvbm5lY3QgdG8gZWFjaCBv dGhlciBleGNoYW5naW5nIGluZm9ybWF0aW9uIHZpYQo+IHhlbnN0b3JlLiBUaGUgdG9vbHN0YWNr IGNyZWF0ZXMgZnJvbnQgYW5kIGJhY2sgbm9kZXMgd2l0aCBzdGF0ZQo+IFhlbmJ1c1N0YXRlSW5p dGlhbGlzaW5nLiBUaGVyZSBjYW4gb25seSBiZSBvbmUgWGVuU29jayBmcm9udGVuZCBwZXIgZG9t YWluLgo+IAo+ICMjIyMgRnJvbnRlbmQgWGVuQnVzIE5vZGVzCj4gCj4gcG9ydAo+ICAgICAgVmFs dWVzOiAgICAgICAgIDx1aW50MzJfdD4KPiAKPiAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBY ZW4gZXZlbnQgY2hhbm5lbCB1c2VkIHRvIHNpZ25hbCBhY3Rpdml0eQo+ICAgICAgaW4gdGhlIHJp bmcgYnVmZmVyLgo+IAo+IHJpbmctcmVmCj4gICAgICBWYWx1ZXM6ICAgICAgICAgPHVpbnQzMl90 Pgo+IAo+ICAgICAgVGhlIFhlbiBncmFudCByZWZlcmVuY2UgZ3JhbnRpbmcgcGVybWlzc2lvbiBm b3IgdGhlIGJhY2tlbmQgdG8gbWFwCj4gICAgICB0aGUgc29sZSBwYWdlIGluIGEgc2luZ2xlIHBh Z2Ugc2l6ZWQgcmluZyBidWZmZXIuCj4gCj4gCj4gIyMjIyBTdGF0ZSBNYWNoaW5lCj4gCj4gICAg ICoqRnJvbnQqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipCYWNrKioKPiAgICAgWGVu YnVzU3RhdGVJbml0aWFsaXNpbmcgICAgICAgICAgICAgICBYZW5idXNTdGF0ZUluaXRpYWxpc2lu Zwo+ICAgICAtIFF1ZXJ5IHZpcnR1YWwgZGV2aWNlICAgICAgICAgICAgICAgIC0gUXVlcnkgYmFj a2VuZCBkZXZpY2UKPiAgICAgICBwcm9wZXJ0aWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAg IGlkZW50aWZpY2F0aW9uIGRhdGEuCj4gICAgIC0gU2V0dXAgT1MgZGV2aWNlIGluc3RhbmNlLiAg ICAgICAgICAgICAgICAgICAgICAgICAgfAo+ICAgICAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXpl IHRoZSAgICAgICAgICAgICAgICAgICAgICAgIHwKPiAgICAgICByZXF1ZXN0IHJpbmcuICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWCj4gICAgIC0gUHVibGlzaCB0cmFuc3Bv cnQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICBYZW5idXNTdGF0ZUluaXRXYWl0Cj4gICAgICAg dGhhdCB3aWxsIGJlIGluIGVmZmVjdCBkdXJpbmcKPiAgICAgICB0aGlzIGNvbm5lY3Rpb24uCj4g ICAgICAgICAgICAgICAgICB8Cj4gICAgICAgICAgICAgICAgICB8Cj4gICAgICAgICAgICAgICAg ICBWCj4gICAgICAgIFhlbmJ1c1N0YXRlSW5pdGlhbGlzZWQKPiAKPiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAtIFF1ZXJ5IGZyb250ZW5kIHRyYW5zcG9ydCBwYXJh bWV0ZXJzLgo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQ29u bmVjdCB0byB0aGUgcmVxdWVzdCByaW5nIGFuZAo+ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgZXZlbnQgY2hhbm5lbC4KPiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cj4gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAo+ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYKPiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWGVuYnVzU3RhdGVDb25uZWN0 ZWQKPiAKPiAgICAgIC0gUXVlcnkgYmFja2VuZCBkZXZpY2UgcHJvcGVydGllcy4KPiAgICAgIC0g RmluYWxpemUgT1MgdmlydHVhbCBkZXZpY2UKPiAgICAgICAgaW5zdGFuY2UuCj4gICAgICAgICAg ICAgICAgICB8Cj4gICAgICAgICAgICAgICAgICB8Cj4gICAgICAgICAgICAgICAgICBWCj4gICAg ICAgICBYZW5idXNTdGF0ZUNvbm5lY3RlZAo+IAo+IE9uY2UgZnJvbnRlbmQgYW5kIGJhY2tlbmQg YXJlIGNvbm5lY3RlZCwgdGhleSBoYXZlIGEgc2hhcmVkIHBhZ2UsIHdoaWNoCj4gd2lsbCBpcyB1 c2VkIHRvIGV4Y2hhbmdlIG1lc3NhZ2VzIG92ZXIgYSByaW5nLCBhbmQgYW4gZXZlbnQgY2hhbm5l bCwKPiB3aGljaCBpcyB1c2VkIHRvIHNlbmQgbm90aWZpY2F0aW9ucy4KPiAKPiAKPiAjIyMgQ29t bWFuZHMgUmluZwo+IAo+IFRoZSBzaGFyZWQgcmluZyBpcyB1c2VkIGJ5IHRoZSBmcm9udGVuZCB0 byBmb3J3YXJkIHNvY2tldCBBUEkgY2FsbHMgdG8gdGhlCj4gYmFja2VuZC4gSSdsbCByZWZlciB0 byB0aGlzIHJpbmcgYXMgKipjb21tYW5kcyByaW5nKiogdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbQo+ IG90aGVyIHJpbmdzIHdoaWNoIHdpbGwgYmUgY3JlYXRlZCBsYXRlciBpbiB0aGUgbGlmZWN5Y2xl IG9mIHRoZSBwcm90b2NvbCAoZGF0YQo+IHJpbmdzKS4gVGhlIHJpbmcgZm9ybWF0IGlzIGRlZmlu ZWQgdXNpbmcgdGhlIGZhbWlsaWFyIGBERUZJTkVfUklOR19UWVBFU2AgbWFjcm8KPiAoYHhlbi9p bmNsdWRlL3B1YmxpYy9pby9yaW5nLmhgKS4gRnJvbnRlbmQgcmVxdWVzdHMgYXJlIGFsbG9jYXRl ZCBvbiB0aGUgcmluZwo+IHVzaW5nIHRoZSBgUklOR19HRVRfUkVRVUVTVGAgbWFjcm8uCj4gCj4g VGhlIGZvcm1hdCBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6Cj4gCj4gICAgICNkZWZpbmUgWEVOU09D S19EQVRBUklOR19PUkRFUiA2Cj4gICAgICNkZWZpbmUgWEVOU09DS19EQVRBUklOR19QQUdFUyAo MSA8PCBYRU5TT0NLX0RBVEFSSU5HX09SREVSKQo+ICAgICAjZGVmaW5lIFhFTlNPQ0tfREFUQVJJ TkdfU0laRSAoWEVOU09DS19EQVRBUklOR19QQUdFUyA8PCBQQUdFX1NISUZUKQo+ICAgICAKPiAg ICAgI2RlZmluZSBYRU5TT0NLX0NPTk5FQ1QgICAgICAgIDAKPiAgICAgI2RlZmluZSBYRU5TT0NL X1JFTEVBU0UgICAgICAgIDMKPiAgICAgI2RlZmluZSBYRU5TT0NLX0JJTkQgICAgICAgICAgIDQK PiAgICAgI2RlZmluZSBYRU5TT0NLX0xJU1RFTiAgICAgICAgIDUKPiAgICAgI2RlZmluZSBYRU5T T0NLX0FDQ0VQVCAgICAgICAgIDYKPiAgICAgI2RlZmluZSBYRU5TT0NLX1BPTEwgICAgICAgICAg IDcKPiAgICAgCj4gICAgIHN0cnVjdCB4ZW5feGVuc29ja19yZXF1ZXN0IHsKPiAgICAgICAgIHVp bnQzMl90IGlkOyAgICAgLyogcHJpdmF0ZSB0byBndWVzdCwgZWNob2VkIGluIHJlc3BvbnNlICov Cj4gICAgICAgICB1aW50MzJfdCBjbWQ7ICAgIC8qIGNvbW1hbmQgdG8gZXhlY3V0ZSAqLwo+ICAg ICAgICAgdWludDY0X3Qgc29ja2lkOyAvKiBpZCBvZiB0aGUgc29ja2V0ICovCj4gICAgICAgICB1 bmlvbiB7Cj4gICAgICAgICAgICAgc3RydWN0IHhlbl94ZW5zb2NrX2Nvbm5lY3Qgewo+ICAgICAg ICAgICAgICAgICB1aW50OF90IGFkZHJbMjhdOwo+ICAgICAgICAgICAgICAgICB1aW50MzJfdCBs ZW47Cj4gICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzOwo+ICAgICAgICAgICAgICAgICBn cmFudF9yZWZfdCByZWZbWEVOU09DS19EQVRBUklOR19QQUdFU107Cj4gICAgICAgICAgICAgICAg IHVpbnQzMl90IGV2dGNobjsKPiAgICAgICAgICAgICB9IGNvbm5lY3Q7Cj4gICAgICAgICAgICAg c3RydWN0IHhlbl94ZW5zb2NrX2JpbmQgewo+ICAgICAgICAgICAgICAgICB1aW50OF90IGFkZHJb MjhdOyAvKiBpcHY2IHJlYWR5ICovCj4gICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlbjsKPiAg ICAgICAgICAgICB9IGJpbmQ7Cj4gICAgICAgICAgICAgc3RydWN0IHhlbl94ZW5zb2NrX2FjY2Vw dCB7Cj4gICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNvY2tpZDsKPiAgICAgICAgICAgICAgICAg Z3JhbnRfcmVmX3QgcmVmW1hFTlNPQ0tfREFUQVJJTkdfUEFHRVNdOwo+ICAgICAgICAgICAgICAg ICB1aW50MzJfdCBldnRjaG47Cj4gICAgICAgICAgICAgfSBhY2NlcHQ7Cj4gICAgICAgICB9IHU7 Cj4gICAgIH07CgpCZWxvdyB5b3Ugd3JpdGUgdGhlIGRhdGEgcmluZyBpcyBmbGV4aWJsZSBhbmQg Y2FuIHN1cHBvcnQgZGlmZmVyZW50CnJpbmcgc2l6ZXMuIFRoaXMgaXMgaW4gY29udHJhZGljdGlv biB0byB0aGUgZGVmaW5pdGlvbiBhYm92ZTogYXMgc29vbgphcyB5b3UgbW9kaWZ5IHRoZSByaW5n IHNpemUgeW91IGNoYW5nZSB0aGUgaW50ZXJmYWNlLiBZb3UnZCBoYXZlIHRvCm1vZGlmeSBhbGwg Z3Vlc3RzIGFuZCB0aGUgaG9zdCBhdCB0aGUgc2FtZSB0aW1lLgoKVGhlIGZsZXhpYmlsaXR5IHNo b3VsZCBiZSBrZXB0LCBzbyBJIHN1Z2dlc3QgcmluZyBzaXplIG5lZ290aWF0aW9uIHZpYQp4ZW5z dG9yZTogdGhlIGJhY2tlbmQgc2hvdWxkIGluZGljYXRlIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBz aXplIGFuZAp0aGUgZnJvbnRlbmQgc2hvdWxkIHRlbGwgd2hpY2ggc2l6ZSBpdCBpcyB1c2luZy4g SW4gdGhlIGJlZ2lubmluZyBJJ2QKc2VlIG5vIHByb2JsZW0gd2l0aCBhY2NlcHRpbmcgY29ubmVj dGlvbiBvbmx5IGlmIGJvdGggdmFsdWVzIGFyZQpYRU5TT0NLX0RBVEFSSU5HX1BBR0VTLgoKVGhl IGNvbm5lY3QgYW5kIGFjY2VwdCBjYWxscyBzaG91bGQgcmVmZXJlbmNlIG9ubHkgb25lIHBhZ2Ug KHBvc3NpYmx5CndpdGggYW4gb2Zmc2V0IGludG8gdGhhdCBwYWdlKSBob2xkaW5nIHRoZSBncmFu dF9yZWZfdCBhcnJheSBvZiB0aGUKbmVlZGVkIHNpemUuCgo+IAo+IFRoZSBmaXJzdCB0aHJlZSBm aWVsZHMgYXJlIGNvbW1vbiBmb3IgZXZlcnkgY29tbWFuZC4gVGhlaXIgYmluYXJ5IGxheW91dAo+ IGlzOgo+IAo+ICAgICAwICAgICAgIDQgICAgICAgOCAgICAgICAxMiAgICAgIDE2Cj4gICAgICst LS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwo+ICAgICB8ICBpZCAgIHwgIGNtZCAgfCAg ICAgc29ja2lkICAgIHwKPiAgICAgKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCj4g Cj4gLSAqKmlkKiogaXMgZ2VuZXJhdGVkIGJ5IHRoZSBmcm9udGVuZCBhbmQgaWRlbnRpZmllcyBv bmUgc3BlY2lmaWMgcmVxdWVzdAo+IC0gKipjbWQqKiBpcyB0aGUgY29tbWFuZCByZXF1ZXN0ZWQg YnkgdGhlIGZyb250ZW5kOgo+ICAgICAtIGBYRU5TT0NLX0NPTk5FQ1RgOiAwCj4gICAgIC0gYFhF TlNPQ0tfUkVMRUFTRWA6IDMKPiAgICAgLSBgWEVOU09DS19CSU5EYDogICAgNAo+ICAgICAtIGBY RU5TT0NLX0xJU1RFTmA6ICA1Cj4gICAgIC0gYFhFTlNPQ0tfQUNDRVBUYDogIDYKPiAgICAgLSBg WEVOU09DS19QT0xMYDogICAgNwoKQW55IHJlYXNvbiBmb3Igb21pdHRpbmcgdGhlIHZhbHVlcyAx IGFuZCAyPwoKPiAtICoqc29ja2lkKiogaXMgZ2VuZXJhdGVkIGJ5IHRoZSBmcm9udGVuZCBhbmQg aWRlbnRpZmllcyB0aGUgc29ja2V0IHRvIGNvbm5lY3QsCj4gICBiaW5kLCBldGMuIEEgbmV3IHNv Y2tpZCBpcyByZXF1aXJlZCBvbiBgWEVOU09DS19DT05ORUNUYCBhbmQgYFhFTlNPQ0tfQklORGAK PiAgIGNvbW1hbmRzLiBBIG5ldyBzb2NraWQgaXMgYWxzbyByZXF1aXJlZCBvbiBgWEVOU09DS19B Q0NFUFRgLCBmb3IgdGhlIG5ldwo+ICAgc29ja2V0Lgo+ICAgCj4gQWxsIHRocmVlIGZpZWxkcyBh cmUgZWNob2VkIGJhY2sgYnkgdGhlIGJhY2tlbmQuCj4gCj4gQXMgZm9yIHRoZSBvdGhlciBYZW4g cmluZyBiYXNlZCBwcm90b2NvbHMsIGFmdGVyIHdyaXRpbmcgYSByZXF1ZXN0IHRvIHRoZSByaW5n LAo+IHRoZSBmcm9udGVuZCBjYWxscyBgUklOR19QVVNIX1JFUVVFU1RTX0FORF9DSEVDS19OT1RJ RllgIGFuZCBpc3N1ZXMgYW4gZXZlbnQKPiBjaGFubmVsIG5vdGlmaWNhdGlvbiB3aGVuIGEgbm90 aWZpY2F0aW9uIGlzIHJlcXVpcmVkLgo+IAo+IEJhY2tlbmQgcmVzcG9uc2VzIGFyZSBhbGxvY2F0 ZWQgb24gdGhlIHJpbmcgdXNpbmcgdGhlIGBSSU5HX0dFVF9SRVNQT05TRWAgbWFjcm8uCj4gVGhl IGZvcm1hdCBpcyB0aGUgZm9sbG93aW5nOgo+IAo+ICAgICBzdHJ1Y3QgeGVuX3hlbnNvY2tfcmVz cG9uc2Ugewo+ICAgICAgICAgdWludDMyX3QgaWQ7Cj4gICAgICAgICB1aW50MzJfdCBjbWQ7Cj4g ICAgICAgICB1aW50NjRfdCBzb2NraWQ7Cj4gICAgICAgICBpbnQzMl90IHJldDsKPiAgICAgfTsK PiAgICAKPiAgICAgMCAgICAgICA0ICAgICAgIDggICAgICAgMTIgICAgICAxNiAgICAgIDIwCj4g ICAgICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCj4gICAgIHwgIGlk ICAgfCAgY21kICB8ICAgICBzb2NraWQgICAgfCAgcmV0ICB8Cj4gICAgICstLS0tLS0tKy0tLS0t LS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCj4gCj4gLSAqKmlkKio6IGVjaG9lZCBiYWNrIGZy b20gcmVxdWVzdAo+IC0gKipjbWQqKjogZWNob2VkIGJhY2sgZnJvbSByZXF1ZXN0Cj4gLSAqKnNv Y2tpZCoqOiBlY2hvZWQgYmFjayBmcm9tIHJlcXVlc3QKPiAtICoqcmV0Kio6IHJldHVybiB2YWx1 ZSwgaWRlbnRpZmllcyBzdWNjZXNzIG9yIGZhaWx1cmUKPiAKPiBBZnRlciBjYWxsaW5nIGBSSU5H X1BVU0hfUkVTUE9OU0VTX0FORF9DSEVDS19OT1RJRllgLCB0aGUgYmFja2VuZCBjaGVja3Mgd2hl dGhlcgo+IGl0IG5lZWRzIHRvIG5vdGlmeSB0aGUgZnJvbnRlbmQgYW5kIGRvZXMgc28gdmlhIGV2 ZW50IGNoYW5uZWwuCj4gCj4gQSBkZXNjcmlwdGlvbiBvZiBlYWNoIGNvbW1hbmQsIHRoZWlyIGFk ZGl0aW9uYWwgcmVxdWVzdCBmaWVsZHMgYW5kIHRoZQo+IGV4cGVjdGVkIHJlc3BvbnNlcyBmb2xs b3cuCj4gCj4gCj4gIyMjIyBDb25uZWN0Cj4gCj4gVGhlICoqY29ubmVjdCoqIG9wZXJhdGlvbiBj b3JyZXNwb25kcyB0byB0aGUgY29ubmVjdCBzeXN0ZW0gY2FsbC4gSXQgY29ubmVjdHMgYQo+IHNv Y2tldCB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuICoqc29ja2lkKiogaXMgZnJlZWx5IGNob3Nl biBieSB0aGUgZnJvbnRlbmQgYW5kCj4gcmVmZXJlbmNlcyB0aGlzIHNwZWNpZmljIHNvY2tldCBm cm9tIHRoaXMgcG9pbnQgZm9yd2FyZC4KPiAKPiBUaGUgY29ubmVjdCBvcGVyYXRpb24gY3JlYXRl cyBhIG5ldyBzaGFyZWQgcmluZywgd2hpY2ggd2UnbGwgY2FsbCAqKmRhdGEgcmluZyoqLgo+IFRo ZSBuZXcgcmluZyBpcyB1c2VkIHRvIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSBvdmVyIHRoZSBjb25u ZWN0ZWQgc29ja2V0Lgo+IEluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBzZXR1cCB0aGUgbmV3IHJp bmcsIHN1Y2ggYXMgZ3JhbnQgdGFibGUgcmVmZXJlbmNlcyBhbmQKPiBldmVudCBjaGFubmVsIHBv cnRzLCBhcmUgcGFzc2VkIGZyb20gdGhlIGZyb250ZW5kIHRvIHRoZSBiYWNrZW5kIGFzIHBhcnQg b2YKPiB0aGlzIHJlcXVlc3QuIEEgKipkYXRhIHJpbmcqKiBpcyB1bm1hcHBlZCBhbmQgZnJlZWQg dXBvbiBpc3N1aW5nIGEgKipyZWxlYXNlKioKPiBjb21tYW5kIG9uIHRoZSBhY3RpdmUgc29ja2V0 IGlkZW50aWZpZWQgYnkgKipzb2NraWQqKi4KPiAKPiBXaGVuIHRoZSBmcm9udGVuZCBpc3N1ZXMg YSAqKmNvbm5lY3QqKiBjb21tYW5kLCB0aGUgYmFja2VuZDoKPiAtIGNyZWF0ZXMgYSBuZXcgc29j a2V0IGFuZCBjb25uZWN0cyBpdCB0byAqKmFkZHIqKgo+IC0gY3JlYXRlcyBhbiBpbnRlcm5hbCBt YXBwaW5nIGZyb20gKipzb2NraWQqKiB0byBpdHMgb3duIHNvY2tldAo+IC0gbWFwcyBhbGwgdGhl IGdyYW50IHJlZmVyZW5jZXMgYW5kIHVzZXMgdGhlbSBhcyBzaGFyZWQgbWVtb3J5IGZvciB0aGUg bmV3IGRhdGEKPiAgIHJpbmcKPiAtIGJpbmQgdGhlICoqZXZ0Y2huKioKPiAtIHJlcGxpZXMgdG8g dGhlIGZyb250ZW5kCj4gCj4gVGhlIGRhdGEgcmluZyBmb3JtYXQgd2lsbCBiZSBkZXNjcmliZWQg aW4gdGhlIGZvbGxvd2luZyBzZWN0aW9uLgo+IAo+IEZpZWxkczoKPiAKPiAtICoqY21kKiogdmFs dWU6IDAKPiAtIGFkZGl0aW9uYWwgZmllbGRzOgo+ICAgLSAqKmFkZHIqKjogYWRkcmVzcyB0byBj b25uZWN0IHRvLCBpbiBzdHJ1Y3Qgc29ja2FkZHIgZm9ybWF0CgpTbyB5b3UgZXhwZWN0IG9ubHkg TGludXggZ3Vlc3RzIHdpdGggdGhlIGN1cnJlbnQgc29ja2FkZHIgbGF5b3V0PwpQbGVhc2Ugc3Bl Y2lmeSB0aGUgc3RydWN0dXJlIGluIHRoZSBpbnRlcmZhY2UuCgo+ICAgLSAqKmxlbioqOiBhZGRy ZXNzIGxlbmd0aAo+ICAgLSAqKmZsYWdzKio6IGZsYWdzIGZvciB0aGUgY29ubmVjdGlvbiwgcmVz ZXJ2ZWQgZm9yIGZ1dHVyZSB1c2FnZQo+ICAgLSAqKnJlZioqOiBncmFudCByZWZlcmVuY2VzIG9m IHRoZSBkYXRhIHJpbmcKPiAgIC0gKipldnRjaG4qKjogcG9ydCBudW1iZXIgb2YgdGhlIGV2dGNo biB0byBzaWduYWwgYWN0aXZpdHkgb24gdGhlIGRhdGEgcmluZwo+IAo+IEJpbmFyeSBsYXlvdXQ6 Cj4gCj4gICAgICAgICAxNiAgICAgIDIwICAgICAgMjQgICAgICAyOCAgICAgIDMyICAgICAgMzYg ICAgICA0MCAgICAgIDQ0ICAgICA0OAo+ICAgICAgICAgKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0t Ky0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKPiAgICAgICAgIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgYWRkciAgICAgICAgICAgICAgICAgICAgICAgfCAgbGVu ICB8Cj4gICAgICAgICArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0t LS0tLS0rLS0tLS0tLSstLS0tLS0tKwo+ICAgICAgICAgfCBmbGFncyB8cmVmWzBdIHxyZWZbMV0g fHJlZlsyXSB8cmVmWzNdIHxyZWZbNF0gfHJlZls1XSB8cmVmWzZdIHwKPiAgICAgICAgICstLS0t LS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0t LS0rCj4gICAgICAgICB8cmVmWzddIHxyZWZbOF0gfHJlZls5XSB8cmVmWzEwXXxyZWZbMTFdfHJl ZlsxMl18cmVmWzEzXXxyZWZbMTRdfAo+ICAgICAgICAgKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0t Ky0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKPiAgICAgICAgIHxyZWZb MTVdfHJlZlsxNl18cmVmWzE3XXxyZWZbMThdfHJlZlsxOV18cmVmWzIwXXxyZWZbMjFdfHJlZlsy Ml18Cj4gICAgICAgICArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0t LS0tLS0rLS0tLS0tLSstLS0tLS0tKwo+ICAgICAgICAgfHJlZlsyM118cmVmWzI0XXxyZWZbMjVd fHJlZlsyNl18cmVmWzI3XXxyZWZbMjhdfHJlZlsyOV18cmVmWzMwXXwKPiAgICAgICAgICstLS0t LS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0t LS0rCj4gICAgICAgICB8cmVmWzMxXXxyZWZbMzJdfHJlZlszM118cmVmWzM0XXxyZWZbMzVdfHJl ZlszNl18cmVmWzM3XXxyZWZbMzhdfAo+ICAgICAgICAgKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0t Ky0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKPiAgICAgICAgIHxyZWZb MzldfHJlZls0MF18cmVmWzQxXXxyZWZbNDJdfHJlZls0M118cmVmWzQ0XXxyZWZbNDVdfHJlZls0 Nl18Cj4gICAgICAgICArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0t LS0tLS0rLS0tLS0tLSstLS0tLS0tKwo+ICAgICAgICAgfHJlZls0N118cmVmWzQ4XXxyZWZbNDld fHJlZls1MF18cmVmWzUxXXxyZWZbNTJdfHJlZls1M118cmVmWzU0XXwKPiAgICAgICAgICstLS0t LS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0t LS0rCj4gICAgICAgICB8cmVmWzU1XXxyZWZbNTZdfHJlZls1N118cmVmWzU4XXxyZWZbNTldfHJl Zls2MF18cmVmWzYxXXxyZWZbNjJdfAo+ICAgICAgICAgKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0t Ky0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKPiAgICAgICAgIHxyZWZb NjNdfGV2dGNobiB8ICAKPiAgICAgICAgICstLS0tLS0tKy0tLS0tLS0rCj4gCj4gUmV0dXJuIHZh bHVlOgo+IAo+ICAgLSAwIG9uIHN1Y2Nlc3MKPiAgIC0gbGVzcyB0aGFuIDAgb24gZmFpbHVyZSwg c2VlIHRoZSBlcnJvciBjb2RlcyBvZiB0aGUgc29ja2V0IHN5c3RlbSBjYWxsCgpBZ2FpbjogZG9u J3QgdGhpbmsgb25seSBMaW51eC4KCj4gCj4gIyMjIyBSZWxlYXNlCj4gCj4gVGhlICoqcmVsZWFz ZSoqIG9wZXJhdGlvbiBjbG9zZXMgYW4gZXhpc3RpbmcgYWN0aXZlIG9yIGEgcGFzc2l2ZSBzb2Nr ZXQuCj4gCj4gV2hlbiBhIHJlbGVhc2UgY29tbWFuZCBpcyBpc3N1ZWQgb24gYSBwYXNzaXZlIHNv Y2tldCwgdGhlIGJhY2tlbmQgcmVsZWFzZXMgaXQKPiBhbmQgZnJlZXMgaXRzIGludGVybmFsIG1h cHBpbmdzLiBXaGVuIGEgcmVsZWFzZSBjb21tYW5kIGlzIGlzc3VlZCBmb3IgYW4gYWN0aXZlCj4g c29ja2V0LCB0aGUgZGF0YSByaW5nIGlzIGFsc28gdW5tYXBwZWQgYW5kIGZyZWVkOgo+IAo+IC0g ZnJvbnRlbmQgc2VuZHMgcmVsZWFzZSBjb21tYW5kIGZvciBhbiBhY3RpdmUgc29ja2V0Cj4gLSBi YWNrZW5kIHJlbGVhc2VzIHRoZSBzb2NrZXQKPiAtIGJhY2tlbmQgdW5tYXBzIHRoZSByaW5nCj4g LSBiYWNrZW5kIHVuYmluZHMgdGhlIGV2dGNobgo+IC0gYmFja2VuZCByZXBsaWVzIHRvIGZyb250 ZW5kCj4gLSBmcm9udGVuZCBmcmVlcyByaW5nIGFuZCB1bmJpbmRzIGV2dGNobgo+IAo+IEZpZWxk czoKPiAKPiAtICoqY21kKiogdmFsdWU6IDMKPiAtIGFkZGl0aW9uYWwgZmllbGRzOiBub25lCj4g Cj4gUmV0dXJuIHZhbHVlOgo+IAo+ICAgLSAwIG9uIHN1Y2Nlc3MKPiAgIC0gbGVzcyB0aGFuIDAg b24gZmFpbHVyZSwgc2VlIHRoZSBlcnJvciBjb2RlcyBvZiB0aGUgc2h1dGRvd24gc3lzdGVtIGNh bGwKCkFnYWluIExpbnV4IG9ubHkuCgo+IAo+ICMjIyMgQmluZAo+IAo+IFRoZSAqKmJpbmQqKiBv cGVyYXRpb24gYXNzaWducyB0aGUgYWRkcmVzcyBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHRoZSBz b2NrZXQuCj4gSXQgY29ycmVzcG9uZHMgdG8gdGhlIGJpbmQgc3lzdGVtIGNhbGwuICoqc29ja2lk KiogaXMgZnJlZWx5IGNob3NlbiBieSB0aGUKPiBmcm9udGVuZCBhbmQgcmVmZXJlbmNlcyB0aGlz IHNwZWNpZmljIHNvY2tldCBmcm9tIHRoaXMgcG9pbnQgZm9yd2FyZC4gKipCaW5kKiosCj4gKips aXN0ZW4qKiBhbmQgKiphY2NlcHQqKiBhcmUgdGhlIHRocmVlIG9wZXJhdGlvbnMgcmVxdWlyZWQg dG8gaGF2ZSBmdWxseQo+IHdvcmtpbmcgcGFzc2l2ZSBzb2NrZXRzIGFuZCBzaG91bGQgYmUgaXNz dWVkIGluIHRoaXMgb3JkZXIuCj4gCj4gRmllbGRzOgo+IAo+IC0gKipjbWQqKiB2YWx1ZTogNAo+ IC0gYWRkaXRpb25hbCBmaWVsZHM6Cj4gICAtICoqYWRkcioqOiBhZGRyZXNzIHRvIGJpbmQgdG8s IGluIHN0cnVjdCBzb2NrYWRkciBmb3JtYXQKCkRpdG8uCgo+ICAgLSAqKmxlbioqOiBhZGRyZXNz IGxlbmd0aAo+IAo+IEJpbmFyeSBsYXlvdXQ6Cj4gCj4gICAgICAgICAxNiAgICAgIDIwICAgICAg MjQgICAgICAyOCAgICAgIDMyICAgICAgMzYgICAgICA0MCAgICAgIDQ0ICAgICA0OAo+ICAgICAg ICAgKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0t LS0rLS0tLS0tLSsKPiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciAg ICAgICAgICAgICAgICAgICAgICAgfCAgbGVuICB8Cj4gICAgICAgICArLS0tLS0tLSstLS0tLS0t Ky0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwo+IAo+IFJl dHVybiB2YWx1ZToKPiAKPiAgIC0gMCBvbiBzdWNjZXNzCj4gICAtIGxlc3MgdGhhbiAwIG9uIGZh aWx1cmUsIHNlZSB0aGUgZXJyb3IgY29kZXMgb2YgdGhlIGJpbmQgc3lzdGVtIGNhbGwKCkFnYWlu LgoKPiAKPiAKPiAjIyMjIExpc3Rlbgo+IAo+IFRoZSAqKmxpc3RlbioqIG9wZXJhdGlvbiBtYXJr cyB0aGUgc29ja2V0IGFzIGEgcGFzc2l2ZSBzb2NrZXQuIEl0IGNvcnJlc3BvbmRzIHRvCj4gdGhl IGxpc3RlbiBzeXN0ZW0gY2FsbC4KPiAKPiBGaWVsZHM6Cj4gCj4gLSAqKmNtZCoqIHZhbHVlOiA1 Cj4gLSBhZGRpdGlvbmFsIGZpZWxkczogbm9uZQo+IAo+IFJldHVybiB2YWx1ZToKPiAgIC0gMCBv biBzdWNjZXNzCj4gICAtIGxlc3MgdGhhbiAwIG9uIGZhaWx1cmUsIHNlZSB0aGUgZXJyb3IgY29k ZXMgb2YgdGhlIGxpc3RlbiBzeXN0ZW0gY2FsbAoKQWdhaW4uCgo+IAo+IAo+ICMjIyMgQWNjZXB0 Cj4gCj4gVGhlICoqYWNjZXB0Kiogb3BlcmF0aW9uIGV4dHJhY3RzIHRoZSBmaXJzdCBjb25uZWN0 aW9uIHJlcXVlc3Qgb24gdGhlIHF1ZXVlIG9mCj4gcGVuZGluZyBjb25uZWN0aW9ucyBmb3IgdGhl IGxpc3RlbmluZyBzb2NrZXQgaWRlbnRpZmllZCBieSAqKnNvY2tpZCoqIGFuZAo+IGNyZWF0ZXMg YSBuZXcgY29ubmVjdGVkIHNvY2tldC4gVGhlICoqc29ja2lkKiogb2YgdGhlIG5ldyBzb2NrZXQg aXMgYWxzbyBjaG9zZW4KPiBieSB0aGUgZnJvbnRlbmQgYW5kIHBhc3NlZCBhcyBhbiBhZGRpdGlv bmFsIGZpZWxkIG9mIHRoZSBhY2NlcHQgcmVxdWVzdCBzdHJ1Y3QuCj4gCj4gU2ltaWxhcmx5IHRv IHRoZSAqKmNvbm5lY3QqKiBvcGVyYXRpb24sICoqYWNjZXB0KiogY3JlYXRlcyBhIG5ldyBkYXRh IHJpbmcuCj4gSW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHNldHVwIHRoZSBuZXcgcmluZywgc3Vj aCBhcyBncmFudCB0YWJsZSByZWZlcmVuY2VzIGFuZAo+IGV2ZW50IGNoYW5uZWwgcG9ydHMsIGFy ZSBwYXNzZWQgZnJvbSB0aGUgZnJvbnRlbmQgdG8gdGhlIGJhY2tlbmQgYXMgcGFydCBvZgo+IHRo ZSByZXF1ZXN0Lgo+IAo+IFRoZSBiYWNrZW5kIHdpbGwgcmVwbHkgdG8gdGhlIHJlcXVlc3Qgb25s eSB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5Cj4gYWNjZXB0ZWQsIGkuZS4g dGhlIGJhY2tlbmQgZG9lcyBub3QgcmV0dXJuIEVBR0FJTiBvciBFV09VTERCTE9DSy4KPiAKPiBF eGFtcGxlIHdvcmtmbG93Ogo+IAo+IC0gZnJvbnRlbmQgaXNzdWVzIGFuICoqYWNjZXB0KiogcmVx dWVzdAo+IC0gYmFja2VuZCB3YWl0cyBmb3IgYSBjb25uZWN0aW9uIHRvIGJlIGF2YWlsYWJsZSBv biB0aGUgc29ja2V0Cj4gLSBhIG5ldyBjb25uZWN0aW9uIGJlY29tZXMgYXZhaWxhYmxlCj4gLSBi YWNrZW5kIGFjY2VwdHMgdGhlIG5ldyBjb25uZWN0aW9uCj4gLSBiYWNrZW5kIGNyZWF0ZXMgYW4g aW50ZXJuYWwgbWFwcGluZyBmcm9tICoqc29ja2lkKiogdG8gdGhlIG5ldyBzb2NrZXQKPiAtIGJh Y2tlbmQgbWFwcyBhbGwgdGhlIGdyYW50IHJlZmVyZW5jZXMgYW5kIHVzZXMgdGhlbSBhcyBzaGFy ZWQgbWVtb3J5IGZvciB0aGUKPiAgIG5ldyBkYXRhIHJpbmcKPiAtIGJhY2tlbmQgYmluZHMgdGhl ICoqZXZ0Y2huKioKPiAtIGJhY2tlbmQgcmVwbGllcyB0byB0aGUgZnJvbnRlbmQKPiAKPiBGaWVs ZHM6Cj4gCj4gLSAqKmNtZCoqIHZhbHVlOiA2Cj4gLSBhZGRpdGlvbmFsIGZpZWxkczoKPiAgIC0g Kipzb2NraWQqKjogaWQgb2YgdGhlIG5ldyBzb2NrZXQKPiAgIC0gKipyZWYqKjogZ3JhbnQgcmVm ZXJlbmNlcyBvZiB0aGUgZGF0YSByaW5nCj4gICAtICoqZXZ0Y2huKio6IHBvcnQgbnVtYmVyIG9m IHRoZSBldnRjaG4gdG8gc2lnbmFsIGFjdGl2aXR5IG9uIHRoZSBkYXRhIHJpbmcKPiAKPiBCaW5h cnkgbGF5b3V0Ogo+IAo+ICAgICAgICAgMTYgICAgICAyMCAgICAgIDI0ICAgICAgMjggICAgICAz MiAgICAgIDM2ICAgICAgNDAgICAgICA0NCAgICAgNDgKPiAgICAgICAgICstLS0tLS0tKy0tLS0t LS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCj4gICAg ICAgICB8ICAgIHNvY2tpZCAgICAgfHJlZlswXSB8cmVmWzFdIHxyZWZbMl0gfHJlZlszXSB8cmVm WzRdIHxyZWZbNV0gfCAKPiAgICAgICAgICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0t Ky0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCj4gICAgICAgICB8cmVmWzZdIHxyZWZb N10gfHJlZls4XSB8cmVmWzldIHxyZWZbMTBdfHJlZlsxMV18cmVmWzEyXXxyZWZbMTNdfAo+ICAg ICAgICAgKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0t LS0tLS0rLS0tLS0tLSsKPiAgICAgICAgIHxyZWZbMTRdfHJlZlsxNV18cmVmWzE2XXxyZWZbMTdd fHJlZlsxOF18cmVmWzE5XXxyZWZbMjBdfHJlZlsyMV18Cj4gICAgICAgICArLS0tLS0tLSstLS0t LS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwo+ICAg ICAgICAgfHJlZlsyMl18cmVmWzIzXXxyZWZbMjRdfHJlZlsyNV18cmVmWzI2XXxyZWZbMjddfHJl ZlsyOF18cmVmWzI5XXwKPiAgICAgICAgICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0t Ky0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCj4gICAgICAgICB8cmVmWzMwXXxyZWZb MzFdfHJlZlszMl18cmVmWzMzXXxyZWZbMzRdfHJlZlszNV18cmVmWzM2XXxyZWZbMzddfAo+ICAg ICAgICAgKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0t LS0tLS0rLS0tLS0tLSsKPiAgICAgICAgIHxyZWZbMzhdfHJlZlszOV18cmVmWzQwXXxyZWZbNDFd fHJlZls0Ml18cmVmWzQzXXxyZWZbNDRdfHJlZls0NV18Cj4gICAgICAgICArLS0tLS0tLSstLS0t LS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwo+ICAg ICAgICAgfHJlZls0Nl18cmVmWzQ3XXxyZWZbNDhdfHJlZls0OV18cmVmWzUwXXxyZWZbNTFdfHJl Zls1Ml18cmVmWzUzXXwKPiAgICAgICAgICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0t Ky0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCj4gICAgICAgICB8cmVmWzU0XXxyZWZb NTVdfHJlZls1Nl18cmVmWzU3XXxyZWZbNThdfHJlZls1OV18cmVmWzYwXXxyZWZbNjFdfAo+ICAg ICAgICAgKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0t LS0tLS0rLS0tLS0tLSsKPiAgICAgICAgIHxyZWZbNjJdfHJlZls2M118ZXZ0Y2huIHwgCj4gICAg ICAgICArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCj4gCj4gUmV0dXJuIHZhbHVlOgo+IAo+ICAg LSAwIG9uIHN1Y2Nlc3MKPiAgIC0gbGVzcyB0aGFuIDAgb24gZmFpbHVyZSwgc2VlIHRoZSBlcnJv ciBjb2RlcyBvZiB0aGUgYWNjZXB0IHN5c3RlbSBjYWxsCgpBZ2Fpbi4KCj4gCj4gCj4gIyMjIyBQ b2xsCj4gCj4gVGhlICoqcG9sbCoqIG9wZXJhdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBwYXNzaXZl IHNvY2tldHMuIEZvciBhY3RpdmUgc29ja2V0cywKPiB0aGUgZnJvbnRlbmQgc2hvdWxkIGxvb2sg YXQgdGhlIHN0YXRlIG9mIHRoZSBkYXRhIHJpbmcuIFdoZW4gYSBuZXcgY29ubmVjdGlvbiBpcwo+ IGF2YWlsYWJsZSBpbiB0aGUgcXVldWUgb2YgdGhlIHBhc3NpdmUgc29ja2V0LCB0aGUgYmFja2Vu ZCBnZW5lcmF0ZXMgYSByZXNwb25zZQo+IGFuZCBub3RpZmllcyB0aGUgZnJvbnRlbmQuCj4gCj4g RmllbGRzOgo+IAo+IC0gKipjbWQqKiB2YWx1ZTogNwo+IC0gYWRkaXRpb25hbCBmaWVsZHM6IG5v bmUKPiAKPiBSZXR1cm4gdmFsdWU6Cj4gCj4gICAtIDAgb24gc3VjY2Vzcwo+ICAgLSBsZXNzIHRo YW4gMCBvbiBmYWlsdXJlLCBzZWUgdGhlIGVycm9yIGNvZGVzIG9mIHRoZSBwb2xsIHN5c3RlbSBj YWxsCgpBZ2Fpbi4KCj4gCj4gCj4gIyMjIERhdGEgcmluZwo+IAo+IERhdGEgcmluZ3MgYXJlIHVz ZWQgZm9yIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBkYXRhIG92ZXIgYSBjb25uZWN0ZWQgc29ja2V0 LiBUaGV5Cj4gYXJlIGNyZWF0ZWQgdXBvbiBhIHN1Y2Nlc3NmdWwgKiphY2NlcHQqKiBvciAqKmNv bm5lY3QqKiBjb21tYW5kLiBUaGUgcmluZyB3b3Jrcwo+IGluIGEgc2ltaWxhciB3YXkgdG8gdGhl IGV4aXN0aW5nIFhlbiBjb25zb2xlIHJpbmcuCj4gCj4gIyMjIyBGb3JtYXQKPiAKPiAgICAgI2Rl ZmluZSBYRU5TT0NLX0RBVEFSSU5HX09SREVSIDYKPiAgICAgI2RlZmluZSBYRU5TT0NLX0RBVEFS SU5HX1BBR0VTICgxIDw8IFhFTlNPQ0tfREFUQVJJTkdfT1JERVIpCj4gICAgICNkZWZpbmUgWEVO U09DS19EQVRBUklOR19TSVpFIChYRU5TT0NLX0RBVEFSSU5HX1BBR0VTIDw8IFBBR0VfU0hJRlQp Cj4gICAgIHR5cGVkZWYgdWludDMyX3QgWEVOU09DS19SSU5HX0lEWDsKPiAgICAgCj4gICAgIHN0 cnVjdCB4ZW5zb2NrX3JpbmdfaW50ZiB7Cj4gICAgIAljaGFyIGluW1hFTlNPQ0tfREFUQVJJTkdf U0laRS80XTsKPiAgICAgCWNoYXIgb3V0W1hFTlNPQ0tfREFUQVJJTkdfU0laRS8yXTsKPiAgICAg CVhFTlNPQ0tfUklOR19JRFggaW5fY29ucywgaW5fcHJvZDsKPiAgICAgCVhFTlNPQ0tfUklOR19J RFggb3V0X2NvbnMsIG91dF9wcm9kOwo+ICAgICAJaW50MzJfdCBpbl9lcnJvciwgb3V0X2Vycm9y Owo+ICAgICB9OwoKU28geW91IGFyZSB3YXN0aW5nIG5lYXJseSA2NGtCIG9mIG1lbW9yeT8KCldv dWxkbid0IGl0IG1ha2UgbW9yZSBzZW5zZSB0byBoYXZlIDEgcGFnZSB3aXRoIHRoZSBhZG1pbiBk YXRhIChpbl8qLApvdXRfKikgYW5kIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgcGFnZXMgd2l0 aCB0aGUgcmluZyBidWZmZXJzPyBUaGUKYWRtaW4gcGFnZSBjb3VsZCBiZSBldmVuIHRoZSBvbmUg aG9sZGluZyB0aGUgZ3JhbnRfcmVmX3QgYXJyYXkgb2YgdGhlCnJpbmcgYnVmZmVyIHBhZ2VzIG5l ZWRlZCBmb3IgYWNjZXB0L2Nvbm5lY3QuCgo+IFRoZSBkZXNpZ24gaXMgZmxleGlibGUgYW5kIGNh biBzdXBwb3J0IGRpZmZlcmVudCByaW5nIHNpemVzIChhdCBjb21waWxlIHRpbWUpLgo+IFRoZSBm b2xsb3dpbmcgZGVzY3JpcHRpb24gaXMgYmFzZWQgb24gb3JkZXIgNiByaW5ncywgY2hvc2VuIGJl Y2F1c2UgdGhleSBwcm92aWRlCj4gZXhjZWxsZW50IHBlcmZvcm1hbmNlLgo+IAo+IC0gKippbioq IGlzIGFuIGFycmF5IG9mIDY1NTM2IGJ5dGVzLCB1c2VkIGFzIGNpcmN1bGFyIGJ1ZmZlcgo+ICAg SXQgY29udGFpbnMgZGF0YSByZWFkIGZyb20gdGhlIHNvY2tldC4gVGhlIHByb2R1Y2VyIGlzIHRo ZSBiYWNrZW5kLCB0aGUKPiAgIGNvbnN1bWVyIGlzIHRoZSBmcm9udGVuZC4KPiAtICoqb3V0Kiog aXMgYW4gYXJyYXkgb2YgMTMxMDcyIGJ5dGVzLCB1c2VkIGFzIGNpcmN1bGFyIGJ1ZmZlcgo+ICAg SXQgY29udGFpbnMgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZSBzb2NrZXQuIFRoZSBwcm9kdWNl ciBpcyB0aGUgZnJvbnRlbmQsCj4gICB0aGUgY29uc3VtZXIgaXMgdGhlIGJhY2tlbmQuCj4gLSAq KmluX2NvbnMqKiBhbmQgKippbl9wcm9kKioKPiAgIENvbnN1bWVyIGFuZCBwcm9kdWNlciBwb2lu dGVycyBmb3IgZGF0YSByZWFkIGZyb20gdGhlIHNvY2tldC4gVGhleSBrZWVwIHRyYWNrCj4gICBv ZiBob3cgbXVjaCBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gY29uc3VtZWQgYnkgdGhlIGZyb250ZW5k IGZyb20gdGhlICoqaW4qKgo+ICAgYXJyYXkuICoqaW5fcHJvZCoqIGlzIGluY3JlYXNlZCBieSB0 aGUgYmFja2VuZCwgYWZ0ZXIgd3JpdGluZyBkYXRhIHRvICoqaW4qKi4KPiAgICoqaW5fY29ucyoq IGlzIGluY3JlYXNlZCBieSB0aGUgZnJvbnRlbmQsIGFmdGVyIHJlYWRpbmcgZGF0YSBmcm9tICoq aW4qKi4KPiAtICoqb3V0X2NvbnMqKiwgKipvdXRfcHJvZCoqCj4gICBDb25zdW1lciBhbmQgcHJv ZHVjZXIgcG9pbnRlcnMgZm9yIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHNvY2tldC4g VGhleQo+ICAga2VlcCB0cmFjayBvZiBob3cgbXVjaCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gYnkg dGhlIGZyb250ZW5kIHRvICoqb3V0KiogYW5kCj4gICBob3cgbXVjaCBkYXRhIGhhcyBhbHJlYWR5 IGJlZW4gY29uc3VtZWQgYnkgdGhlIGJhY2tlbmQuICoqb3V0X3Byb2QqKiBpcwo+ICAgaW5jcmVh c2VkIGJ5IHRoZSBmcm9udGVuZCwgYWZ0ZXIgd3JpdGluZyBkYXRhIHRvICoqb3V0KiouICoqb3V0 X2NvbnMqKiBpcwo+ICAgaW5jcmVhc2VkIGJ5IHRoZSBiYWNrZW5kLCBhZnRlciByZWFkaW5nIGRh dGEgZnJvbSAqKm91dCoqLgo+IC0gKippbl9lcnJvcioqIGFuZCAqKm91dF9lcnJvcioqIFRoZXkg c2lnbmFsIGVycm9ycyB3aGVuIHJlYWRpbmcgZnJvbSB0aGUgc29ja2V0Cj4gICAoKippbl9lcnJv cioqKSBvciB3aGVuIHdyaXRpbmcgdG8gdGhlIHNvY2tldCAoKipvdXRfZXJyb3IqKikuIDAgbWVh bnMgbm8KPiAgIGVycm9ycy4gV2hlbiBhbiBlcnJvciBvY2N1cnMsIG5vIGZ1cnRoZXIgcmVhZHMg b3Igd3JpdGVzIG9wZXJhdGlvbnMgYXJlCj4gICBwZXJmb3JtZWQgb24gdGhlIHNvY2tldC4gSW4g dGhlIGNhc2Ugb2YgYW4gb3JkZXJseSBzb2NrZXQgc2h1dGRvd24gKGkuZS4gcmVhZAo+ICAgcmV0 dXJucyAwKSAqKmluX2Vycm9yKiogaXMgc2V0IHRvIC1FTk9UQ09OTi4gKippbl9lcnJvcioqIGFu ZCAqKm91dF9lcnJvcioqCgpXaGljaCB2YWx1ZT8gSSd2ZSBmb3VuZCBzeXN0ZW1zIHdpdGg6IDU3 LCA3NiwgMTA3LCAxMzQgb3IgMjM1IChqdXN0IHRvCm1ha2UgY2xlYXIgdGhhdCBldmVuIGFuIGVy cm5vIG5hbWUgaXNuJ3Qgb3B0aW1hbCkuCgo+ICAgYXJlIG5ldmVyIHNldCB0byAtRUFHQUlOIG9y IC1FV09VTERCTE9DSy4KPiAKPiBUaGUgYmluYXJ5IGxheW91dCBmb2xsb3dzOgo+IAo+ICAgICAw ICAgICAgICA2NTUzNiAgICAgICAgICAgMTk2NjA4ICAgICAxOTY2MTIgICAgMTk2NjE2ICAgIDE5 NjYyMCAgIDE5NjYyNCAgICAxOTY2MjggICAxOTY2MzIKPiAgICAgKy0tLS0vLy0tLS0rLS0tLS0t LS8vLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0t LS0tKy0tLS0tLS0tLSsKPiAgICAgfCAgICBpbiAgICB8ICAgICAgb3V0ICAgICAgIHwgaW5fY29u cyB8IGluX3Byb2QgfG91dF9jb25zIHxvdXRfcHJvZCB8aW5fZXJyb3IgfG91dF9lcnJvcnwKPiAg ICAgKy0tLS0vLy0tLS0rLS0tLS0tLS8vLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0t LS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSsKPiAgICAgCj4gCj4gIyMjIyBXb3Jr Zmxvdwo+IAo+IFRoZSAqKmluKiogYW5kICoqb3V0KiogYXJyYXlzIGFyZSB1c2VkIGFzIGNpcmN1 bGFyIGJ1ZmZlcnM6Cj4gICAgIAo+ICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHNpemVvZihhcnJheSkKPiAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t Kwo+ICAgICB8dG8gY29uc3VtZXwgICAgZnJlZSAgICB8dG8gY29uc3VtZSB8Cj4gICAgICstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKPiAgICAgICAgICAgICAgICBeICAgICAg ICAgICAgXgo+ICAgICAgICAgICAgICAgIHByb2QgICAgICAgICBjb25zCj4gCj4gICAgIDAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFycmF5KQo+ICAgICArLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4gICAgIHwgIGZyZWUgICAgfCB0byBjb25zdW1l IHwgICBmcmVlICAgIHwKPiAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t Kwo+ICAgICAgICAgICAgICAgIF4gICAgICAgICAgICBeCj4gICAgICAgICAgICAgICAgY29ucyAg ICAgICAgIHByb2QKPiAKPiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIGNh bGN1bGF0ZSBob3cgbWFueSBieXRlcyBhcmUgY3VycmVudGx5Cj4gbGVmdCB1bmNvbnN1bWVkIGlu IGFuIGFycmF5Ogo+IAo+ICAgICAjZGVmaW5lIF9NQVNLX1hFTlNPQ0tfSURYKGlkeCwgcmluZ19z aXplKSAoKGlkeCkgJiAocmluZ19zaXplLTEpKQo+IAo+ICAgICBzdGF0aWMgaW5saW5lIFhFTlNP Q0tfUklOR19JRFggeGVuc29ja19yaW5nX3F1ZXVlZChYRU5TT0NLX1JJTkdfSURYIHByb2QsCj4g ICAgIAkJWEVOU09DS19SSU5HX0lEWCBjb25zLAo+ICAgICAJCVhFTlNPQ0tfUklOR19JRFggcmlu Z19zaXplKQo+ICAgICB7Cj4gICAgIAlYRU5TT0NLX1JJTkdfSURYIHNpemU7Cj4gICAgIAo+ICAg ICAJaWYgKHByb2QgPT0gY29ucykKPiAgICAgCQlyZXR1cm4gMDsKPiAgICAgCj4gICAgIAlwcm9k ID0gX01BU0tfWEVOU09DS19JRFgocHJvZCwgcmluZ19zaXplKTsKPiAgICAgCWNvbnMgPSBfTUFT S19YRU5TT0NLX0lEWChjb25zLCByaW5nX3NpemUpOwo+ICAgICAKPiAgICAgCWlmIChwcm9kID09 IGNvbnMpCj4gICAgIAkJcmV0dXJuIHJpbmdfc2l6ZTsKPiAgICAgCj4gICAgIAlpZiAocHJvZCA+ IGNvbnMpCj4gICAgIAkJc2l6ZSA9IHByb2QgLSBjb25zOwo+ICAgICAJZWxzZSB7Cj4gICAgIAkJ c2l6ZSA9IHJpbmdfc2l6ZSAtIGNvbnM7Cj4gICAgIAkJc2l6ZSArPSBwcm9kOwo+ICAgICAJfQo+ ICAgICAJcmV0dXJuIHNpemU7Cj4gICAgIH0KPiAKPiBUaGUgcHJvZHVjZXIgKHRoZSBiYWNrZW5k IGZvciAqKmluKiosIHRoZSBmcm9udGVuZCBmb3IgKipvdXQqKikgd3JpdGVzIHRvIHRoZQo+IGFy cmF5IGluIHRoZSBmb2xsb3dpbmcgd2F5Ogo+IAo+IC0gcmVhZCAqY29ucyosICpwcm9kKiwgKmVy cm9yKiBmcm9tIHNoYXJlZCBtZW1vcnkKPiAtIG1lbW9yeSBiYXJyaWVyCj4gLSByZXR1cm4gb24g KmVycm9yKgo+IC0gd3JpdGUgdG8gYXJyYXkgYXQgcG9zaXRpb24gKnByb2QqIHVwIHRvICpjb25z Kiwgd3JhcHBpbmcgYXJvdW5kIHRoZSBjaXJjdWxhcgo+ICAgYnVmZmVyIHdoZW4gbmVjZXNzYXJ5 Cj4gLSBtZW1vcnkgYmFycmllcgo+IC0gaW5jcmVhc2UgKnByb2QqCj4gLSBub3RpZnkgdGhlIG90 aGVyIGVuZCB2aWEgZXZ0Y2huCj4gCj4gVGhlIGNvbnN1bWVyICh0aGUgYmFja2VuZCBmb3IgKipv dXQqKiwgdGhlIGZyb250ZW5kIGZvciAqKmluKiopIHJlYWRzIGZyb20gdGhlCj4gYXJyYXkgaW4g dGhlIGZvbGxvd2luZyB3YXk6Cj4gCj4gLSByZWFkICpwcm9kKiwgKmNvbnMqLCAqZXJyb3IqIGZy b20gc2hhcmVkIG1lbW9yeQo+IC0gbWVtb3J5IGJhcnJpZXIKPiAtIHJldHVybiBvbiAqZXJyb3Iq Cj4gLSByZWFkIGZyb20gYXJyYXkgYXQgcG9zaXRpb24gKmNvbnMqIHVwIHRvICpwcm9kKiwgd3Jh cHBpbmcgYXJvdW5kIHRoZSBjaXJjdWxhcgo+ICAgYnVmZmVyIHdoZW4gbmVjZXNzYXJ5Cj4gLSBt ZW1vcnkgYmFycmllcgo+IC0gaW5jcmVhc2UgKmNvbnMqCj4gLSBub3RpZnkgdGhlIG90aGVyIGVu ZCB2aWEgZXZ0Y2huCj4gCj4gVGhlIHByb2R1Y2VyIHRha2VzIGNhcmUgb2Ygd3JpdGluZyBvbmx5 IGFzIG1hbnkgYnl0ZXMgYXMgYXZhaWxhYmxlIGluIHRoZSBidWZmZXIKPiB1cCB0byAqY29ucyou IFRoZSBjb25zdW1lciB0YWtlcyBjYXJlIG9mIHJlYWRpbmcgb25seSBhcyBtYW55IGJ5dGVzIGFz IGF2YWlsYWJsZQo+IGluIHRoZSBidWZmZXIgdXAgdG8gKnByb2QqLiAqZXJyb3IqIGlzIHNldCBi eSB0aGUgYmFja2VuZCB3aGVuIGFuIGVycm9yIG9jY3Vycwo+IHdyaXRpbmcgb3IgcmVhZGluZyBm cm9tIHRoZSBzb2NrZXQuCj4gCgoKSnVlcmdlbgoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlz dHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVsCg==