From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: Re: [PATCH i-g-t 5/7] tests/perf_pmu: Tests for i915 PMU API Date: Tue, 26 Sep 2017 12:19:35 +0100 Message-ID: References: <20170925151502.7285-1-tvrtko.ursulin@linux.intel.com> <20170925151502.7285-6-tvrtko.ursulin@linux.intel.com> <150635649095.18819.11787765854053852667@mail.alporthouse.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTPS id E7EB36E51E for ; Tue, 26 Sep 2017 11:19:57 +0000 (UTC) In-Reply-To: <150635649095.18819.11787765854053852667@mail.alporthouse.com> Content-Language: en-GB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Chris Wilson , Tvrtko Ursulin , Intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org Ck9uIDI1LzA5LzIwMTcgMTc6MjEsIENocmlzIFdpbHNvbiB3cm90ZToKPiBRdW90aW5nIFR2cnRr byBVcnN1bGluICgyMDE3LTA5LTI1IDE2OjE1OjAwKQo+PiBGcm9tOiBUdnJ0a28gVXJzdWxpbiA8 dHZydGtvLnVyc3VsaW5AaW50ZWwuY29tPgo+Pgo+PiBBIGJ1bmNoIG9mIHRlc3RzIGZvciB0aGUg bmV3IGk5MTUgUE1VIGZlYXR1cmUuCj4+Cj4+IFBhcnRzIG9mIHRoZSBjb2RlIHdlcmUgaW5pdGlh bHkgc2tldGNoZWQgYnkgRG1pdHJ5IFJvZ296aGtpbi4KPj4KPj4gdjI6IChNb3N0IHN1Z2dlc3Rp b25zIGJ5IENocmlzIFdpbHNvbikKPj4gICAqIEFkZCBuZXcgY2xhc3MvaW5zdGFuY2UgYmFzZWQg ZW5naW5lIGxpc3QuCj4+ICAgKiBBZGQgZ2VtX2hhc19lbmdpbmUvZ2VtX3JlcXVpcmVfZW5naW5l IHRvIHdvcmsgd2l0aCBjbGFzcy9pbnN0YW5jZS4KPj4gICAqIFVzZSB0aGUgYWJvdmUgdHdvIHRo cm91Z2hvdXQgdGhlIHRlc3QuCj4+ICAgKiBTaG9ydGVuIHRlc3RzIHRvIDEwMG1zIGJ1c3kgYmF0 Y2hlcywgc2VlbXMgZW5vdWdoLgo+PiAgICogQWRkIHF1ZXVlZCBjb3VudGVyIHNhbml0eSBjaGVj a3MuCj4+ICAgKiBVc2UgaWd0X25zZWNfZWxhcHNlZC4KPj4gICAqIFNraXAgb24gcGVyZiAtRU5P REVWIGluIHNvbWUgdGVzdHMgaW5zdGVhZCBvZiBlbWJlZGRpbmcga25vd2xlZGdlIGxvY2FsbHku Cj4+ICAgKiBGaXggbXVsdGkgb3JkZXJpbmcgZm9yIGJ1c3kgYWNjb3VudGluZy4KPj4gICAqIFVz ZSBuZXcgZ3VyYW50ZWVkX3VzbGVlcCB3aGVuIHNsZWVwIHRpbWUgaXMgYXNzZXJ0ZWQgb24uCj4+ ICAgKiBDaGVjayBmb3Igbm8gcXVldWVkIHdoZW4gaWRsZS9idXN5Lgo+PiAgICogQWRkIHF1ZXVl ZCBjb3VudGVyIGluaXQgdGVzdC4KPj4gICAqIEFkZCBxdWV1ZWQgdGVzdHMuCj4+ICAgKiBDb25z b2xpZGF0ZSBhbmQgaW5jcmVhc2UgbXVsdGlwbGUgYnVzeSBlbmdpbmVzIHRlc3RzIHRvIG1vc3Qt YnVzeSBhbmQKPj4gICAgIGFsbC1idXN5IHRlc3RzLgo+PiAgICogR3VhcmFudHRlIGludGVycnVw dHMgYnkgdXNpbmcgZmVuY2VzLgo+PiAgICogVGVzdCBSQzYgdmlhIGZvcmNld2FrZS4KPj4KPj4g djM6Cj4+ICAgKiBUd2VhayBhc3NlcnQgaW4gaW50ZXJydXB0cyBzdWJ0ZXN0Lgo+PiAgICogU3By aW5rbGUgb2YgY29tbWVudHMuCj4+ICAgKiBGaXggbXVsdGktY2xpZW50IHRlc3Qgd2hpY2ggZ290 IGJyb2tlbiBpbiB2Mi4KPj4KPj4gU2lnbmVkLW9mZi1ieTogVHZydGtvIFVyc3VsaW4gPHR2cnRr by51cnN1bGluQGludGVsLmNvbT4KPj4gQ2M6IENocmlzIFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2ls c29uLmNvLnVrPgo+PiBDYzogRG1pdHJ5IFJvZ296aGtpbiA8ZG1pdHJ5LnYucm9nb3poa2luQGlu dGVsLmNvbT4KPj4gLS0tCj4+ICAgbGliL2lndF9ndC5jICAgICAgICAgICB8ICA1MCArKysKPj4g ICBsaWIvaWd0X2d0LmggICAgICAgICAgIHwgIDM4ICsrKwo+PiAgIGxpYi9pZ3RfcGVyZi5oICAg ICAgICAgfCAgIDkgKy0KPj4gICB0ZXN0cy9NYWtlZmlsZS5zb3VyY2VzIHwgICAxICsKPj4gICB0 ZXN0cy9wZXJmX3BtdS5jICAgICAgIHwgODY5ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysKPj4gICA1IGZpbGVzIGNoYW5nZWQsIDk1OSBpbnNlcnRpb25z KCspLCA4IGRlbGV0aW9ucygtKQo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCB0ZXN0cy9wZXJmX3Bt dS5jCj4+Cj4+IGRpZmYgLS1naXQgYS9saWIvaWd0X2d0LmMgYi9saWIvaWd0X2d0LmMKPj4gaW5k ZXggYjNmM2IzODA5ZWVlLi40Yzc1ODExZmIxYjMgMTAwNjQ0Cj4+IC0tLSBhL2xpYi9pZ3RfZ3Qu Ywo+PiArKysgYi9saWIvaWd0X2d0LmMKPj4gQEAgLTU2OCwzICs1NjgsNTMgQEAgYm9vbCBnZW1f Y2FuX3N0b3JlX2R3b3JkKGludCBmZCwgdW5zaWduZWQgaW50IGVuZ2luZSkKPj4gICAKPj4gICAg ICAgICAgcmV0dXJuIHRydWU7Cj4+ICAgfQo+PiArCj4gCj4+ICtjb25zdCBzdHJ1Y3QgaW50ZWxf ZXhlY3V0aW9uX2VuZ2luZTIgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZXMyW10gPSB7Cj4gCj4gSWYg eW91IHdhbnQgdG8gZG8gYSBxdWljawo+IAlzL2ludGVsX2V4ZWN1dGlvbl9lbmdpbmUvaW50ZWxf ZXhlY3V0aW9uX2xlZ2FjeV9yaW5nLwo+IG9yIHdhaXQgdW50aWwgY2xhc3MvaW5zdCBpcyB0aGUg bmF0dXJhbCBleGVjYnVmIGludGVyZmFjZT8KCkkgdGhpbmsgaXQgd291bGQgYmUgcHJlbWF0dXJl LiBDbGFzcy9pbnN0YW5jZSB1c2Vyc3BhY2UgaXMgbm93aGVyZSBpbiBzaWdodC4KCj4+ICtjb25z dCBkb3VibGUgdG9sZXJhbmNlID0gMC4wMmY7Cj4+ICtjb25zdCB1bnNpZ25lZCBsb25nIGJhdGNo X2R1cmF0aW9uX25zID0gMTAwICogMTAwMCAqIDEwMDA7Cj4+ICsKPj4gK3N0YXRpYyBpbnQgb3Bl bl9wbXUodWludDY0X3QgY29uZmlnKQo+PiArewo+PiArICAgICAgIGludCBmZDsKPj4gKwo+PiAr ICAgICAgIGZkID0gcGVyZl9pOTE1X29wZW4oY29uZmlnKTsKPj4gKyAgICAgICBpZ3RfcmVxdWly ZShmZCA+PSAwIHx8IChmZCA8IDAgJiYgZXJybm8gIT0gRU5PREVWKSk7Cj4+ICsgICAgICAgaWd0 X2Fzc2VydChmZCA+PSAwKTsKPiAKPiBTbyB3aHkgYXJlIHdlIG5vdCBhbGxvd2VkIHRvIGRpc2Fi bGUgcGVyZiBjb3VudGVycz8KCkkgc3VwcG9zZSB5b3UgYXJlIGFpbWluZyBoZXJlIGF0IGVycm5v IHdpbGwgYmUgZGlmZmVyZW50IGluIHRoYXQgY2FzZSAKYW5kIHdlIHNob3VsZCBza2lwIGFzIHdl bGwuIEFub3RoZXIgVE9ETyB0byBjaGVjayB3aGljaCBvbmUgZXhhY3RseSBpdCBpcy4KCj4gCj4+ ICsgICAgICAgcmV0dXJuIGZkOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IG9wZW5fZ3JvdXAo dWludDY0X3QgY29uZmlnLCBpbnQgZ3JvdXApCj4+ICt7Cj4+ICsgICAgICAgaW50IGZkOwo+PiAr Cj4+ICsgICAgICAgZmQgPSBwZXJmX2k5MTVfb3Blbl9ncm91cChjb25maWcsIGdyb3VwKTsKPj4g KyAgICAgICBpZ3RfcmVxdWlyZShmZCA+PSAwIHx8IChmZCA8IDAgJiYgZXJybm8gIT0gRU5PREVW KSk7Cj4+ICsgICAgICAgaWd0X2Fzc2VydChmZCA+PSAwKTsKPj4gKwo+PiArICAgICAgIHJldHVy biBmZDsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQKPj4gK2luaXQoaW50IGdlbV9mZCwgY29u c3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplLCB1aW50OF90IHNhbXBsZSkKPj4g K3sKPj4gKyAgICAgICBpbnQgZmQ7Cj4+ICsKPj4gKyAgICAgICBmZCA9IG9wZW5fcG11KF9fSTkx NV9QTVVfRU5HSU5FKGUtPmNsYXNzLCBlLT5pbnN0YW5jZSwgc2FtcGxlKSk7Cj4+ICsKPj4gKyAg ICAgICBjbG9zZShmZCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB1aW50NjRfdCBwbXVfcmVhZF9z aW5nbGUoaW50IGZkKQo+PiArewo+PiArICAgICAgIHVpbnQ2NF90IGRhdGFbMl07Cj4+ICsgICAg ICAgc3NpemVfdCBsZW47Cj4+ICsKPj4gKyAgICAgICBsZW4gPSByZWFkKGZkLCBkYXRhLCBzaXpl b2YoZGF0YSkpOwo+PiArICAgICAgIGlndF9hc3NlcnRfZXEobGVuLCBzaXplb2YoZGF0YSkpOwo+ IAo+IHJlYWQoKSBpc24ndCBhIGNvbXBsaWNhdGVkIG1hY3JvLCBzbyB3b24ndCB0aGlzIGhhdmUg YSByZWFzb25hYmxlCj4gc3RyaW5nIGFzIGlndF9hc3NlcnRfZXEocmVhZChmZCwgZGF0YSwgc2l6 ZW9mKGRhdGEpKSwgc2l6ZW9mKGRhdGEpKSA/CgpPa2F5LiA6KQoKPiAKPj4gKyAgICAgICByZXR1 cm4gZGF0YVswXTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgcG11X3JlYWRfbXVsdGkoaW50 IGZkLCB1bnNpZ25lZCBpbnQgbnVtLCB1aW50NjRfdCAqdmFsKQo+PiArewo+PiArICAgICAgIHVp bnQ2NF90IGJ1ZlsyICsgbnVtXTsKPj4gKyAgICAgICB1bnNpZ25lZCBpbnQgaTsKPj4gKyAgICAg ICBzc2l6ZV90IGxlbjsKPj4gKwo+PiArICAgICAgIGxlbiA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9m KGJ1ZikpOwo+PiArICAgICAgIGlndF9hc3NlcnRfZXEobGVuLCBzaXplb2YoYnVmKSk7Cj4+ICsg ICAgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQo+PiArICAgICAgICAgICAgICAgdmFsW2ld ID0gYnVmWzIgKyBpXTsKPj4gK30KPj4gKwo+PiArI2RlZmluZSBhc3NlcnRfd2l0aGluX2Vwc2ls b24oeCwgcmVmLCB0b2xlcmFuY2UpIFwKPj4gKyAgICAgICBpZ3RfYXNzZXJ0X2YoKGRvdWJsZSko eCkgPD0gKDEuMCArIHRvbGVyYW5jZSkgKiAoZG91YmxlKXJlZiAmJiBcCj4+ICsgICAgICAgICAg ICAgICAgICAgIChkb3VibGUpKHgpID49ICgxLjAgLSB0b2xlcmFuY2UpICogKGRvdWJsZSlyZWYs IFwKPj4gKyAgICAgICAgICAgICAgICAgICAgIiclcycgIT0gJyVzJyAoJWYgbm90IHdpdGhpbiAl ZiUlIHRvbGVyYW5jZSBvZiAlZilcbiIsXAo+PiArICAgICAgICAgICAgICAgICAgICAjeCwgI3Jl ZiwgKGRvdWJsZSl4LCB0b2xlcmFuY2UgKiAxMDAuMCwgKGRvdWJsZSlyZWYpCj4+ICsKPj4gKy8q Cj4+ICsgKiBIZWxwZXIgZm9yIGNhc2VzIHdoZXJlIHdlIGFzc2VydCBvbiB0aW1lIHNwZW50IHNs ZWVwaW5nIChkaXJlY3RseSBvcgo+PiArICogaW5kaXJlY3RseSksIHNvIG1ha2UgaXQgbW9yZSBy b2J1c3QgYnkgZW5zdXJpbmcgdGhlIHN5c3RlbSBzbGVlcCB0aW1lCj4+ICsgKiBpcyB3aXRoaW4g dGVzdCB0b2xlcmFuY2UgdG8gc3RhcnQgd2l0aC4KPj4gKyAqLwo+IAo+IExvb2tpbmcgYXQgdGhl IGNhbGxlcnMsIEkgZG9uJ3Qgc2VlIHdoZXJlIHdlIG5lZWQgYSBndWFyYW50ZWVkIHNsZWVwIHZz Cj4gYSBrbm93biBzbGVlcC4gV2UgYXJlIGNvbXBhcmluZyBlbGFwc2VkL3dhbGwgdGltZSB3aXRo IGEgcGVyZiBjb3VudGVyLCBzbwo+IHdlIG9ubHkgY2FyZSB0aGF0IHRoZXkgbWF0Y2guIEJ5IGFz c2VydGluZyB3ZSBqdXN0IGNhdXNlIHJhbmRvbSBmYWlscyBpZgo+IHRoZSBzeXN0ZW0gZGVjaWRl cyBub3QgdG8gd2FrZSB1cCBmb3IgYSAxcyAob3V0c2lkZSB0aGUgcHVydmV5IG9mIHRoZQo+IHRl c3QpLgoKT2theSBzbyB5b3Ugc3VnZ2VzdCBtZWFzdXJlZF91c2xlZXAgaW5zdGVhZCBvZiBndWFy YW50ZWVkX3VzbGVlcC4gQW5kIAp0aGVuIHRoZSBtZWFzdXJlZCB0aW1lIHVzZWQgaW4gdGhlIGFz c2VydHMuIE1ha2VzIHNlbnNlLCBqdXN0IHBsZWFzZSAKY29uZmlybSB0aGF0IHRoZXJlIGhhc24n dCBiZWVuIGEgbWlzdW5kZXJzdGFuZGluZy4KCj4gCj4+ICtzdGF0aWMgdm9pZCBndWFyYW50ZWVk X3VzbGVlcCh1bnNpZ25lZCBpbnQgdXNlYykKPj4gK3sKPj4gKyAgICAgICB1aW50NjRfdCBzbGVw dCA9IDAsIHRvX3NsZWVwID0gdXNlYzsKPj4gKwo+PiArICAgICAgIHdoaWxlICh1c2VjID4gMCkg ewo+PiArICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIHN0YXJ0ID0geyB9Owo+PiArICAg ICAgICAgICAgICAgdWludDY0X3QgdGhpc19zbGVlcDsKPj4gKwo+PiArICAgICAgICAgICAgICAg aWd0X25zZWNfZWxhcHNlZCgmc3RhcnQpOwo+PiArICAgICAgICAgICAgICAgdXNsZWVwKHVzZWMp Owo+PiArICAgICAgICAgICAgICAgdGhpc19zbGVlcCA9IGlndF9uc2VjX2VsYXBzZWQoJnN0YXJ0 KSAvIDEwMDA7Cj4+ICsgICAgICAgICAgICAgICBzbGVwdCArPSB0aGlzX3NsZWVwOwo+PiArICAg ICAgICAgICAgICAgaWYgKHRoaXNfc2xlZXAgPiB1c2VjKQo+PiArICAgICAgICAgICAgICAgICAg ICAgICBicmVhazsKPj4gKyAgICAgICAgICAgICAgIHVzZWMgLT0gdGhpc19zbGVlcDsKPj4gKyAg ICAgICB9Cj4+ICsKPj4gKyAgICAgICBhc3NlcnRfd2l0aGluX2Vwc2lsb24oc2xlcHQsIHRvX3Ns ZWVwLCB0b2xlcmFuY2UpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdW5zaWduZWQgaW50IGUycmlu ZyhpbnQgZ2VtX2ZkLCBjb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmUpCj4+ ICt7Cj4+ICsgICAgICAgcmV0dXJuIGdlbV9jbGFzc19pbnN0YW5jZV90b19lYl9mbGFncyhnZW1f ZmQsIGUtPmNsYXNzLCBlLT5pbnN0YW5jZSk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkCj4+ ICtzaW5nbGUoaW50IGdlbV9mZCwgY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUy ICplLCB1aW50OF90IHNhbXBsZSwKPj4gKyAgICAgICBib29sIGJ1c3kpCj4+ICt7Cj4+ICsgICAg ICAgZG91YmxlIHJlZiA9IGJ1c3kgJiYgc2FtcGxlID09IEk5MTVfU0FNUExFX0JVU1kgPwo+PiAr ICAgICAgICAgICAgICAgICAgICBiYXRjaF9kdXJhdGlvbl9ucyA6IDAuMGY7Cj4+ICsgICAgICAg aWd0X3NwaW5fdCAqc3BpbjsKPj4gKyAgICAgICB1aW50NjRfdCB2YWw7Cj4+ICsgICAgICAgaW50 IGZkOwo+PiArCj4+ICsgICAgICAgZmQgPSBvcGVuX3BtdShfX0k5MTVfUE1VX0VOR0lORShlLT5j bGFzcywgZS0+aW5zdGFuY2UsIHNhbXBsZSkpOwo+PiArCj4+ICsgICAgICAgaWYgKGJ1c3kpIHsK Pj4gKyAgICAgICAgICAgICAgIHNwaW4gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2VtX2ZkLCAwLCBl MnJpbmcoZ2VtX2ZkLCBlKSwgMCk7Cj4+ICsgICAgICAgICAgICAgICBpZ3Rfc3Bpbl9iYXRjaF9z ZXRfdGltZW91dChzcGluLCBiYXRjaF9kdXJhdGlvbl9ucyk7Cj4+ICsgICAgICAgfSBlbHNlIHsK Pj4gKyAgICAgICAgICAgICAgIGd1YXJhbnRlZWRfdXNsZWVwKGJhdGNoX2R1cmF0aW9uX25zIC8g MTAwMCk7Cj4+ICsgICAgICAgfQo+PiArCj4+ICsgICAgICAgaWYgKGJ1c3kpCj4+ICsgICAgICAg ICAgICAgICBnZW1fc3luYyhnZW1fZmQsIHNwaW4tPmhhbmRsZSk7Cj4+ICsKPj4gKyAgICAgICB2 YWwgPSBwbXVfcmVhZF9zaW5nbGUoZmQpOwo+PiArCj4+ICsgICAgICAgYXNzZXJ0X3dpdGhpbl9l cHNpbG9uKHZhbCwgcmVmLCB0b2xlcmFuY2UpOwo+PiArCj4+ICsgICAgICAgaWYgKGJ1c3kpCj4+ ICsgICAgICAgICAgICAgICBpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3Bpbik7Cj4+ICsg ICAgICAgY2xvc2UoZmQpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZAo+PiArcXVldWVkKGlu dCBnZW1fZmQsIGNvbnN0IHN0cnVjdCBpbnRlbF9leGVjdXRpb25fZW5naW5lMiAqZSkKPj4gK3sK Pj4gKyAgICAgICBpZ3Rfc3Bpbl90ICpzcGluWzJdOwo+PiArICAgICAgIHVpbnQ2NF90IHZhbDsK Pj4gKyAgICAgICBpbnQgZmQ7Cj4+ICsKPj4gKyAgICAgICBmZCA9IG9wZW5fcG11KEk5MTVfUE1V X0VOR0lORV9RVUVVRUQoZS0+Y2xhc3MsIGUtPmluc3RhbmNlKSk7Cj4+ICsKPj4gKyAgICAgICAv Kgo+PiArICAgICAgICAqIEZpcnN0IHNwaW4gYmF0Y2ggd2lsbCBiZSBpbW1lZGlhdGVseSBleGVj dXRpbmcuCj4+ICsgICAgICAgICovCj4+ICsgICAgICAgc3BpblswXSA9IGlndF9zcGluX2JhdGNo X25ldyhnZW1fZmQsIDAsIGUycmluZyhnZW1fZmQsIGUpLCAwKTsKPj4gKyAgICAgICBpZ3Rfc3Bp bl9iYXRjaF9zZXRfdGltZW91dChzcGluWzBdLCBiYXRjaF9kdXJhdGlvbl9ucyk7Cj4+ICsKPj4g KyAgICAgICAvKgo+PiArICAgICAgICAqIFNlY29uZCBzcGluIGJhdGNoIHdpbGwgc2l0IGluIHRo ZSBleGVjdXRpb24gcXVldWUgYmVoaW5kIHRoZQo+PiArICAgICAgICAqIGZpcnN0IG9uZSBzbyBt dXN0IGNhdXNlIHRoZSBQTVUgdG8gY29ycmVjdGx5IHJlcG9ydCB0aGUgcXVldWVkCj4+ICsgICAg ICAgICogY291bnRlci4KPj4gKyAgICAgICAgKi8KPiAKPiBIbW0sIHRoZSBzZWNvbmQgdG8gdGhl IHNhbWUgY3R4IHNob3VsZCBiZSBleGVjdXRlZC4gV2Ugd2lsbCBzZWUgdGhhdAo+IHBvcnRbMV0g aXMgZW1wdHkgYW5kIHNvIGFzayBpZiB3ZSBjYW4gZml0IHRoZSBiYXRjaCBpbnRvIHBvcnRbMV0u IEluCj4gZmFjdCwgaXQgdHVybnMgb3V0IHRoYXQgd2UgY2FuIGNvYWxlc2NlIHRoZSBiYXRjaCB3 aXRoIHBvcnRbMF0uCj4gT25jZSBjb2FsZXNjZWQsIHdlIGNhbid0IGRpc3Rpbmd1aXNoIHRoZSB0 d28gcmVxdWVzdHMgc2luY2UgdGhleSBhcmUgYQo+IHNpbmdsZSBjb250ZXh0IGluIHRoZSBFTFNQ Lgo+IAo+IEFsbCB0aGlzIGlzIHByZXN1bWluZyBleGVjbGlzdHMuLi4KPiAKPiBpaXJjIGV4ZWNi dWYtaW9jdGwoKSAtPiBbdW50cmFja2VkXQo+ICAgIFwtIHN1Ym1pdF9yZXF1ZXN0IC0+IFFVRVVF RAo+ICAgICAgICBcLSBleGVjbGlzdHNfZGVxdWV1ZSAtPiBCVVNZCgpMZXRzIGRpc2N1c3MgdGhp cyBvbmUgaW4gdGhlIGk5MTUgcGF0Y2ggdGhyZWFkLiBJdCBpcyBhYm91dCBkZWZpbmluZyAKc2Vt YW50aWNzIG9mIHRoZSBxdWV1ZWQgY291bnRlci4KCj4gCj4gCj4+ICsgICAgICAgc3BpblsxXSA9 IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAsIGUycmluZyhnZW1fZmQsIGUpLCAwKTsKPj4g KyAgICAgICBpZ3Rfc3Bpbl9iYXRjaF9zZXRfdGltZW91dChzcGluWzFdLCBiYXRjaF9kdXJhdGlv bl9ucyk7Cj4+ICsKPj4gKyAgICAgICBnZW1fc3luYyhnZW1fZmQsIHNwaW5bMF0tPmhhbmRsZSk7 Cj4+ICsKPj4gKyAgICAgICB2YWwgPSBwbXVfcmVhZF9zaW5nbGUoZmQpOwo+PiArICAgICAgIGFz c2VydF93aXRoaW5fZXBzaWxvbih2YWwsIGJhdGNoX2R1cmF0aW9uX25zLCB0b2xlcmFuY2UpOwo+ PiArCj4+ICsgICAgICAgZ2VtX3N5bmMoZ2VtX2ZkLCBzcGluWzFdLT5oYW5kbGUpOwo+PiArCj4+ ICsgICAgICAgaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW5bMF0pOwo+PiArICAgICAg IGlndF9zcGluX2JhdGNoX2ZyZWUoZ2VtX2ZkLCBzcGluWzFdKTsKPj4gKyAgICAgICBjbG9zZShm ZCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkCj4+ICtidXN5X2NoZWNrX2FsbChpbnQgZ2Vt X2ZkLCBjb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmUsCj4+ICsgICAgICAg ICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBudW1fZW5naW5lcykKPj4gK3sKPj4gKyAgICAgICBj b25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmVfOwo+PiArICAgICAgIHVpbnQ2 NF90IHZhbFtudW1fZW5naW5lc107Cj4+ICsgICAgICAgaW50IGZkW251bV9lbmdpbmVzXTsKPj4g KyAgICAgICBpZ3Rfc3Bpbl90ICpzcGluOwo+PiArICAgICAgIHVuc2lnbmVkIGludCBidXN5X2lk eCwgaTsKPj4gKwo+PiArICAgICAgIGkgPSAwOwo+PiArICAgICAgIGZkWzBdID0gLTE7Cj4+ICsg ICAgICAgZm9yX2VhY2hfZW5naW5lX2NsYXNzX2luc3RhbmNlKGZkLCBlXykgewo+PiArICAgICAg ICAgICAgICAgaWYgKCFnZW1faGFzX2VuZ2luZShnZW1fZmQsIGVfLT5jbGFzcywgZV8tPmluc3Rh bmNlKSkKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4+ICsgICAgICAgICAg ICAgICBlbHNlIGlmIChlID09IGVfKQo+PiArICAgICAgICAgICAgICAgICAgICAgICBidXN5X2lk eCA9IGk7Cj4+ICsKPj4gKyAgICAgICAgICAgICAgIGZkW2krK10gPSBvcGVuX2dyb3VwKEk5MTVf UE1VX0VOR0lORV9CVVNZKGVfLT5jbGFzcywKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVfLT5pbnN0YW5jZSksCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZFswXSk7Cj4+ICsgICAgICAgfQo+PiArCj4+ ICsgICAgICAgc3BpbiA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAsIGUycmluZyhnZW1f ZmQsIGUpLCAwKTsKPj4gKyAgICAgICBpZ3Rfc3Bpbl9iYXRjaF9zZXRfdGltZW91dChzcGluLCBi YXRjaF9kdXJhdGlvbl9ucyk7Cj4+ICsKPj4gKyAgICAgICBnZW1fc3luYyhnZW1fZmQsIHNwaW4t PmhhbmRsZSk7Cj4+ICsKPj4gKyAgICAgICBwbXVfcmVhZF9tdWx0aShmZFswXSwgbnVtX2VuZ2lu ZXMsIHZhbCk7Cj4+ICsKPj4gKyAgICAgICBhc3NlcnRfd2l0aGluX2Vwc2lsb24odmFsW2J1c3lf aWR4XSwgYmF0Y2hfZHVyYXRpb25fbnMsIHRvbGVyYW5jZSk7Cj4+ICsgICAgICAgZm9yIChpID0g MDsgaSA8IG51bV9lbmdpbmVzOyBpKyspIHsKPiAKPiBkb3VibGUgZXhwZWN0ZWQ7Cj4gCj4gaWYg KGkgPT0gYnVzeV9pZHgpCj4gCWV4cGVjdGVkID0gYmF0Y2hfZHVyYXRpb25fbnM7Cj4gZWxzZQo+ IAlleHBlY3RlZCA9IDA7Cj4gYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFtpXSwgZXhwZWN0ZWQs IHRvbGVyYW5jZSk7CgpJIGRvbid0IHNlZSBhbnkgYWR2YW50YWdlIGJ1dCBjYW4gY2hhbmdlIGl0 IHN1cmUuCgo+IAo+IFByb2JhYmx5IHdvcnRoIGEgcHJlY2VkaW5nCj4gCj4gZm9yIChpID0gMDsg aSA8IG51bV9lbmdpbmVzOyBpKyspCj4gCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzJXM9 JWYsICIsIGkgPT0gYnVzeV9pZHggPyAiKiIgOiAiIiwgbmFtZVtpXSwgdmFsW2ldKTsKPiBidWZb bGVuLTJdID0gJ1wwOycKPiBpZ3RfaW5mbygiJXNcbiIsIGJ1Zik7CgpDYW4gZG8uCgo+IAo+IEhv dyBhYm91dCBiYXRjaGVzIGV4ZWN1dGluZyBmcm9tIGEgZGlmZmVyZW50IGNvbnRleHQsIG9yIHN1 Ym1pdHRlZCBmcm9tCj4gYSBkaWZmZXJlbnQgZmQ/CgpJIGNhbid0IHNlZSB0aGF0IGFkZGluZyBt dWNoIHZhbHVlPyBBbSBJIHRoaW5raW5nIHRvbyBtdWNoIHdoaXRlIGJveD8gClRoZSBwZXJmIEFQ SSBoYXMgbm90aGluZyB0byBkbyB3aXRoIHRoZSBkcm0gZmQgc28gSSBqdXN0IHNlZSBpdCBub3Qg CnJlbGV2YW50LgoKPj4gKyAgICAgICAgICAgICAgIGlmIChpID09IGJ1c3lfaWR4KQo+PiArICAg ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKPj4gKyAgICAgICAgICAgICAgIGFzc2VydF93 aXRoaW5fZXBzaWxvbih2YWxbaV0sIDAuMGYsIHRvbGVyYW5jZSk7Cj4+ICsgICAgICAgfQo+PiAr Cj4+ICsgICAgICAgaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4pOwo+PiArICAgICAg IGNsb3NlKGZkWzBdKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQKPj4gK21vc3RfYnVzeV9j aGVja19hbGwoaW50IGdlbV9mZCwgY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUy ICplLAo+PiArICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBudW1fZW5naW5l cykKPj4gK3sKPj4gKyAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIg KmVfOwo+PiArICAgICAgIHVpbnQ2NF90IHZhbFtudW1fZW5naW5lc107Cj4+ICsgICAgICAgaW50 IGZkW251bV9lbmdpbmVzXTsKPj4gKyAgICAgICBpZ3Rfc3Bpbl90ICpzcGluW251bV9lbmdpbmVz XTsKPj4gKyAgICAgICB1bnNpZ25lZCBpbnQgaWRsZV9pZHgsIGk7Cj4+ICsKPj4gKyAgICAgICBn ZW1fcmVxdWlyZV9lbmdpbmUoZ2VtX2ZkLCBlLT5jbGFzcywgZS0+aW5zdGFuY2UpOwo+PiArCj4+ ICsgICAgICAgaSA9IDA7Cj4+ICsgICAgICAgZmRbMF0gPSAtMTsKPj4gKyAgICAgICBmb3JfZWFj aF9lbmdpbmVfY2xhc3NfaW5zdGFuY2UoZmQsIGVfKSB7Cj4+ICsgICAgICAgICAgICAgICBpZiAo IWdlbV9oYXNfZW5naW5lKGdlbV9mZCwgZV8tPmNsYXNzLCBlXy0+aW5zdGFuY2UpKQo+PiArICAg ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKPj4gKwo+PiArICAgICAgICAgICAgICAgZmRb aV0gPSBvcGVuX2dyb3VwKEk5MTVfUE1VX0VOR0lORV9CVVNZKGVfLT5jbGFzcywKPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXy0+aW5z dGFuY2UpLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkWzBdKTsKPj4g Kwo+PiArICAgICAgICAgICAgICAgaWYgKGUgPT0gZV8pIHsKPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgaWRsZV9pZHggPSBpOwo+PiArICAgICAgICAgICAgICAgfSBlbHNlIHsKPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgc3BpbltpXSA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAs Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ZTJyaW5nKGdlbV9mZCwgZV8pLCAwKTsKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgaWd0X3Nw aW5fYmF0Y2hfc2V0X3RpbWVvdXQoc3BpbltpXSwgYmF0Y2hfZHVyYXRpb25fbnMpOwo+PiArICAg ICAgICAgICAgICAgfQo+PiArCj4+ICsgICAgICAgICAgICAgICBpKys7Cj4+ICsgICAgICAgfQo+ PiArCj4+ICsgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9lbmdpbmVzOyBpKyspIHsKPj4gKyAg ICAgICAgICAgICAgIGlmIChpICE9IGlkbGVfaWR4KQo+PiArICAgICAgICAgICAgICAgICAgICAg ICBnZW1fc3luYyhnZW1fZmQsIHNwaW5baV0tPmhhbmRsZSk7Cj4+ICsgICAgICAgfQo+PiArCj4+ ICsgICAgICAgcG11X3JlYWRfbXVsdGkoZmRbMF0sIG51bV9lbmdpbmVzLCB2YWwpOwo+PiArCj4+ ICsgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9lbmdpbmVzOyBpKyspIHsKPj4gKyAgICAgICAg ICAgICAgIGlmIChpID09IGlkbGVfaWR4KQo+PiArICAgICAgICAgICAgICAgICAgICAgICBhc3Nl cnRfd2l0aGluX2Vwc2lsb24odmFsW2ldLCAwLjBmLCB0b2xlcmFuY2UpOwo+PiArICAgICAgICAg ICAgICAgZWxzZQo+PiArICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRfd2l0aGluX2Vwc2ls b24odmFsW2ldLCBiYXRjaF9kdXJhdGlvbl9ucywKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHRvbGVyYW5jZSk7Cj4+ICsgICAgICAgfQo+PiArCj4+ICsg ICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9lbmdpbmVzOyBpKyspIHsKPj4gKyAgICAgICAgICAg ICAgIGlmIChpICE9IGlkbGVfaWR4KQo+PiArICAgICAgICAgICAgICAgICAgICAgICBpZ3Rfc3Bp bl9iYXRjaF9mcmVlKGdlbV9mZCwgc3BpbltpXSk7Cj4+ICsgICAgICAgfQo+PiArICAgICAgIGNs b3NlKGZkWzBdKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQKPj4gK2FsbF9idXN5X2NoZWNr X2FsbChpbnQgZ2VtX2ZkLCBjb25zdCB1bnNpZ25lZCBpbnQgbnVtX2VuZ2luZXMpCj4+ICt7Cj4+ ICsgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplOwo+PiArICAg ICAgIHVpbnQ2NF90IHZhbFtudW1fZW5naW5lc107Cj4+ICsgICAgICAgaW50IGZkW251bV9lbmdp bmVzXTsKPj4gKyAgICAgICBpZ3Rfc3Bpbl90ICpzcGluW251bV9lbmdpbmVzXTsKPj4gKyAgICAg ICB1bnNpZ25lZCBpbnQgaTsKPj4gKwo+PiArICAgICAgIGkgPSAwOwo+PiArICAgICAgIGZkWzBd ID0gLTE7Cj4+ICsgICAgICAgZm9yX2VhY2hfZW5naW5lX2NsYXNzX2luc3RhbmNlKGZkLCBlKSB7 Cj4+ICsgICAgICAgICAgICAgICBpZiAoIWdlbV9oYXNfZW5naW5lKGdlbV9mZCwgZS0+Y2xhc3Ms IGUtPmluc3RhbmNlKSkKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4+ICsK Pj4gKyAgICAgICAgICAgICAgIGZkW2ldID0gb3Blbl9ncm91cChJOTE1X1BNVV9FTkdJTkVfQlVT WShlLT5jbGFzcywgZS0+aW5zdGFuY2UpLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGZkWzBdKTsKPj4gKwo+PiArICAgICAgICAgICAgICAgc3BpbltpXSA9IGlndF9zcGlu X2JhdGNoX25ldyhnZW1fZmQsIDAsIGUycmluZyhnZW1fZmQsIGUpLCAwKTsKPj4gKyAgICAgICAg ICAgICAgIGlndF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW5baV0sIGJhdGNoX2R1cmF0aW9u X25zKTsKPj4gKwo+PiArICAgICAgICAgICAgICAgaSsrOwo+PiArICAgICAgIH0KPj4gKwo+PiAr ICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZW5naW5lczsgaSsrKQo+PiArICAgICAgICAgICAg ICAgZ2VtX3N5bmMoZ2VtX2ZkLCBzcGluW2ldLT5oYW5kbGUpOwo+PiArCj4+ICsgICAgICAgcG11 X3JlYWRfbXVsdGkoZmRbMF0sIG51bV9lbmdpbmVzLCB2YWwpOwo+PiArCj4+ICsgICAgICAgZm9y IChpID0gMDsgaSA8IG51bV9lbmdpbmVzOyBpKyspCj4+ICsgICAgICAgICAgICAgICBhc3NlcnRf d2l0aGluX2Vwc2lsb24odmFsW2ldLCBiYXRjaF9kdXJhdGlvbl9ucywgdG9sZXJhbmNlKTsKPj4g Kwo+PiArICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZW5naW5lczsgaSsrKQo+PiArICAgICAg ICAgICAgICAgaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW5baV0pOwo+PiArICAgICAg IGNsb3NlKGZkWzBdKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQKPj4gK25vX3NlbWEoaW50 IGdlbV9mZCwgY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplLCBib29sIGJ1 c3kpCj4+ICt7Cj4+ICsgICAgICAgaWd0X3NwaW5fdCAqc3BpbjsKPj4gKyAgICAgICB1aW50NjRf dCB2YWxbMl07Cj4+ICsgICAgICAgaW50IGZkOwo+PiArCj4+ICsgICAgICAgZmQgPSBvcGVuX2dy b3VwKEk5MTVfUE1VX0VOR0lORV9TRU1BKGUtPmNsYXNzLCBlLT5pbnN0YW5jZSksIC0xKTsKPj4g KyAgICAgICBvcGVuX2dyb3VwKEk5MTVfUE1VX0VOR0lORV9XQUlUKGUtPmNsYXNzLCBlLT5pbnN0 YW5jZSksIGZkKTsKPj4gKwo+PiArICAgICAgIGlmIChidXN5KSB7Cj4+ICsgICAgICAgICAgICAg ICBzcGluID0gaWd0X3NwaW5fYmF0Y2hfbmV3KGdlbV9mZCwgMCwgZTJyaW5nKGdlbV9mZCwgZSks IDApOwo+PiArICAgICAgICAgICAgICAgaWd0X3NwaW5fYmF0Y2hfc2V0X3RpbWVvdXQoc3Bpbiwg YmF0Y2hfZHVyYXRpb25fbnMpOwo+IAo+IFRoZXNlIGJ1c3kgcGF0aHMgYXJlIG5vdCBzZXJpYWxp c2VkIHRvIHRoZSBiYXRjaCwgaXQgaXMgcXVpdGUgcG9zc2libGUKPiBmb3IgdGhlIHBtdV9yZWFk IHRvIGhhcHBlbiBiZWZvcmUgdGhlIHNwaW4gaXMgZXZlbiBzY2hlZHVsZWQgZm9yCj4gZXhlY3V0 aW9uIG9uIHRoZSBody4KCk1yIFJlZmFjdG9yaW5nIHN0b2xlIG15IGdlbV9zeW5jIGNhbGwuIDop Cgo+IAo+PiArICAgICAgIH0gZWxzZSB7Cj4+ICsgICAgICAgICAgICAgICB1c2xlZXAoYmF0Y2hf ZHVyYXRpb25fbnMgLyAxMDAwKTsKPj4gKyAgICAgICB9Cj4+ICsKPj4gKyAgICAgICBwbXVfcmVh ZF9tdWx0aShmZCwgMiwgdmFsKTsKPj4gKwo+PiArICAgICAgIGFzc2VydF93aXRoaW5fZXBzaWxv bih2YWxbMF0sIDAuMGYsIHRvbGVyYW5jZSk7Cj4+ICsgICAgICAgYXNzZXJ0X3dpdGhpbl9lcHNp bG9uKHZhbFsxXSwgMC4wZiwgdG9sZXJhbmNlKTsKPj4gKwo+PiArICAgICAgIGlmIChidXN5KQo+ PiArICAgICAgICAgICAgICAgaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4pOwo+PiAr ICAgICAgIGNsb3NlKGZkKTsKPiAKPiBJJ20gc3RpbGwgYXQgYSBsb3NzIGFzIHRvIHdoeSB0aGlz IHRlc3QgaXMgaW50ZXJlc3RpbmcuIFlvdSB3YW50IHRvIHNheQo+IHRoYXQgZ2l2ZW4gYW4gaWRs ZSBlbmdpbmUgd2l0aCBhIHNpbmdsZSBiYXRjaCB0aGVyZSBpcyBubyB0aW1lIHNwZW50Cj4gd2Fp dGluZyBmb3IgYW4gTUkgZXZlbnQsIG5vciB3YWl0aW5nIG9uIGEgc2VtYXBob3JlLiBXaGVyZSBp cyB0aGF0Cj4gZ3VhcmFudGVlZD8gV2hhdCBoYXBwZW5zIGlmIHdlIGRvIG5lZWQgdG8gZG8gc3Vj aCBhIHByZS1iYXRjaCArIHN5bmMgaW4KPiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2FudGVkIHRvIHNh eSB0aGF0IHdoaWxzdCB0aGUgYmF0Y2ggaXMgZXhlY3V0aW5nIHRoYXQKPiBubyB0aW1lIGlzIHNw ZW50IHByb2Nlc3NpbmcgcmVxdWVzdHMgdGhlIGJhdGNoIGlzbid0IG1ha2luZywgdGhlbiBtYXli ZS4KPiBCdXQgd2l0aG91dCBhIHRlc3QgdG8gZGVtb25zdHJhdGUgdGhlIG9wcG9zaXRlLCB3ZSBz dGlsbCBoYXZlIG5vIGlkZWEgaWYKPiB0aGUgY291bnRlcnMgd29yay4KClllYWgsIEkgYW0gc3Rp bGwgYXQgYSBzdGFnZSBvZiBwdW50aW5nIG9mZiB0aGUgc2VtYXBob3JlIHdvcmsgdG8gYWZ0ZXIg CnRoZSByZXN0IGlzIHBvbGlzaGVkLiBOZWVkIHRvIG5vc2UgYXJvdW5kIHNvbWUgdGVzdHMgYW5k IHNlZSBpZiBJIGNhbiAKbGlmdCBzb21lIGNvZGUgaW52b2x2aW5nIHNlbWFwaG9yZXMuCgo+IAo+ PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZAo+PiArbXVsdGlfY2xpZW50KGludCBnZW1fZmQsIGNv bnN0IHN0cnVjdCBpbnRlbF9leGVjdXRpb25fZW5naW5lMiAqZSkKPj4gK3sKPj4gKyAgICAgICB1 aW50NjRfdCBjb25maWcgPSBJOTE1X1BNVV9FTkdJTkVfQlVTWShlLT5jbGFzcywgZS0+aW5zdGFu Y2UpOwo+PiArICAgICAgIGlndF9zcGluX3QgKnNwaW47Cj4+ICsgICAgICAgdWludDY0X3QgdmFs WzJdOwo+PiArICAgICAgIGludCBmZFsyXTsKPj4gKwo+PiArICAgICAgIGZkWzBdID0gb3Blbl9w bXUoY29uZmlnKTsKPj4gKwo+PiArICAgICAgIHNwaW4gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2Vt X2ZkLCAwLCBlMnJpbmcoZ2VtX2ZkLCBlKSwgMCk7Cj4+ICsgICAgICAgaWd0X3NwaW5fYmF0Y2hf c2V0X3RpbWVvdXQoc3BpbiwgYmF0Y2hfZHVyYXRpb25fbnMpOwo+PiArCj4+ICsgICAgICAgZ3Vh cmFudGVlZF91c2xlZXAoYmF0Y2hfZHVyYXRpb25fbnMgLyAzMDAwKTsKPj4gKwo+PiArICAgICAg IC8qCj4+ICsgICAgICAgICogU2Vjb25kIFBNVSBjbGllbnQgd2hpY2ggaXMgaW5pdGlhbGl6ZWQg YWZ0ZXIgdGhlIGZpcnN0IG9uZSwKPj4gKyAgICAgICAgKiBhbmQgZXhpc3RzIGJlZm9yZSBpdCwg c2hvdWxkIG5vdCBhZmZlY3QgYWNjb3VudGluZyBhcyByZXBvcnRlZAo+PiArICAgICAgICAqIGlu IHRoZSBmaXJzdCBjbGllbnQuCj4+ICsgICAgICAgICovCj4+ICsgICAgICAgZmRbMV0gPSBvcGVu X3BtdShjb25maWcpOwo+PiArICAgICAgIGd1YXJhbnRlZWRfdXNsZWVwKGJhdGNoX2R1cmF0aW9u X25zIC8gMzAwMCk7Cj4+ICsgICAgICAgdmFsWzFdID0gcG11X3JlYWRfc2luZ2xlKGZkWzFdKTsK Pj4gKyAgICAgICBjbG9zZShmZFsxXSk7Cj4+ICsKPj4gKyAgICAgICBnZW1fc3luYyhnZW1fZmQs IHNwaW4tPmhhbmRsZSk7Cj4+ICsKPj4gKyAgICAgICB2YWxbMF0gPSBwbXVfcmVhZF9zaW5nbGUo ZmRbMF0pOwo+PiArCj4+ICsgICAgICAgYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFswXSwgYmF0 Y2hfZHVyYXRpb25fbnMsIHRvbGVyYW5jZSk7Cj4+ICsgICAgICAgYXNzZXJ0X3dpdGhpbl9lcHNp bG9uKHZhbFsxXSwgYmF0Y2hfZHVyYXRpb25fbnMgLyAzLCB0b2xlcmFuY2UpOwo+PiArCj4+ICsg ICAgICAgaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNwaW4pOwo+PiArICAgICAgIGNsb3Nl KGZkWzBdKTsKPj4gK30KPj4gKwo+PiArLyoqCj4+ICsgKiBUZXN0cyB0aGF0IGk5MTUgUE1VIGNv cmVjdGx5IGVycm9ycyBvdXQgaW4gaW52YWxpZCBpbml0aWFsaXphdGlvbi4KPj4gKyAqIGk5MTUg UE1VIGlzIHVuY29yZSBQTVUsIHRodXM6Cj4+ICsgKiAgLSBzYW1wbGluZyBwZXJpb2QgaXMgbm90 IHN1cHBvcnRlZAo+PiArICogIC0gcGlkID4gMCBpcyBub3Qgc3VwcG9ydGVkIHNpbmNlIHdlIGNh bid0IGNvdW50IHBlci1wcm9jZXNzICh3ZSBjb3VudAo+PiArICogICAgcGVyIHdob2xlIHN5c3Rl bSkKPj4gKyAqICAtIGNwdSAhPSAwIGlzIG5vdCBzdXBwb3J0ZWQgc2luY2UgaTkxNSBQTVUgZXhw b3NlcyBjcHVtYXNrIGZvciBDUFUwCj4+ICsgKi8KPj4gK3N0YXRpYyB2b2lkIGludmFsaWRfaW5p dCh2b2lkKQo+PiArewo+PiArICAgICAgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgYXR0cjsKPj4g KyAgICAgICBpbnQgcGlkLCBjcHU7Cj4+ICsKPj4gKyNkZWZpbmUgQVRUUl9JTklUKCkgXAo+PiAr ZG8geyBcCj4+ICsgICAgICAgbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YgKGF0dHIpKTsgXAo+PiAr ICAgICAgIGF0dHIuY29uZmlnID0gSTkxNV9QTVVfRU5HSU5FX0JVU1koSTkxNV9FTkdJTkVfQ0xB U1NfUkVOREVSLCAwKTsgXAo+PiArICAgICAgIGF0dHIudHlwZSA9IGk5MTVfdHlwZV9pZCgpOyBc Cj4+ICsgICAgICAgaWd0X2Fzc2VydChhdHRyLnR5cGUgIT0gMCk7IFwKPj4gK30gd2hpbGUoMCkK Pj4gKwo+PiArICAgICAgIEFUVFJfSU5JVCgpOwo+PiArICAgICAgIGF0dHIuc2FtcGxlX3Blcmlv ZCA9IDEwMDsKPj4gKyAgICAgICBwaWQgPSAtMTsKPj4gKyAgICAgICBjcHUgPSAwOwo+PiArICAg ICAgIGlndF9hc3NlcnRfZXEocGVyZl9ldmVudF9vcGVuKCZhdHRyLCBwaWQsIGNwdSwgLTEsIDAp LCAtMSk7Cj4+ICsgICAgICAgaWd0X2Fzc2VydF9lcShlcnJubywgRUlOVkFMKTsKPj4gKwo+PiAr ICAgICAgIEFUVFJfSU5JVCgpOwo+PiArICAgICAgIHBpZCA9IDA7Cj4+ICsgICAgICAgY3B1ID0g MDsKPj4gKyAgICAgICBpZ3RfYXNzZXJ0X2VxKHBlcmZfZXZlbnRfb3BlbigmYXR0ciwgcGlkLCBj cHUsIC0xLCAwKSwgLTEpOwo+PiArICAgICAgIGlndF9hc3NlcnRfZXEoZXJybm8sIEVJTlZBTCk7 Cj4+ICsKPj4gKyAgICAgICBBVFRSX0lOSVQoKTsKPj4gKyAgICAgICBwaWQgPSAtMTsKPj4gKyAg ICAgICBjcHUgPSAxOwo+PiArICAgICAgIGlndF9hc3NlcnRfZXEocGVyZl9ldmVudF9vcGVuKCZh dHRyLCBwaWQsIGNwdSwgLTEsIDApLCAtMSk7Cj4+ICsgICAgICAgaWd0X2Fzc2VydF9lcShlcnJu bywgRU5PREVWKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgaW5pdF9vdGhlcih1bnNpZ25l ZCBpbnQgaSwgYm9vbCB2YWxpZCkKPj4gK3sKPj4gKyAgICAgICBpbnQgZmQ7Cj4+ICsKPj4gKyAg ICAgICBmZCA9IHBlcmZfaTkxNV9vcGVuKF9fSTkxNV9QTVVfT1RIRVIoaSkpOwo+PiArICAgICAg IGlndF9yZXF1aXJlKCEoZmQgPCAwICYmIGVycm5vID09IEVOT0RFVikpOwo+IAo+IE1ha2UgcGVy Zl9pOTE1X29wZW4gcmV0dXJuIC1lcnJuby4gSXQgc2ltcGxpZmllcyBjaGVja3Mgc28gbXVjaC4K CkhtIG9rLgoKPiAKPj4gKyAgICAgICBpZiAodmFsaWQpIHsKPj4gKyAgICAgICAgICAgICAgIGln dF9hc3NlcnQoZmQgPj0gMCk7Cj4+ICsgICAgICAgfSBlbHNlIHsKPj4gKyAgICAgICAgICAgICAg IGlndF9hc3NlcnQoZmQgPCAwKTsKPj4gKyAgICAgICAgICAgICAgIHJldHVybjsKPj4gKyAgICAg ICB9Cj4+ICsKPj4gKyAgICAgICBjbG9zZShmZCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lk IHJlYWRfb3RoZXIodW5zaWduZWQgaW50IGksIGJvb2wgdmFsaWQpCj4+ICt7Cj4+ICsgICAgICAg aW50IGZkOwo+PiArCj4+ICsgICAgICAgZmQgPSBwZXJmX2k5MTVfb3BlbihfX0k5MTVfUE1VX09U SEVSKGkpKTsKPj4gKyAgICAgICBpZ3RfcmVxdWlyZSghKGZkIDwgMCAmJiBlcnJubyA9PSBFTk9E RVYpKTsKPj4gKyAgICAgICBpZiAodmFsaWQpIHsKPj4gKyAgICAgICAgICAgICAgIGlndF9hc3Nl cnQoZmQgPj0gMCk7Cj4+ICsgICAgICAgfSBlbHNlIHsKPj4gKyAgICAgICAgICAgICAgIGlndF9h c3NlcnQoZmQgPCAwKTsKPj4gKyAgICAgICAgICAgICAgIHJldHVybjsKPj4gKyAgICAgICB9Cj4+ ICsKPj4gKyAgICAgICAodm9pZClwbXVfcmVhZF9zaW5nbGUoZmQpOwo+PiArCj4+ICsgICAgICAg Y2xvc2UoZmQpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgYm9vbCBjcHUwX2hvdHBsdWdfc3VwcG9y dCh2b2lkKQo+PiArewo+PiArICAgICAgIGludCBmZCA9IG9wZW4oIi9zeXMvZGV2aWNlcy9zeXN0 ZW0vY3B1L2NwdTAvb25saW5lIiwgT19XUk9OTFkpOwo+IAo+IGFjY2VzcygiLi4iLCBXX09LKTsK ClllcCwgdGhhbmtzLgoKPiAKPj4gKwo+PiArICAgICAgIGNsb3NlKGZkKTsKPj4gKwo+PiArICAg ICAgIHJldHVybiBmZCA+IDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIGNwdV9ob3RwbHVn KGludCBnZW1fZmQpCj4+ICt7Cj4+ICsgICAgICAgc3RydWN0IHRpbWVzcGVjIHN0YXJ0ID0geyB9 Owo+PiArICAgICAgIGlndF9zcGluX3QgKnNwaW47Cj4+ICsgICAgICAgdWludDY0X3QgdmFsLCBy ZWY7Cj4+ICsgICAgICAgaW50IGZkOwo+PiArCj4+ICsgICAgICAgaWd0X3JlcXVpcmUoY3B1MF9o b3RwbHVnX3N1cHBvcnQoKSk7Cj4+ICsKPj4gKyAgICAgICBzcGluID0gaWd0X3NwaW5fYmF0Y2hf bmV3KGdlbV9mZCwgMCwgSTkxNV9FWEVDX1JFTkRFUiwgMCk7Cj4+ICsgICAgICAgZmQgPSBwZXJm X2k5MTVfb3BlbihJOTE1X1BNVV9FTkdJTkVfQlVTWShJOTE1X0VOR0lORV9DTEFTU19SRU5ERVIs IDApKTsKPj4gKyAgICAgICBpZ3RfYXNzZXJ0KGZkID49IDApOwo+PiArCj4+ICsgICAgICAgaWd0 X25zZWNfZWxhcHNlZCgmc3RhcnQpOwo+PiArCj4+ICsgICAgICAgLyoKPj4gKyAgICAgICAgKiBU b2dnbGUgb25saW5lIHN0YXR1cyBvZiBhbGwgdGhlIENQVXMgaW4gYSBjaGlsZCBwcm9jZXNzIGFu ZCBlbnN1cmUKPj4gKyAgICAgICAgKiB0aGlzIGhhcyBub3QgYWZmZWN0ZWQgYnVzeW5lc3Mgc3Rh dHMgaW4gdGhlIHBhcmVudC4KPj4gKyAgICAgICAgKi8KPj4gKyAgICAgICBpZ3RfZm9yayhjaGls ZCwgMSkgewo+PiArICAgICAgICAgICAgICAgaW50IGNwdSA9IDA7Cj4+ICsKPj4gKyAgICAgICAg ICAgICAgIGZvciAoOzspIHsKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBuYW1lWzEy OF07Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgIGludCBjcHVmZDsKPj4gKwo+PiArICAgICAg ICAgICAgICAgICAgICAgICBzcHJpbnRmKG5hbWUsICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9j cHUlZC9vbmxpbmUiLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdSk7Cj4+ ICsgICAgICAgICAgICAgICAgICAgICAgIGNwdWZkID0gb3BlbihuYW1lLCBPX1dST05MWSk7Cj4+ ICsgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcHVmZCA9PSAtMSkgewo+PiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGlndF9hc3NlcnQoY3B1ID4gMCk7Cj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgIH0K Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgaWd0X2Fzc2VydF9lcSh3cml0ZShjcHVmZCwgIjAi LCAyKSwgMik7Cj4+ICsKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgdXNsZWVwKDEwMDAgKiAx MDAwKTsKPj4gKwo+PiArICAgICAgICAgICAgICAgICAgICAgICBpZ3RfYXNzZXJ0X2VxKHdyaXRl KGNwdWZkLCAiMSIsIDIpLCAyKTsKPj4gKwo+PiArICAgICAgICAgICAgICAgICAgICAgICBjbG9z ZShjcHVmZCk7Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgIGNwdSsrOwo+PiArICAgICAgICAg ICAgICAgfQo+PiArICAgICAgIH0KPj4gKwo+PiArICAgICAgIGlndF93YWl0Y2hpbGRyZW4oKTsK Pj4gKwo+PiArICAgICAgIGlndF9zcGluX2JhdGNoX2VuZChzcGluKTsKPj4gKyAgICAgICBnZW1f c3luYyhnZW1fZmQsIHNwaW4tPmhhbmRsZSk7Cj4+ICsKPj4gKyAgICAgICByZWYgPSBpZ3RfbnNl Y19lbGFwc2VkKCZzdGFydCk7Cj4+ICsgICAgICAgdmFsID0gcG11X3JlYWRfc2luZ2xlKGZkKTsK Pj4gKwo+PiArICAgICAgIGFzc2VydF93aXRoaW5fZXBzaWxvbih2YWwsIHJlZiwgdG9sZXJhbmNl KTsKPj4gKwo+PiArICAgICAgIGlndF9zcGluX2JhdGNoX2ZyZWUoZ2VtX2ZkLCBzcGluKTsKPj4g KyAgICAgICBjbG9zZShmZCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgY2hhaW5fbm9wKGlu dCBnZW1fZmQsIGludCBpbl9mZW5jZSwgYm9vbCBzeW5jKQo+PiArewo+PiArICAgICAgIHN0cnVj dCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyIG9iaiA9IHt9Owo+PiArICAgICAgIHN0cnVjdCBk cm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgZWIgPQo+PiArICAgICAgICAgICAgICAgeyAuYnVmZmVy X2NvdW50ID0gMSwgLmJ1ZmZlcnNfcHRyID0gKHVpbnRwdHJfdCkmb2JqfTsKPj4gKyAgICAgICBj b25zdCB1aW50MzJfdCBiYmUgPSAweGEgPDwgMjM7Cj4+ICsKPj4gKyAgICAgICBvYmouaGFuZGxl ID0gZ2VtX2NyZWF0ZShnZW1fZmQsIHNpemVvZihiYmUpKTsKPj4gKyAgICAgICBnZW1fd3JpdGUo Z2VtX2ZkLCBvYmouaGFuZGxlLCAwLCAmYmJlLCBzaXplb2YoYmJlKSk7Cj4+ICsKPj4gKyAgICAg ICBlYi5mbGFncyA9IEk5MTVfRVhFQ19SRU5ERVIgfCBJOTE1X0VYRUNfRkVOQ0VfT1VUOwo+PiAr Cj4+ICsgICAgICAgaWYgKGluX2ZlbmNlID49IDApIHsKPj4gKyAgICAgICAgICAgICAgIGViLmZs YWdzIHw9IEk5MTVfRVhFQ19GRU5DRV9JTjsKPj4gKyAgICAgICAgICAgICAgIGViLnJzdmQyID0g aW5fZmVuY2U7Cj4+ICsgICAgICAgfQo+PiArCj4+ICsgICAgICAgZ2VtX2V4ZWNidWZfd3IoZ2Vt X2ZkLCAmZWIpOwo+PiArCj4+ICsgICAgICAgaWYgKHN5bmMpCj4+ICsgICAgICAgICAgICAgICBn ZW1fc3luYyhnZW1fZmQsIG9iai5oYW5kbGUpOwo+PiArCj4+ICsgICAgICAgZ2VtX2Nsb3NlKGdl bV9mZCwgb2JqLmhhbmRsZSk7Cj4+ICsgICAgICAgaWYgKGluX2ZlbmNlID49IDApCj4+ICsgICAg ICAgICAgICAgICBjbG9zZShpbl9mZW5jZSk7Cj4+ICsKPj4gKyAgICAgICByZXR1cm4gZWIucnN2 ZDIgPj4gMzI7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkCj4+ICt0ZXN0X2ludGVycnVwdHMo aW50IGdlbV9mZCkKPj4gK3sKPj4gKyAgICAgICB1aW50NjRfdCBpZGxlLCBidXN5LCBwcmV2Owo+ PiArICAgICAgIGludCBmZCwgZmVuY2UgPSAtMTsKPj4gKyAgICAgICBjb25zdCB1bnNpZ25lZCBp bnQgY291bnQgPSAxMDAwOwo+PiArICAgICAgIHVuc2lnbmVkIGludCBpOwo+PiArCj4+ICsgICAg ICAgZmQgPSBvcGVuX3BtdShJOTE1X1BNVV9JTlRFUlJVUFRTKTsKPj4gKwo+PiArICAgICAgIGdl bV9xdWllc2NlbnRfZ3B1KGdlbV9mZCk7Cj4+ICsKPj4gKyAgICAgICAvKiBXYWl0IGZvciBpZGxl IHN0YXRlLiAqLwo+PiArICAgICAgIHByZXYgPSBwbXVfcmVhZF9zaW5nbGUoZmQpOwo+PiArICAg ICAgIGlkbGUgPSBwcmV2ICsgMTsKPj4gKyAgICAgICB3aGlsZSAoaWRsZSAhPSBwcmV2KSB7Cj4+ ICsgICAgICAgICAgICAgICB1c2xlZXAoYmF0Y2hfZHVyYXRpb25fbnMgLyAxMDAwKTsKPj4gKyAg ICAgICAgICAgICAgIHByZXYgPSBpZGxlOwo+PiArICAgICAgICAgICAgICAgaWRsZSA9IHBtdV9y ZWFkX3NpbmdsZShmZCk7Cj4+ICsgICAgICAgfQo+PiArCj4+ICsgICAgICAgaWd0X2Fzc2VydF9l cShpZGxlIC0gcHJldiwgMCk7Cj4+ICsKPj4gKyAgICAgICAvKiBTZW5kIHNvbWUgbm8tb3AgYmF0 Y2hlcyB3aXRoIGNoYWluZWQgZmVuY2VzIHRvIGVuc3VyZSBpbnRlcnJ1cHRzLiAqLwo+IAo+IE5v dCBhbGwga2VybmVscyB3b3VsZCBlbWl0IGludGVycnVwdHMgZm9yIHRoaXMuIFJlbWVtYmVyIHdl IHVzZWQgdG8gc3Bpbgo+IG9uIHRoZSBpbi1mZW5jZSB0byBhdm9pZCB0aGUgaW50ZXJydXB0IHNl dHVwIG92ZXJoZWFkLiBBbmQgdGhlcmUncyBubwo+IHJlYXNvbiB0byBhc3N1bWUgd2Ugd291bGRu J3QgYWdhaW4gaWYgdGhlcmUgd2FzIGEgZGVtb25zdHJhYmxlCj4gYWR2YW50YWdlLgo+IAo+IFlv dSd2ZSBhc3N1bWVkIGV4ZWNsaXN0cyBlbHNld2hlcmUsIHNvIHdoeSBub3QgZ2VuZXJhdGUgY29u dGV4dC1zd2l0Y2gKPiBpbnRlcnJ1cHRzIGluc3RlYWQ/IEkgcHJlc3VtZSB5b3UgZGlkIHRyeSBN SV9VU0VSX0lOVEVSUlVQVCBmcm9tIGEgdXNlcgo+IGJhdGNoPyBpaXJjIGl0IHNob3VsZCBzdGls bCB3b3JrLgoKRXZlbiBpZiBJIGVtaXQgaXQgbXlzZWxmIHdobyBndWFyYW50ZWVzIGk5MTUgaXMg bGlzdGVuaW5nIHRvIHRoZW0/IFNvIEkgCnRob3VnaHQgaXQgaXMgZWFzaWVyIHRvIGhhdmUgaTkx NSBlbWl0IHRoZW0gZm9yIG1lLCBhbmQgYnkgdXNpbmcgZmVuY2VzIAplbnN1cmluZyBpdCBpcyBs aXN0ZW5pbmcuCgpDb3VsZCBtb3ZlIHRvd2FyZHMgbG9uZ2VyIGJhdGNoZXMgdG8gZGVmZWF0IGFu eSBmdXR1cmUgYnVzeXNwaW5uaW5nIHdlIAptaWdodCBhZGQ/Cgo+IAo+PiArICAgICAgIGZvciAo aSA9IDE7IGkgPD0gY291bnQ7IGkrKykKPj4gKyAgICAgICAgICAgICAgIGZlbmNlID0gY2hhaW5f bm9wKGdlbV9mZCwgZmVuY2UsIGkgPCBjb3VudCA/IGZhbHNlIDogdHJ1ZSk7Cj4+ICsgICAgICAg Y2xvc2UoZmVuY2UpOwo+PiArCj4+ICsgICAgICAgLyogQ2hlY2sgYXQgbGVhc3QgYXMgbWFueSBp bnRlcnJ1cHRzIGhhcyBiZWVuIGdlbmVyYXRlZC4gKi8KPj4gKyAgICAgICBidXN5ID0gcG11X3Jl YWRfc2luZ2xlKGZkKTsKPj4gKyAgICAgICBpZ3RfYXNzZXJ0KGJ1c3kgPiBjb3VudCAvIDIwKTsK Pj4gKwo+PiArICAgICAgIGNsb3NlKGZkKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQKPj4g K3Rlc3RfZnJlcXVlbmN5KGludCBnZW1fZmQpCj4+ICt7Cj4+ICsgICAgICAgaWd0X3NwaW5fdCAq c3BpbjsKPj4gKyAgICAgICB1aW50NjRfdCBpZGxlWzJdLCBidXN5WzJdOwo+PiArICAgICAgIGlu dCBmZDsKPj4gKwo+PiArICAgICAgIGZkID0gb3Blbl9ncm91cChJOTE1X1BNVV9SRVFVRVNURURf RlJFUVVFTkNZLCAtMSk7Cj4+ICsgICAgICAgb3Blbl9ncm91cChJOTE1X1BNVV9BQ1RVQUxfRlJF UVVFTkNZLCBmZCk7Cj4+ICsKPj4gKyAgICAgICBnZW1fcXVpZXNjZW50X2dwdShnZW1fZmQpOwo+ PiArICAgICAgIHVzbGVlcChiYXRjaF9kdXJhdGlvbl9ucyAvIDEwMDApOwo+PiArCj4+ICsgICAg ICAgcG11X3JlYWRfbXVsdGkoZmQsIDIsIGlkbGUpOwo+PiArCj4+ICsgICAgICAgLyoKPj4gKyAg ICAgICAgKiBQdXQgc29tZSBsb2FkIG9uIHRoZSByZW5kZXIgZW5naW5lIGFuZCBjaGVjayB0aGF0 IHRoZSByZXF1ZW5zdAo+PiArICAgICAgICAqIGFuZCBhY3R1YWwgZnJlcXVlbmNpZXMgaGF2ZSBn b25lIHVwLgo+PiArICAgICAgICAqCj4+ICsgICAgICAgICogRklYTUUgVGhpcyBtaWdodCBub3Qg YmUgZ3VhcmFudGVlZCB0byB3b3JrIG9uIGFsbCBwbGF0Zm9ybXMuCj4+ICsgICAgICAgICogSG93 IHRvIGRldGVjdCB0aG9zZT8KPj4gKyAgICAgICAgKi8KPiAKPiBJIGRvbid0IHRoaW5rIHdlIGNh biBtYWtlIGFueSBndWFyYW50ZWVzIGFib3V0IGZyZXEsIGV4Y2VwdCB0aGUKPiBzb2Z0bGltaXRz IGltcG9zZWQgdmlhIHN5c2ZzLgo+IAo+IFNvIHVzZSB0aGF0Lgo+IAo+IENyZWF0ZSBhIHNwaW4g YmF0Y2gsIHNldCBtaW4vbWF4IHRvIGxvdy4gTWVhc3VyZS4gU2V0IG1pbi9tYXggdG8gaGlnaCwg c2FtcGxlCj4gYWdhaW4uIFRoZSByZXN1bHRzIHNob3VsZCBmb2xsb3cgdGhlIHZhbHVlcyBzZXQg dmlhIHN5c2ZzLgoKQWhhLCB0aGFua3MgZm9yIHRoZSBpZGVhIQoKPiAKPj4gKyAgICAgICBzcGlu ID0gaWd0X3NwaW5fYmF0Y2hfbmV3KGdlbV9mZCwgMCwgSTkxNV9FWEVDX1JFTkRFUiwgMCk7Cj4+ ICsgICAgICAgaWd0X3NwaW5fYmF0Y2hfc2V0X3RpbWVvdXQoc3BpbiwgYmF0Y2hfZHVyYXRpb25f bnMpOwo+PiArICAgICAgIGdlbV9zeW5jKGdlbV9mZCwgc3Bpbi0+aGFuZGxlKTsKPj4gKwo+PiAr ICAgICAgIHBtdV9yZWFkX211bHRpKGZkLCAyLCBidXN5KTsKPj4gKwo+PiArICAgICAgIGlndF9h c3NlcnQoYnVzeVswXSA+IGlkbGVbMF0pOwo+PiArICAgICAgIGlndF9hc3NlcnQoYnVzeVsxXSA+ IGlkbGVbMV0pOwo+PiArCj4+ICsgICAgICAgaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1fZmQsIHNw aW4pOwo+PiArICAgICAgIGNsb3NlKGZkKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQKPj4g K3Rlc3RfcmM2KGludCBnZW1fZmQpCj4+ICt7Cj4+ICsgICAgICAgaW50NjRfdCBkdXJhdGlvbl9u cyA9IDIgKiAxMDAwICogMTAwMCAqIDEwMDA7Cj4+ICsgICAgICAgdWludDY0X3QgaWRsZSwgYnVz eSwgcHJldjsKPj4gKyAgICAgICBpbnQgZmQsIGZ3Owo+PiArCj4+ICsgICAgICAgZmQgPSBvcGVu X3BtdShJOTE1X1BNVV9SQzZfUkVTSURFTkNZKTsKPj4gKwo+PiArICAgICAgIGdlbV9xdWllc2Nl bnRfZ3B1KGdlbV9mZCk7Cj4+ICsKPj4gKyAgICAgICAvKiBHbyBpZGxlIGFuZCBjaGVjayBmdWxs IFJDNi4gKi8KPj4gKyAgICAgICBwcmV2ID0gcG11X3JlYWRfc2luZ2xlKGZkKTsKPj4gKyAgICAg ICBndWFyYW50ZWVkX3VzbGVlcChkdXJhdGlvbl9ucyAvIDEwMDApOwo+PiArICAgICAgIGlkbGUg PSBwbXVfcmVhZF9zaW5nbGUoZmQpOwo+PiArCj4+ICsgICAgICAgYXNzZXJ0X3dpdGhpbl9lcHNp bG9uKGlkbGUgLSBwcmV2LCBkdXJhdGlvbl9ucywgdG9sZXJhbmNlKTsKPj4gKwo+PiArICAgICAg IC8qIFdha2UgdXAgZGV2aWNlIGFuZCBjaGVjayBubyBSQzYuICovCj4+ICsgICAgICAgZncgPSBp Z3Rfb3Blbl9mb3JjZXdha2VfaGFuZGxlKGdlbV9mZCk7Cj4+ICsgICAgICAgaWd0X2Fzc2VydChm dyA+PSAwKTsKPj4gKwo+PiArICAgICAgIHByZXYgPSBwbXVfcmVhZF9zaW5nbGUoZmQpOwo+PiAr ICAgICAgIGd1YXJhbnRlZWRfdXNsZWVwKGR1cmF0aW9uX25zIC8gMTAwMCk7Cj4+ICsgICAgICAg YnVzeSA9IHBtdV9yZWFkX3NpbmdsZShmZCk7Cj4+ICsKPj4gKyAgICAgICBhc3NlcnRfd2l0aGlu X2Vwc2lsb24oYnVzeSAtIHByZXYsIDAuMCwgdG9sZXJhbmNlKTsKPj4gKwo+PiArICAgICAgIGNs b3NlKGZ3KTsKPj4gKyAgICAgICBjbG9zZShmZCk7Cj4gCj4gT2sgKG90aGVyIHRoYW4gdGhlIGd1 YXJhbnRlZWQgdnMga25vd24gc2xlZXApLgo+IAo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZAo+ PiArdGVzdF9yYzZwKGludCBnZW1fZmQpCj4+ICt7Cj4+ICsgICAgICAgaW50NjRfdCBkdXJhdGlv bl9ucyA9IDIgKiAxMDAwICogMTAwMCAqIDEwMDA7Cj4+ICsgICAgICAgdW5zaWduZWQgaW50IG51 bV9wbXUgPSAxOwo+PiArICAgICAgIHVpbnQ2NF90IGlkbGVbM10sIGJ1c3lbM10sIHByZXZbM107 Cj4+ICsgICAgICAgdW5zaWduZWQgaW50IGk7Cj4+ICsgICAgICAgaW50IGZkLCByZXQsIGZ3Owo+ PiArCj4+ICsgICAgICAgZmQgPSBvcGVuX2dyb3VwKEk5MTVfUE1VX1JDNl9SRVNJREVOQ1ksIC0x KTsKPj4gKyAgICAgICByZXQgPSBwZXJmX2k5MTVfb3Blbl9ncm91cChJOTE1X1BNVV9SQzZwX1JF U0lERU5DWSwgZmQpOwo+PiArICAgICAgIGlmIChyZXQgPiAwKSB7Cj4+ICsgICAgICAgICAgICAg ICBudW1fcG11Kys7Cj4+ICsgICAgICAgICAgICAgICByZXQgPSBwZXJmX2k5MTVfb3Blbl9ncm91 cChJOTE1X1BNVV9SQzZwcF9SRVNJREVOQ1ksIGZkKTsKPj4gKyAgICAgICAgICAgICAgIGlmIChy ZXQgPiAwKQo+PiArICAgICAgICAgICAgICAgICAgICAgICBudW1fcG11Kys7Cj4+ICsgICAgICAg fQo+PiArCj4+ICsgICAgICAgaWd0X3JlcXVpcmUobnVtX3BtdSA9PSAzKTsKPiAKPiBEbyB3ZSBl eHBvc2UgYWxsIFJDNiBjb3VudGVycywgZXZlbiBvbiBodyB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0 aGVtIGFsbD8KPiBXZSBwcmV0dHkgbXVjaCBvbmx5IGV4cGVjdCB0byBoYXZlIGFuIHJjNiBjb3Vu dGVyIChmcm9tIHNuYispCgpBdCB0aGUgbW9tZW50IHllcy4gVGhleSBqdXN0IHJlcG9ydCAtRU5P REVWIG9uIHVuc3VwcG9ydGVkIHBsYXRmb3Jtcy4gCkFub3RoZXIgbWVudGFsIFRPRE8gSSBoYXZl IGlzIHRvIHNlZSBob3cgdG8gcmVnaXN0ZXIgY291bnRlcnMgCmR5bmFtaWNhbGx5LiBCdXQgZXZl biB0aGF0IHdvdWxkIG9ubHkgaGVscCB3aXRoIHVzZXJzIHdobyBib3RoZXIgZG9pbid0IAp0aGUg c3lzZnMgZGlzY292ZXJ5LgoKPiAKPj4gKwo+PiArICAgICAgIGdlbV9xdWllc2NlbnRfZ3B1KGdl bV9mZCk7Cj4+ICsKPj4gKyAgICAgICAvKiBHbyBpZGxlIGFuZCBjaGVjayBmdWxsIFJDNi4gKi8K Pj4gKyAgICAgICBwbXVfcmVhZF9tdWx0aShmZCwgbnVtX3BtdSwgcHJldik7Cj4+ICsgICAgICAg Z3VhcmFudGVlZF91c2xlZXAoZHVyYXRpb25fbnMgLyAxMDAwKTsKPj4gKyAgICAgICBwbXVfcmVh ZF9tdWx0aShmZCwgbnVtX3BtdSwgaWRsZSk7Cj4+ICsKPj4gKyAgICAgICBmb3IgKGkgPSAwOyBp IDwgbnVtX3BtdTsgaSsrKQo+PiArICAgICAgICAgICAgICAgYXNzZXJ0X3dpdGhpbl9lcHNpbG9u KGlkbGVbaV0gLSBwcmV2W2ldLCBkdXJhdGlvbl9ucywKPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB0b2xlcmFuY2UpOwo+PiArCj4+ICsgICAgICAgLyogV2FrZSB1cCBk ZXZpY2UgYW5kIGNoZWNrIG5vIFJDNi4gKi8KPj4gKyAgICAgICBmdyA9IGlndF9vcGVuX2ZvcmNl d2FrZV9oYW5kbGUoZ2VtX2ZkKTsKPj4gKyAgICAgICBpZ3RfYXNzZXJ0KGZ3ID49IDApOwo+PiAr Cj4+ICsgICAgICAgcG11X3JlYWRfbXVsdGkoZmQsIG51bV9wbXUsIHByZXYpOwo+PiArICAgICAg IGd1YXJhbnRlZWRfdXNsZWVwKGR1cmF0aW9uX25zIC8gMTAwMCk7Cj4+ICsgICAgICAgcG11X3Jl YWRfbXVsdGkoZmQsIG51bV9wbXUsIGJ1c3kpOwo+PiArCj4+ICsgICAgICAgZm9yIChpID0gMDsg aSA8IG51bV9wbXU7IGkrKykKPj4gKyAgICAgICAgICAgICAgIGFzc2VydF93aXRoaW5fZXBzaWxv bihidXN5W2ldIC0gcHJldltpXSwgMC4wLCB0b2xlcmFuY2UpOwo+PiArCj4+ICsgICAgICAgY2xv c2UoZncpOwo+PiArICAgICAgIGNsb3NlKGZkKTsKPj4gK30KPj4gKwo+PiAraWd0X21haW4KPj4g K3sKPj4gKyAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgbnVtX290aGVyX21ldHJpY3MgPQo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEk5MTVfUE1VX0xBU1QgLSBfX0k5MTVfUE1V X09USEVSKDApICsgMTsKPj4gKyAgICAgICB1bnNpZ25lZCBpbnQgbnVtX2VuZ2luZXMgPSAwOwo+ PiArICAgICAgIGludCBmZCA9IC0xOwo+PiArICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9leGVj dXRpb25fZW5naW5lMiAqZTsKPj4gKyAgICAgICB1bnNpZ25lZCBpbnQgaTsKPj4gKwo+PiArICAg ICAgIGlndF9maXh0dXJlIHsKPj4gKyAgICAgICAgICAgICAgIGZkID0gZHJtX29wZW5fZHJpdmVy X21hc3RlcihEUklWRVJfSU5URUwpOwo+IAo+IG1hc3Rlcj8gRm9yIHdoYXQ/IEkgZGlkbid0IHNl ZSBhbnkgZGlzcGxheSBpbnRlcmFjdGlvbnMsIG9yIHNlY3VyZQo+IGRpc3BhdGNoLiBEb2VzIHRo aXMgbWVhbiB0aGF0IHdlIG9ubHkgaGF2ZSBwZXJmIGNvdW50ZXJzIGZvciB0aGUgbWFzdGVyPwoK VG8gZW5zdXJlIG5vIG9uZSBlbHNlIGlzIGZpZGRsaW5nIHdpdGggdGhlIEdQVSB3aGlsZSB0aGUg dGVzdCBpcyBydW5uaW5nIApzaW5jZSB3ZSB3YW50IGNvbXBsZXRlIGNvbnRyb2wgaGVyZS4KCj4g U2hvdWxkbid0IHdlIGFsc28gYmUgY2hlY2tpbmcgdGhhdCB3ZSBjYW4gY2FwdHVyZSByZW5kZXJu b2RlcyBhcyB3ZWxsIGFzCj4gYXV0aGVkIGZkPwoKQWdhaW4sIGR1ZSBkcm0gZmQgYW5kIHBlcmYg aGF2aW5nIG5vIGRpcmVjdCBjb25uZWN0aW9uIEkgZG9uJ3Qgc2VlIHRoaXMgCmFzIGludGVyZXN0 aW5nLgoKUmVnYXJkcywKClR2cnRrbwpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVl ZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5m by9pbnRlbC1nZngK