RE: [PATCH 7/7] vfio pci: Add vfio iommu implementation for FSL_PAMU
From: Bhushan Bharat-R65777 <hidden>
Date: 2013-09-26 05:27:37
Also in:
linux-iommu, linux-pci, lkml
DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQWxleCBXaWxsaWFtc29u IFttYWlsdG86YWxleC53aWxsaWFtc29uQHJlZGhhdC5jb21dDQo+IFNlbnQ6IFRodXJzZGF5LCBT ZXB0ZW1iZXIgMjYsIDIwMTMgMTI6MzcgQU0NCj4gVG86IEJodXNoYW4gQmhhcmF0LVI2NTc3Nw0K PiBDYzogam9yb0A4Ynl0ZXMub3JnOyBiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc7IGdhbGFrQGtl cm5lbC5jcmFzaGluZy5vcmc7IGxpbnV4LQ0KPiBrZXJuZWxAdmdlci5rZXJuZWwub3JnOyBsaW51 eHBwYy1kZXZAbGlzdHMub3psYWJzLm9yZzsgbGludXgtDQo+IHBjaUB2Z2VyLmtlcm5lbC5vcmc7 IGFncmFmQHN1c2UuZGU7IFdvb2QgU2NvdHQtQjA3NDIxOyBpb21tdUBsaXN0cy5saW51eC0NCj4g Zm91bmRhdGlvbi5vcmc7IEJodXNoYW4gQmhhcmF0LVI2NTc3Nw0KPiBTdWJqZWN0OiBSZTogW1BB VENIIDcvN10gdmZpbyBwY2k6IEFkZCB2ZmlvIGlvbW11IGltcGxlbWVudGF0aW9uIGZvciBGU0xf UEFNVQ0KPiANCj4gT24gVGh1LCAyMDEzLTA5LTE5IGF0IDEyOjU5ICswNTMwLCBCaGFyYXQgQmh1 c2hhbiB3cm90ZToNCj4gPiBUaGlzIHBhdGNoIGFkZHMgdmZpbyBpb21tdSBzdXBwb3J0IGZvciBG cmVlc2NhbGUgSU9NTVUgKFBBTVUgLQ0KPiA+IFBlcmlwaGVyYWwgQWNjZXNzIE1hbmFnZW1lbnQg VW5pdCkuDQo+ID4NCj4gPiBUaGUgRnJlZXNjYWxlIFBBTVUgaXMgYW4gYXBlcnR1cmUtYmFzZWQg SU9NTVUgd2l0aCB0aGUgZm9sbG93aW5nDQo+ID4gY2hhcmFjdGVyaXN0aWNzLiAgRWFjaCBkZXZp Y2UgaGFzIGFuIGVudHJ5IGluIGEgdGFibGUgaW4gbWVtb3J5DQo+ID4gZGVzY3JpYmluZyB0aGUg aW92YS0+cGh5cyBtYXBwaW5nLiBUaGUgbWFwcGluZyBoYXM6DQo+ID4gICAtYW4gb3ZlcmFsbCBh cGVydHVyZSB0aGF0IGlzIHBvd2VyIG9mIDIgc2l6ZWQsIGFuZCBoYXMgYSBzdGFydCBpb3ZhIHRo YXQNCj4gPiAgICBpcyBuYXR1cmFsbHkgYWxpZ25lZA0KPiA+ICAgLWhhcyAxIG9yIG1vcmUgd2lu ZG93cyB3aXRoaW4gdGhlIGFwZXJ0dXJlDQo+ID4gICAtbnVtYmVyIG9mIHdpbmRvd3MgbXVzdCBi ZSBwb3dlciBvZiAyLCBtYXggaXMgMjU2DQo+ID4gICAtc2l6ZSBvZiBlYWNoIHdpbmRvdyBpcyBk ZXRlcm1pbmVkIGJ5IGFwZXJ0dXJlIHNpemUgLyAjIG9mIHdpbmRvd3MNCj4gPiAgIC1pb3ZhIG9m IGVhY2ggd2luZG93IGlzIGRldGVybWluZWQgYnkgYXBlcnR1cmUgc3RhcnQgaW92YSAvICMgb2Yg d2luZG93cw0KPiA+ICAgLXRoZSBtYXBwZWQgcmVnaW9uIGluIGVhY2ggd2luZG93IGNhbiBiZSBk aWZmZXJlbnQgdGhhbg0KPiA+ICAgIHRoZSB3aW5kb3cgc2l6ZS4uLm1hcHBpbmcgbXVzdCBwb3dl ciBvZiAyDQo+ID4gICAtcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbWFwcGluZyBtdXN0IGJlIG5h dHVyYWxseSBhbGlnbmVkDQo+ID4gICAgd2l0aCB0aGUgbWFwcGluZyBzaXplDQo+ID4NCj4gPiBT b21lIG9mIHRoZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSBUWVBFMSBpb21tdSAoZHJpdmVyL3ZmaW8v dmZpb19pb21tdV90eXBlMS5jKS4NCj4gPg0KPiA+IFNpZ25lZC1vZmYtYnk6IEJoYXJhdCBCaHVz aGFuIDxiaGFyYXQuYmh1c2hhbkBmcmVlc2NhbGUuY29tPg0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJz L3ZmaW8vS2NvbmZpZyAgICAgICAgICAgICAgIHwgICAgNiArDQo+ID4gIGRyaXZlcnMvdmZpby9N YWtlZmlsZSAgICAgICAgICAgICAgfCAgICAxICsNCj4gPiAgZHJpdmVycy92ZmlvL3ZmaW9faW9t bXVfZnNsX3BhbXUuYyB8ICA5NTINCj4gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrDQo+ID4gIGluY2x1ZGUvdWFwaS9saW51eC92ZmlvLmggICAgICAgICAgfCAgMTAwICsrKysN Cj4gPiAgNCBmaWxlcyBjaGFuZ2VkLCAxMDU5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0p ICBjcmVhdGUgbW9kZQ0KPiA+IDEwMDY0NCBkcml2ZXJzL3ZmaW8vdmZpb19pb21tdV9mc2xfcGFt dS5jDQo+ID4NCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL0tjb25maWcgYi9kcml2ZXJz L3ZmaW8vS2NvbmZpZyBpbmRleA0KPiA+IDI2YjNkOWQuLjdkMWRhMjYgMTAwNjQ0DQo+ID4gLS0t IGEvZHJpdmVycy92ZmlvL0tjb25maWcNCj4gPiArKysgYi9kcml2ZXJzL3ZmaW8vS2NvbmZpZw0K PiA+IEBAIC04LDExICs4LDE3IEBAIGNvbmZpZyBWRklPX0lPTU1VX1NQQVBSX1RDRQ0KPiA+ICAJ ZGVwZW5kcyBvbiBWRklPICYmIFNQQVBSX1RDRV9JT01NVQ0KPiA+ICAJZGVmYXVsdCBuDQo+ID4N Cj4gPiArY29uZmlnIFZGSU9fSU9NTVVfRlNMX1BBTVUNCj4gPiArCXRyaXN0YXRlDQo+ID4gKwlk ZXBlbmRzIG9uIFZGSU8NCj4gPiArCWRlZmF1bHQgbg0KPiA+ICsNCj4gPiAgbWVudWNvbmZpZyBW RklPDQo+ID4gIAl0cmlzdGF0ZSAiVkZJTyBOb24tUHJpdmlsZWdlZCB1c2Vyc3BhY2UgZHJpdmVy IGZyYW1ld29yayINCj4gPiAgCWRlcGVuZHMgb24gSU9NTVVfQVBJDQo+ID4gIAlzZWxlY3QgVkZJ T19JT01NVV9UWVBFMSBpZiBYODYNCj4gPiAgCXNlbGVjdCBWRklPX0lPTU1VX1NQQVBSX1RDRSBp ZiAoUFBDX1BPV0VSTlYgfHwgUFBDX1BTRVJJRVMpDQo+ID4gKwlzZWxlY3QgVkZJT19JT01NVV9G U0xfUEFNVSBpZiBGU0xfUEFNVQ0KPiA+ICAJaGVscA0KPiA+ICAJICBWRklPIHByb3ZpZGVzIGEg ZnJhbWV3b3JrIGZvciBzZWN1cmUgdXNlcnNwYWNlIGRldmljZSBkcml2ZXJzLg0KPiA+ICAJICBT ZWUgRG9jdW1lbnRhdGlvbi92ZmlvLnR4dCBmb3IgbW9yZSBkZXRhaWxzLg0KPiA+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL3ZmaW8vTWFrZWZpbGUgYi9kcml2ZXJzL3ZmaW8vTWFrZWZpbGUgaW5kZXgN Cj4gPiBjNTc5MmVjLi43NDYxMzUwIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvdmZpby9NYWtl ZmlsZQ0KPiA+ICsrKyBiL2RyaXZlcnMvdmZpby9NYWtlZmlsZQ0KPiA+IEBAIC0xLDQgKzEsNSBA QA0KPiA+ICBvYmotJChDT05GSUdfVkZJTykgKz0gdmZpby5vDQo+ID4gIG9iai0kKENPTkZJR19W RklPX0lPTU1VX1RZUEUxKSArPSB2ZmlvX2lvbW11X2NvbW1vbi5vDQo+ID4gdmZpb19pb21tdV90 eXBlMS5vDQo+ID4gIG9iai0kKENPTkZJR19WRklPX0lPTU1VX1NQQVBSX1RDRSkgKz0gdmZpb19p b21tdV9jb21tb24ubw0KPiA+IHZmaW9faW9tbXVfc3BhcHJfdGNlLm8NCj4gPiArb2JqLSQoQ09O RklHX1ZGSU9fSU9NTVVfRlNMX1BBTVUpICs9IHZmaW9faW9tbXVfY29tbW9uLm8NCj4gPiArdmZp b19pb21tdV9mc2xfcGFtdS5vDQo+ID4gIG9iai0kKENPTkZJR19WRklPX1BDSSkgKz0gcGNpLw0K PiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3ZmaW8vdmZpb19pb21tdV9mc2xfcGFtdS5jDQo+ID4g Yi9kcml2ZXJzL3ZmaW8vdmZpb19pb21tdV9mc2xfcGFtdS5jDQo+ID4gbmV3IGZpbGUgbW9kZSAx MDA2NDQNCj4gPiBpbmRleCAwMDAwMDAwLi5iMjkzNjVmDQo+ID4gLS0tIC9kZXYvbnVsbA0KPiA+ ICsrKyBiL2RyaXZlcnMvdmZpby92ZmlvX2lvbW11X2ZzbF9wYW11LmMNCj4gPiBAQCAtMCwwICsx LDk1MiBAQA0KPiA+ICsvKg0KPiA+ICsgKiBWRklPOiBJT01NVSBETUEgbWFwcGluZyBzdXBwb3J0 IGZvciBGU0wgUEFNVSBJT01NVQ0KPiA+ICsgKg0KPiA+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQo+ID4gK21vZGlmeQ0K PiA+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlLCB2ZXJzaW9uIDIsDQo+ID4gK2FzDQo+ID4gKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLg0KPiA+ICsgKg0KPiA+ICsgKiBUaGlzIHByb2dyYW0gaXMgZGlz dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCj4gPiArICogYnV0 IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg b2YNCj4gPiArICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFLiAgU2VlIHRoZQ0KPiA+ICsgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig bW9yZSBkZXRhaWxzLg0KPiA+ICsgKg0KPiA+ICsgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg YSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPiA+ICsgKiBhbG9uZyB3 aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KPiA+ ICsgKiBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24s IE1BICAwMjExMC0xMzAxLCBVU0EuDQo+ID4gKyAqDQo+ID4gKyAqIENvcHlyaWdodCAoQykgMjAx MyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLg0KPiA+ICsgKg0KPiA+ICsgKiAgICAgQXV0 aG9yOiBCaGFyYXQgQmh1c2hhbiA8YmhhcmF0LmJodXNoYW5AZnJlZXNjYWxlLmNvbT4NCj4gPiAr ICoNCj4gPiArICogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBkcml2ZXIvdmZpby92ZmlvX2lv bW11X3R5cGUxLmMNCj4gPiArICoNCj4gPiArICogVGhlIEZyZWVzY2FsZSBQQU1VIGlzIGFuIGFw ZXJ0dXJlLWJhc2VkIElPTU1VIHdpdGggdGhlIGZvbGxvd2luZw0KPiA+ICsgKiBjaGFyYWN0ZXJp c3RpY3MuICBFYWNoIGRldmljZSBoYXMgYW4gZW50cnkgaW4gYSB0YWJsZSBpbiBtZW1vcnkNCj4g PiArICogZGVzY3JpYmluZyB0aGUgaW92YS0+cGh5cyBtYXBwaW5nLiBUaGUgbWFwcGluZyBoYXM6 DQo+ID4gKyAqICAtYW4gb3ZlcmFsbCBhcGVydHVyZSB0aGF0IGlzIHBvd2VyIG9mIDIgc2l6ZWQs IGFuZCBoYXMgYSBzdGFydCBpb3ZhIHRoYXQNCj4gPiArICogICBpcyBuYXR1cmFsbHkgYWxpZ25l ZA0KPiA+ICsgKiAgLWhhcyAxIG9yIG1vcmUgd2luZG93cyB3aXRoaW4gdGhlIGFwZXJ0dXJlDQo+ ID4gKyAqICAgICAtbnVtYmVyIG9mIHdpbmRvd3MgbXVzdCBiZSBwb3dlciBvZiAyLCBtYXggaXMg MjU2DQo+ID4gKyAqICAgICAtc2l6ZSBvZiBlYWNoIHdpbmRvdyBpcyBkZXRlcm1pbmVkIGJ5IGFw ZXJ0dXJlIHNpemUgLyAjIG9mIHdpbmRvd3MNCj4gPiArICogICAgIC1pb3ZhIG9mIGVhY2ggd2lu ZG93IGlzIGRldGVybWluZWQgYnkgYXBlcnR1cmUgc3RhcnQgaW92YSAvICMgb2YNCj4gd2luZG93 cw0KPiA+ICsgKiAgICAgLXRoZSBtYXBwZWQgcmVnaW9uIGluIGVhY2ggd2luZG93IGNhbiBiZSBk aWZmZXJlbnQgdGhhbg0KPiA+ICsgKiAgICAgIHRoZSB3aW5kb3cgc2l6ZS4uLm1hcHBpbmcgbXVz dCBwb3dlciBvZiAyDQo+ID4gKyAqICAgICAtcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbWFwcGlu ZyBtdXN0IGJlIG5hdHVyYWxseSBhbGlnbmVkDQo+ID4gKyAqICAgICAgd2l0aCB0aGUgbWFwcGlu ZyBzaXplDQo+ID4gKyAqLw0KPiA+ICsNCj4gPiArI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPg0K PiA+ICsjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9mcy5o Pg0KPiA+ICsjaW5jbHVkZSA8bGludXgvaW9tbXUuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L21v ZHVsZS5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvbW0uaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4 L3BjaS5oPgkJLyogcGNpX2J1c190eXBlICovDQo+ID4gKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5o Pg0KPiA+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvdWFj Y2Vzcy5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvdmZpby5oPg0KPiA+ICsjaW5jbHVkZSA8bGlu dXgvd29ya3F1ZXVlLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+DQo+ID4gKyNp bmNsdWRlIDxsaW51eC9tc2kuaD4NCj4gPiArI2luY2x1ZGUgPGFzbS9mc2xfcGFtdV9zdGFzaC5o Pg0KPiA+ICsNCj4gPiArI2luY2x1ZGUgInZmaW9faW9tbXVfY29tbW9uLmgiDQo+ID4gKw0KPiA+ ICsjZGVmaW5lIERSSVZFUl9WRVJTSU9OICAiMC4xIg0KPiA+ICsjZGVmaW5lIERSSVZFUl9BVVRI T1IgICAiQmhhcmF0IEJodXNoYW4gPGJoYXJhdC5iaHVzaGFuQGZyZWVzY2FsZS5jb20+Ig0KPiA+ ICsjZGVmaW5lIERSSVZFUl9ERVNDICAgICAiRlNMIFBBTVUgSU9NTVUgZHJpdmVyIGZvciBWRklP Ig0KPiA+ICsNCj4gPiArc3RydWN0IHZmaW9faW9tbXUgew0KPiA+ICsJc3RydWN0IGlvbW11X2Rv bWFpbgkqZG9tYWluOw0KPiA+ICsJc3RydWN0IG11dGV4CQlsb2NrOw0KPiA+ICsJZG1hX2FkZHJf dAkJYXBlcnR1cmVfc3RhcnQ7DQo+ID4gKwlkbWFfYWRkcl90CQlhcGVydHVyZV9lbmQ7DQo+ID4g KwlkbWFfYWRkcl90CQlwYWdlX3NpemU7CS8qIE1heGltdW0gbWFwcGVkIFBhZ2Ugc2l6ZSAqLw0K PiA+ICsJaW50CQkJbnN1YndpbmRvd3M7CS8qIE51bWJlciBvZiBzdWJ3aW5kb3dzICovDQo+ID4g KwlzdHJ1Y3QgcmJfcm9vdAkJZG1hX2xpc3Q7DQo+ID4gKwlzdHJ1Y3QgbGlzdF9oZWFkCW1zaV9k bWFfbGlzdDsNCj4gPiArCXN0cnVjdCBsaXN0X2hlYWQJZ3JvdXBfbGlzdDsNCj4gPiArfTsNCj4g PiArDQo+ID4gK3N0cnVjdCB2ZmlvX2RtYSB7DQo+ID4gKwlzdHJ1Y3QgcmJfbm9kZQkJbm9kZTsN Cj4gPiArCWRtYV9hZGRyX3QJCWlvdmE7CQkvKiBEZXZpY2UgYWRkcmVzcyAqLw0KPiA+ICsJdW5z aWduZWQgbG9uZwkJdmFkZHI7CQkvKiBQcm9jZXNzIHZpcnR1YWwgYWRkciAqLw0KPiA+ICsJc2l6 ZV90CQkJc2l6ZTsJCS8qIE51bWJlciBvZiBwYWdlcyAqLw0KPiANCj4gSXMgdGhpcyByZWFsbHkg cGFnZXM/DQoNCkNvbW1lbnQgaXMgbGVmdG92ZXIgb2YgcHJldmlvdXMgaW1wbGVtZW50YXRpb24u DQoNCj4gDQo+ID4gKwlpbnQJCQlwcm90OwkJLyogSU9NTVVfUkVBRC9XUklURSAqLw0KPiA+ICt9 Ow0KPiA+ICsNCj4gPiArc3RydWN0IHZmaW9fbXNpX2RtYSB7DQo+ID4gKwlzdHJ1Y3QgbGlzdF9o ZWFkCW5leHQ7DQo+ID4gKwlkbWFfYWRkcl90CQlpb3ZhOwkJLyogRGV2aWNlIGFkZHJlc3MgKi8N Cj4gPiArCWludAkJCWJhbmtfaWQ7DQo+ID4gKwlpbnQJCQlwcm90OwkJLyogSU9NTVVfUkVBRC9X UklURSAqLw0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArc3RydWN0IHZmaW9fZ3JvdXAgew0KPiA+ICsJ c3RydWN0IGlvbW11X2dyb3VwCSppb21tdV9ncm91cDsNCj4gPiArCXN0cnVjdCBsaXN0X2hlYWQJ bmV4dDsNCj4gPiArfTsNCj4gPiArDQo+ID4gK3N0YXRpYyBzdHJ1Y3QgdmZpb19kbWEgKnZmaW9f ZmluZF9kbWEoc3RydWN0IHZmaW9faW9tbXUgKmlvbW11LA0KPiA+ICsJCQkJICAgICAgZG1hX2Fk ZHJfdCBzdGFydCwgc2l6ZV90IHNpemUpIHsNCj4gPiArCXN0cnVjdCByYl9ub2RlICpub2RlID0g aW9tbXUtPmRtYV9saXN0LnJiX25vZGU7DQo+ID4gKw0KPiA+ICsJd2hpbGUgKG5vZGUpIHsNCj4g PiArCQlzdHJ1Y3QgdmZpb19kbWEgKmRtYSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCB2ZmlvX2Rt YSwgbm9kZSk7DQo+ID4gKw0KPiA+ICsJCWlmIChzdGFydCArIHNpemUgPD0gZG1hLT5pb3ZhKQ0K PiA+ICsJCQlub2RlID0gbm9kZS0+cmJfbGVmdDsNCj4gPiArCQllbHNlIGlmIChzdGFydCA+PSBk bWEtPmlvdmEgKyBkbWEtPnNpemUpDQo+IA0KPiBiZWNhdXNlIHRoaXMgbG9va3MgbW9yZSBsaWtl IGl0J3MgYnl0ZXMuLi4NCj4gDQo+ID4gKwkJCW5vZGUgPSBub2RlLT5yYl9yaWdodDsNCj4gPiAr CQllbHNlDQo+ID4gKwkJCXJldHVybiBkbWE7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJcmV0dXJu IE5VTEw7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyB2b2lkIHZmaW9faW5zZXJ0X2RtYShz dHJ1Y3QgdmZpb19pb21tdSAqaW9tbXUsIHN0cnVjdCB2ZmlvX2RtYQ0KPiA+ICsqbmV3KSB7DQo+ ID4gKwlzdHJ1Y3QgcmJfbm9kZSAqKmxpbmsgPSAmaW9tbXUtPmRtYV9saXN0LnJiX25vZGUsICpw YXJlbnQgPSBOVUxMOw0KPiA+ICsJc3RydWN0IHZmaW9fZG1hICpkbWE7DQo+ID4gKw0KPiA+ICsJ d2hpbGUgKCpsaW5rKSB7DQo+ID4gKwkJcGFyZW50ID0gKmxpbms7DQo+ID4gKwkJZG1hID0gcmJf ZW50cnkocGFyZW50LCBzdHJ1Y3QgdmZpb19kbWEsIG5vZGUpOw0KPiA+ICsNCj4gPiArCQlpZiAo bmV3LT5pb3ZhICsgbmV3LT5zaXplIDw9IGRtYS0+aW92YSkNCj4gDQo+IHNvIGRvZXMgdGhpcy4u Lg0KPiANCj4gPiArCQkJbGluayA9ICYoKmxpbmspLT5yYl9sZWZ0Ow0KPiA+ICsJCWVsc2UNCj4g PiArCQkJbGluayA9ICYoKmxpbmspLT5yYl9yaWdodDsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwly Yl9saW5rX25vZGUoJm5ldy0+bm9kZSwgcGFyZW50LCBsaW5rKTsNCj4gPiArCXJiX2luc2VydF9j b2xvcigmbmV3LT5ub2RlLCAmaW9tbXUtPmRtYV9saXN0KTsgfQ0KPiA+ICsNCj4gPiArc3RhdGlj IHZvaWQgdmZpb19yZW1vdmVfZG1hKHN0cnVjdCB2ZmlvX2lvbW11ICppb21tdSwgc3RydWN0IHZm aW9fZG1hDQo+ID4gKypvbGQpIHsNCj4gPiArCXJiX2VyYXNlKCZvbGQtPm5vZGUsICZpb21tdS0+ ZG1hX2xpc3QpOyB9DQo+IA0KPiANCj4gU28gaWYgeW91ciB2ZmlvX2RtYS5zaXplIGlzIGFjdHVh bGx5IGluIGJ5dGVzLCB3aHkgaXNuJ3QgYWxsIHRoaXMgY29kZSBpbg0KPiBjb21tb24/DQoNClRo aXMgdGFrZXMgInN0cnVjdCB2ZmlvX2lvbW11ICIgd2hpY2ggaXMgbm90IHNhbWUgb24gdHlwZTEg YW5kIGZzbF9wYW11LCBzbyBJIGhhdmUgbm90IGRvbmUgdGhhdCBpbiBmaXJzdCBwaGFzZS4NCkJ1 dCB5ZXMgSSBjb21wbGV0ZWx5IGFncmVlIHRoYXQgbXVjaCBtb3JlIGNvbnNvbGlkYXRpb24gY2Fu IGJlIGRvbmUuIEkgd291bGQgbGlrZSB0byBkbyB0aGF0IGluIG5leHQgc3RlcC4NCg0KPiANCj4g PiArDQo+ID4gK3N0YXRpYyBpbnQgaW92YV90b193aW4oc3RydWN0IHZmaW9faW9tbXUgKmlvbW11 LCBkbWFfYWRkcl90IGlvdmEpIHsNCj4gPiArCXU2NCBvZmZzZXQgPSBpb3ZhIC0gaW9tbXUtPmFw ZXJ0dXJlX3N0YXJ0Ow0KPiA+ICsJZG9fZGl2KG9mZnNldCwgaW9tbXUtPnBhZ2Vfc2l6ZSk7DQo+ ID4gKwlyZXR1cm4gKGludCkgb2Zmc2V0Ow0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50 IHZmaW9fZGlzYWJsZV9pb21tdV9kb21haW4oc3RydWN0IHZmaW9faW9tbXUgKmlvbW11KSB7DQo+ ID4gKwlpbnQgZW5hYmxlID0gMDsNCj4gPiArCXJldHVybiBpb21tdV9kb21haW5fc2V0X2F0dHIo aW9tbXUtPmRvbWFpbiwNCj4gPiArCQkJCSAgICAgRE9NQUlOX0FUVFJfRlNMX1BBTVVfRU5BQkxF LCAmZW5hYmxlKTsgfQ0KPiANCj4gVGhpcyBpcyBuZXZlciBjYWxsZWQ/IQ0KPiANCj4gPiArDQo+ ID4gK3N0YXRpYyBpbnQgdmZpb19lbmFibGVfaW9tbXVfZG9tYWluKHN0cnVjdCB2ZmlvX2lvbW11 ICppb21tdSkgew0KPiA+ICsJaW50IGVuYWJsZSA9IDE7DQo+ID4gKwlyZXR1cm4gaW9tbXVfZG9t YWluX3NldF9hdHRyKGlvbW11LT5kb21haW4sDQo+ID4gKwkJCQkgICAgIERPTUFJTl9BVFRSX0ZT TF9QQU1VX0VOQUJMRSwgJmVuYWJsZSk7IH0NCj4gPiArDQo+ID4gKy8qIFVubWFwIERNQSByZWdp b24gKi8NCj4gPiArc3RhdGljIGludCB2ZmlvX3VubWFwX3VucGluKHN0cnVjdCB2ZmlvX2lvbW11 ICppb21tdSwgc3RydWN0IHZmaW9fZG1hICpkbWEsDQo+ID4gKwkJCSAgICBkbWFfYWRkcl90IGlv dmEsIHNpemVfdCAqc2l6ZSkgew0KPiA+ICsJZG1hX2FkZHJfdCBzdGFydCA9IGlvdmE7DQo+ID4g KwlpbnQgd2luLCB3aW5fc3RhcnQsIHdpbl9lbmQ7DQo+ID4gKwlsb25nIHVubG9ja2VkID0gMDsN Cj4gPiArCXVuc2lnbmVkIGludCBucl9wYWdlczsNCj4gPiArDQo+ID4gKwlucl9wYWdlcyA9IGlv bW11LT5wYWdlX3NpemUgLyBQQUdFX1NJWkU7DQo+ID4gKwl3aW5fc3RhcnQgPSBpb3ZhX3RvX3dp bihpb21tdSwgaW92YSk7DQo+ID4gKwl3aW5fZW5kID0gaW92YV90b193aW4oaW9tbXUsIGlvdmEg KyAqc2l6ZSAtIDEpOw0KPiA+ICsNCj4gPiArCS8qIFJlbGVhc2UgdGhlIHBpbm5lZCBwYWdlcyAq Lw0KPiA+ICsJZm9yICh3aW4gPSB3aW5fc3RhcnQ7IHdpbiA8PSB3aW5fZW5kOyBpb3ZhICs9IGlv bW11LT5wYWdlX3NpemUsIHdpbisrKSB7DQo+ID4gKwkJdW5zaWduZWQgbG9uZyBwZm47DQo+ID4g Kw0KPiA+ICsJCXBmbiA9IGlvbW11X2lvdmFfdG9fcGh5cyhpb21tdS0+ZG9tYWluLCBpb3ZhKSA+ PiBQQUdFX1NISUZUOw0KPiA+ICsJCWlmICghcGZuKQ0KPiA+ICsJCQljb250aW51ZTsNCj4gPiAr DQo+ID4gKwkJaW9tbXVfZG9tYWluX3dpbmRvd19kaXNhYmxlKGlvbW11LT5kb21haW4sIHdpbik7 DQo+ID4gKw0KPiA+ICsJCXVubG9ja2VkICs9IHZmaW9fdW5waW5fcGFnZXMocGZuLCBucl9wYWdl cywgZG1hLT5wcm90LCAxKTsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwl2ZmlvX2xvY2tfYWNjdCgt dW5sb2NrZWQpOw0KPiA+ICsJKnNpemUgPSBpb3ZhIC0gc3RhcnQ7DQo+ID4gKwlyZXR1cm4gMDsN Cj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGludCB2ZmlvX3JlbW92ZV9kbWFfb3ZlcmxhcChz dHJ1Y3QgdmZpb19pb21tdSAqaW9tbXUsIGRtYV9hZGRyX3QNCj4gc3RhcnQsDQo+ID4gKwkJCQkg ICBzaXplX3QgKnNpemUsIHN0cnVjdCB2ZmlvX2RtYSAqZG1hKSB7DQo+ID4gKwlzaXplX3Qgb2Zm c2V0LCBvdmVybGFwLCB0bXA7DQo+ID4gKwlzdHJ1Y3QgdmZpb19kbWEgKnNwbGl0Ow0KPiA+ICsJ aW50IHJldDsNCj4gPiArDQo+ID4gKwlpZiAoISpzaXplKQ0KPiA+ICsJCXJldHVybiAwOw0KPiA+ ICsNCj4gPiArCS8qDQo+ID4gKwkgKiBFeGlzdGluZyBkbWEgcmVnaW9uIGlzIGNvbXBsZXRlbHkg Y292ZXJlZCwgdW5tYXAgYWxsLiAgVGhpcyBpcw0KPiA+ICsJICogdGhlIGxpa2VseSBjYXNlIHNp bmNlIHVzZXJzcGFjZSB0ZW5kcyB0byBtYXAgYW5kIHVubWFwIGJ1ZmZlcnMNCj4gPiArCSAqIGlu IG9uZSBzaG90IHJhdGhlciB0aGFuIG11bHRpcGxlIG1hcHBpbmdzIHdpdGhpbiBhIGJ1ZmZlci4N Cj4gPiArCSAqLw0KPiA+ICsJaWYgKGxpa2VseShzdGFydCA8PSBkbWEtPmlvdmEgJiYNCj4gPiAr CQkgICBzdGFydCArICpzaXplID49IGRtYS0+aW92YSArIGRtYS0+c2l6ZSkpIHsNCj4gPiArCQkq c2l6ZSA9IGRtYS0+c2l6ZTsNCj4gPiArCQlyZXQgPSB2ZmlvX3VubWFwX3VucGluKGlvbW11LCBk bWEsIGRtYS0+aW92YSwgc2l6ZSk7DQo+ID4gKwkJaWYgKHJldCkNCj4gPiArCQkJcmV0dXJuIHJl dDsNCj4gPiArDQo+ID4gKwkJLyoNCj4gPiArCQkgKiBEaWQgd2UgcmVtb3ZlIG1vcmUgdGhhbiB3 ZSBoYXZlPyAgU2hvdWxkIG5ldmVyIGhhcHBlbg0KPiA+ICsJCSAqIHNpbmNlIGEgdmZpb19kbWEg aXMgY29udGlndW91cyBpbiBpb3ZhIGFuZCB2YWRkci4NCj4gPiArCQkgKi8NCj4gPiArCQlXQVJO X09OKCpzaXplICE9IGRtYS0+c2l6ZSk7DQo+ID4gKw0KPiA+ICsJCXZmaW9fcmVtb3ZlX2RtYShp b21tdSwgZG1hKTsNCj4gPiArCQlrZnJlZShkbWEpOw0KPiA+ICsJCXJldHVybiAwOw0KPiA+ICsJ fQ0KPiA+ICsNCj4gPiArCS8qIE92ZXJsYXAgbG93IGFkZHJlc3Mgb2YgZXhpc3RpbmcgcmFuZ2Ug Ki8NCj4gPiArCWlmIChzdGFydCA8PSBkbWEtPmlvdmEpIHsNCj4gPiArCQlvdmVybGFwID0gc3Rh cnQgKyAqc2l6ZSAtIGRtYS0+aW92YTsNCj4gPiArCQlyZXQgPSB2ZmlvX3VubWFwX3VucGluKGlv bW11LCBkbWEsIGRtYS0+aW92YSwgJm92ZXJsYXApOw0KPiA+ICsJCWlmIChyZXQpDQo+ID4gKwkJ CXJldHVybiByZXQ7DQo+ID4gKw0KPiA+ICsJCXZmaW9fcmVtb3ZlX2RtYShpb21tdSwgZG1hKTsN Cj4gPiArDQo+ID4gKwkJLyoNCj4gPiArCQkgKiBDaGVjaywgd2UgbWF5IGhhdmUgcmVtb3ZlZCB0 byB3aG9sZSB2ZmlvX2RtYS4gIElmIG5vdA0KPiA+ICsJCSAqIGZpeHVwIGFuZCByZS1pbnNlcnQu DQo+ID4gKwkJICovDQo+ID4gKwkJaWYgKG92ZXJsYXAgPCBkbWEtPnNpemUpIHsNCj4gPiArCQkJ ZG1hLT5pb3ZhICs9IG92ZXJsYXA7DQo+ID4gKwkJCWRtYS0+dmFkZHIgKz0gb3ZlcmxhcDsNCj4g PiArCQkJZG1hLT5zaXplIC09IG92ZXJsYXA7DQo+ID4gKwkJCXZmaW9faW5zZXJ0X2RtYShpb21t dSwgZG1hKTsNCj4gPiArCQl9IGVsc2UNCj4gPiArCQkJa2ZyZWUoZG1hKTsNCj4gPiArDQo+ID4g KwkJKnNpemUgPSBvdmVybGFwOw0KPiA+ICsJCXJldHVybiAwOw0KPiA+ICsJfQ0KPiA+ICsNCj4g PiArCS8qIE92ZXJsYXAgaGlnaCBhZGRyZXNzIG9mIGV4aXN0aW5nIHJhbmdlICovDQo+ID4gKwlp ZiAoc3RhcnQgKyAqc2l6ZSA+PSBkbWEtPmlvdmEgKyBkbWEtPnNpemUpIHsNCj4gPiArCQlvZmZz ZXQgPSBzdGFydCAtIGRtYS0+aW92YTsNCj4gPiArCQlvdmVybGFwID0gZG1hLT5zaXplIC0gb2Zm c2V0Ow0KPiA+ICsNCj4gPiArCQlyZXQgPSB2ZmlvX3VubWFwX3VucGluKGlvbW11LCBkbWEsIHN0 YXJ0LCAmb3ZlcmxhcCk7DQo+ID4gKwkJaWYgKHJldCkNCj4gPiArCQkJcmV0dXJuIHJldDsNCj4g PiArDQo+ID4gKwkJZG1hLT5zaXplIC09IG92ZXJsYXA7DQo+ID4gKwkJKnNpemUgPSBvdmVybGFw Ow0KPiA+ICsJCXJldHVybiAwOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCS8qIFNwbGl0IGV4aXN0 aW5nICovDQo+ID4gKw0KPiA+ICsJLyoNCj4gPiArCSAqIEFsbG9jYXRlIG91ciB0cmFja2luZyBz dHJ1Y3R1cmUgZWFybHkgZXZlbiB0aG91Z2ggaXQgbWF5IG5vdA0KPiA+ICsJICogYmUgdXNlZC4g IEFuIEFsbG9jYXRpb24gZmFpbHVyZSBsYXRlciBsb3NlcyB0cmFjayBvZiBwYWdlcyBhbmQNCj4g PiArCSAqIGlzIG1vcmUgZGlmZmljdWx0IHRvIHVud2luZC4NCj4gPiArCSAqLw0KPiA+ICsJc3Bs aXQgPSBremFsbG9jKHNpemVvZigqc3BsaXQpLCBHRlBfS0VSTkVMKTsNCj4gPiArCWlmICghc3Bs aXQpDQo+ID4gKwkJcmV0dXJuIC1FTk9NRU07DQo+ID4gKw0KPiA+ICsJb2Zmc2V0ID0gc3RhcnQg LSBkbWEtPmlvdmE7DQo+ID4gKw0KPiA+ICsJcmV0ID0gdmZpb191bm1hcF91bnBpbihpb21tdSwg ZG1hLCBzdGFydCwgc2l6ZSk7DQo+ID4gKwlpZiAocmV0IHx8ICEqc2l6ZSkgew0KPiA+ICsJCWtm cmVlKHNwbGl0KTsNCj4gPiArCQlyZXR1cm4gcmV0Ow0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXRt cCA9IGRtYS0+c2l6ZTsNCj4gPiArDQo+ID4gKwkvKiBSZXNpemUgdGhlIGxvd2VyIHZmaW9fZG1h IGluIHBsYWNlLCBiZWZvcmUgdGhlIGJlbG93IGluc2VydCAqLw0KPiA+ICsJZG1hLT5zaXplID0g b2Zmc2V0Ow0KPiA+ICsNCj4gPiArCS8qIEluc2VydCBuZXcgZm9yIHJlbWFpbmRlciwgYXNzdW1p bmcgaXQgZGlkbid0IGFsbCBnZXQgdW5tYXBwZWQgKi8NCj4gPiArCWlmIChsaWtlbHkob2Zmc2V0 ICsgKnNpemUgPCB0bXApKSB7DQo+ID4gKwkJc3BsaXQtPnNpemUgPSB0bXAgLSBvZmZzZXQgLSAq c2l6ZTsNCj4gPiArCQlzcGxpdC0+aW92YSA9IGRtYS0+aW92YSArIG9mZnNldCArICpzaXplOw0K PiA+ICsJCXNwbGl0LT52YWRkciA9IGRtYS0+dmFkZHIgKyBvZmZzZXQgKyAqc2l6ZTsNCj4gPiAr CQlzcGxpdC0+cHJvdCA9IGRtYS0+cHJvdDsNCj4gPiArCQl2ZmlvX2luc2VydF9kbWEoaW9tbXUs IHNwbGl0KTsNCj4gPiArCX0gZWxzZQ0KPiA+ICsJCWtmcmVlKHNwbGl0KTsNCj4gPiArDQo+ID4g KwlyZXR1cm4gMDsNCj4gPiArfQ0KPiANCj4gSG1tLCB0aGlzIGxvb2tzIGlkZW50aWNhbCB0byB0 eXBlMSwgY2FuIHdlIHNoYXJlIG1vcmU/DQoNClllcywgYXMgSSBzYWlkIHRoaXMgdXNlcyAiIHN0 cnVjdCB2ZmlvX2lvbW11IiwgdmZpb191bm1hcF91bnBpbigpIGV0YyB3aGljaCBhcmUgZGlmZmVy ZW50IGZvciB0eXBlMSBhbmQgZnNsX3BhbXUuDQpJbiB0aGlzIHBhdGNoc2V0IEkgb25seSBtb3Zl ZCB0aGUgZnVuY3Rpb24gd2hpY2ggYXJlIHN0cmFpZ2h0IGZvcndhcmQuIEJ1dCB5ZXMgSSBhbSB3 b3JraW5nIG9uIGRvaW5nIG1vcmUgY29uc29saWRhdGlvbiBwYXRjaGVzLg0KDQo+IA0KPiA+ICsN Cj4gPiArLyogTWFwIERNQSByZWdpb24gKi8NCj4gPiArc3RhdGljIGludCB2ZmlvX2RtYV9tYXAo c3RydWN0IHZmaW9faW9tbXUgKmlvbW11LCBkbWFfYWRkcl90IGlvdmEsDQo+ID4gKwkJCSAgdW5z aWduZWQgbG9uZyB2YWRkciwgbG9uZyBucGFnZSwgaW50IHByb3QpIHsNCj4gPiArCWludCByZXQg PSAwLCBpOw0KPiA+ICsJc2l6ZV90IHNpemU7DQo+ID4gKwl1bnNpZ25lZCBpbnQgd2luLCBucl9z dWJ3aW5kb3dzOw0KPiA+ICsJZG1hX2FkZHJfdCBpb3ZhbWFwOw0KPiA+ICsNCj4gPiArCS8qIHRv dGFsIHNpemUgdG8gYmUgbWFwcGVkICovDQo+ID4gKwlzaXplID0gbnBhZ2UgPDwgUEFHRV9TSElG VDsNCj4gPiArCWRvX2RpdihzaXplLCBpb21tdS0+cGFnZV9zaXplKTsNCj4gPiArCW5yX3N1Yndp bmRvd3MgID0gc2l6ZTsNCj4gPiArCXNpemUgPSBucGFnZSA8PCBQQUdFX1NISUZUOw0KPiANCj4g SXMgYWxsIHRoaXMgZG9fZGl2KCkgc3R1ZmYgbmVjZXNzYXJ5PyAgSWYgcGFnZV9zaXplIGlzIGEg cG93ZXIgb2YgdHdvLCBqdXN0DQo+IHNoaWZ0IGl0Lg0KDQpXaWxsIGRvDQoNCj4gDQo+ID4gKwlp b3ZhbWFwID0gaW92YTsNCj4gPiArCWZvciAoaSA9IDA7IGkgPCBucl9zdWJ3aW5kb3dzOyBpKysp IHsNCj4gPiArCQl1bnNpZ25lZCBsb25nIHBmbjsNCj4gPiArCQl1bnNpZ25lZCBsb25nIG5yX3Bh Z2VzOw0KPiA+ICsJCWRtYV9hZGRyX3QgbWFwc2l6ZTsNCj4gPiArCQlzdHJ1Y3QgdmZpb19kbWEg KmRtYSA9IE5VTEw7DQo+ID4gKw0KPiA+ICsJCXdpbiA9IGlvdmFfdG9fd2luKGlvbW11LCBpb3Zh bWFwKTsNCj4gDQo+IEFyZW4ndCB0aGVzZSBjb25zZWN1dGl2ZSwgd2h5IGNhbid0IHdlIGp1c3Qg aW5jcmVtZW50Pw0KDQpZZXMsIHdpbGwgZG8NCg0KPiANCj4gPiArCQlpZiAoaW92YW1hcCAhPSBp b21tdS0+YXBlcnR1cmVfc3RhcnQgKyBpb21tdS0+cGFnZV9zaXplICogd2luKSB7DQo+ID4gKwkJ CXByX2VycigiJXMgaW92YSglbGx4KSB1bmFsbGlnbmVkIHRvIHdpbmRvdyBzaXplICVsbHhcbiIs DQo+ID4gKwkJCQlfX2Z1bmNfXywgaW92YW1hcCwgaW9tbXUtPnBhZ2Vfc2l6ZSk7DQo+ID4gKwkJ CXJldCA9IC1FSU5WQUw7DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJCX0NCj4gDQo+IENhbid0IHRo aXMgb25seSBoYXBwZW4gb24gdGhlIGZpcnN0IG9uZT8NCg0KaW92YSB0byBiZSBtYXBwZWQgaW4g YSB3aW5kb3cgbXVzdCBiZSAoaW9tbXUtPmFwZXJ0dXJlX3N0YXJ0ICsgaW9tbXUtPnBhZ2Vfc2l6 ZSAqIHdpbikNCkJ1dCBhcyB5b3UgcG9pbnRlZCBvdXQgdGhhdCAid2luIiBjYW4gaW5jcmVtZW50 ZWQgaW92YW1hcCBpcyBhbHdheXMgaW5jcmVtZW50ZWQgYnkgcGFnZV9zaXplIHRoZW4gY2hlY2tp bmcgdGhpcyBvdXRzaWRlIHRoZSBsb29rIGNhbiBiZSBkb25lLiBCdXQgdGhpcyBpcyB0aGUgcmVx dWlyZW1lbnQgb2Ygb3VyIGlvbW11IGFuZCB3ZSBzaG91bGQgZXJyb3Igb3V0IGlmIHRoaXMgaXMg bm90IG1ldC4NCg0KPiBTZWVtcyBsaWtlIGl0IHNob3VsZCBiZSBvdXRzaWRlIG9mIHRoZQ0KPiBs b29wLiAgV2hhdCBhYm91dCBhbGlnbm1lbnQgd2l0aCB0aGUgZW5kIG9mIHRoZSB3aW5kb3csIGRv IHlvdSBjYXJlPyAgQ2hlY2sNCj4gc3BlbGxpbmcgaW4geW91ciB3YXJuaW5nLCBidXQgYmV0dGVy IHlldCwgZ2V0IHJpZCBvZiBpdCwgdGhpcyBkb2Vzbid0IHNlZW0gbGlrZQ0KPiBzb21ldGhpbmcg d2UgbmVlZCB0byBlcnJvciBvbi4NCj4gDQo+ID4gKw0KPiA+ICsJCW1hcHNpemUgPSBtaW4oaW92 YSArIHNpemUgLSBpb3ZhbWFwLCBpb21tdS0+cGFnZV9zaXplKTsNCj4gPiArCQkvKg0KPiA+ICsJ CSAqIEZJWE1FOiBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IG1hcHBpbmcgcGFnZS1zaXplDQo+ ID4gKwkJICogb2Ygc3Vid2luZG93LXNpemUuDQo+ID4gKwkJICovDQo+ID4gKwkJaWYgKG1hcHNp emUgPCBpb21tdS0+cGFnZV9zaXplKSB7DQo+ID4gKwkJCXByX2VycigiJXMgaW92YSAoJWxseCkg bm90IGFsbGlnbmVkIHRvIHdpbmRvdyBzaXplICVsbHhcbiIsDQo+ID4gKwkJCQlfX2Z1bmNfXywg aW92YW1hcCwgaW9tbXUtPnBhZ2Vfc2l6ZSk7DQo+ID4gKwkJCXJldCA9IC1FSU5WQUw7DQo+ID4g KwkJCWJyZWFrOw0KPiA+ICsJCX0NCj4gDQo+IFNvIHlvdSBkbyBjYXJlIGFib3V0IHRoZSBlbmQg YWxpZ25tZW50LCBidXQgd2h5IGNhbid0IHdlIGVycm9yIGZvciBib3RoIG9mIHRoZXNlDQo+IGlu IGFkdmFuY2U/DQoNCkV2ZW50dWFsbHkgdGhpcyBzaG91bGQgZ28gYXdheSwgSSB3aWxsIHJlbW92 ZSB0aGlzIDopDQoNCj4gDQo+ID4gKw0KPiA+ICsJCW5yX3BhZ2VzID0gbWFwc2l6ZSA+PiBQQUdF X1NISUZUOw0KPiA+ICsNCj4gPiArCQkvKiBQaW4gYSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9y eSAqLw0KPiA+ICsJCXJldCA9IHZmaW9fcGluX3BhZ2VzKHZhZGRyLCBucl9wYWdlcywgcHJvdCwg JnBmbik7DQo+ID4gKwkJaWYgKHJldCAhPSBucl9wYWdlcykgew0KPiA+ICsJCQlwcl9lcnIoIiVz IHVuYWJsZSB0byBwaW4gcGFnZXMgPSAlbHgsIHBpbm5lZCglbHgvJWx4KVxuIiwNCj4gPiArCQkJ CV9fZnVuY19fLCB2YWRkciwgbnBhZ2UsIG5yX3BhZ2VzKTsNCj4gPiArCQkJcmV0ID0gLUVJTlZB TDsNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJfQ0KPiANCj4gSG93IGxpa2VseSBpcyB0aGlzIHRv IHN1Y2NlZWQ/ICBJdCBzZWVtcyBsaWtlIHdlJ3JlIHJlbHlpbmcgb24gdXNlcnNwYWNlIHRvIHVz ZQ0KPiBodWdlcGFnZXMgdG8gbWFrZSB0aGlzIHdvcmsuDQoNClllcywgdXNlcnNwYWNlIHdpbGwg Zmlyc3QgaGF2ZSBodWdlcGFnZXMgYW5kIHRoYW4gY2FsbHMgRE1BX01BUCgpDQoNCj4gDQo+ID4g Kw0KPiA+ICsJCXJldCA9IGlvbW11X2RvbWFpbl93aW5kb3dfZW5hYmxlKGlvbW11LT5kb21haW4s IHdpbiwNCj4gPiArCQkJCQkJIChwaHlzX2FkZHJfdClwZm4gPDwgUEFHRV9TSElGVCwNCj4gPiAr CQkJCQkJIG1hcHNpemUsIHByb3QpOw0KPiA+ICsJCWlmIChyZXQpIHsNCj4gPiArCQkJcHJfZXJy KCIlcyB1bmFibGUgdG8gaW9tbXVfbWFwKClcbiIsIF9fZnVuY19fKTsNCj4gPiArCQkJcmV0ID0g LUVJTlZBTDsNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJfQ0KPiANCj4gWW91IG1pZ2h0IGNvbnNp ZGVyIGhvdyBtYW55IGNhc2VzIHlvdSdyZSByZXR1cm5pbmcgRUlOVkFMIGFuZCB0aGluayBhYm91 dCBob3cNCj4gZGlmZmljdWx0IHRoaXMgd2lsbCBiZSB0byBkZWJ1Zy4gIEkgZG9uJ3QgdGhpbmsg d2UgY2FuIGxlYXZlIGFsbCB0aGVzZSBwcl9lcnIoKXMNCj4gc2luY2UgaXQgZ2l2ZXMgdXNlcnNw YWNlIGEgdHJpdmlhbCB3YXkgdG8gc3BhbSBsb2cgZmlsZXMuDQo+IA0KPiA+ICsNCj4gPiArCQkv Kg0KPiA+ICsJCSAqIENoZWNrIGlmIHdlIGFidXQgYSByZWdpb24gYmVsb3cgLSBub3RoaW5nIGJl bG93IDAuDQo+ID4gKwkJICogVGhpcyBpcyB0aGUgbW9zdCBsaWtlbHkgY2FzZSB3aGVuIG1hcHBp bmcgY2h1bmtzIG9mDQo+ID4gKwkJICogcGh5c2ljYWxseSBjb250aWd1b3VzIHJlZ2lvbnMgd2l0 aGluIGEgdmlydHVhbCBhZGRyZXNzDQo+ID4gKwkJICogcmFuZ2UuICBVcGRhdGUgdGhlIGFidXR0 aW5nIGVudHJ5IGluIHBsYWNlIHNpbmNlIGlvdmENCj4gPiArCQkgKiBkb2Vzbid0IGNoYW5nZS4N Cj4gPiArCQkgKi8NCj4gPiArCQlpZiAobGlrZWx5KGlvdmFtYXApKSB7DQo+ID4gKwkJCXN0cnVj dCB2ZmlvX2RtYSAqdG1wOw0KPiA+ICsJCQl0bXAgPSB2ZmlvX2ZpbmRfZG1hKGlvbW11LCBpb3Zh bWFwIC0gMSwgMSk7DQo+ID4gKwkJCWlmICh0bXAgJiYgdG1wLT5wcm90ID09IHByb3QgJiYNCj4g PiArCQkJICAgIHRtcC0+dmFkZHIgKyB0bXAtPnNpemUgPT0gdmFkZHIpIHsNCj4gPiArCQkJCXRt cC0+c2l6ZSArPSBtYXBzaXplOw0KPiA+ICsJCQkJZG1hID0gdG1wOw0KPiA+ICsJCQl9DQo+ID4g KwkJfQ0KPiA+ICsNCj4gPiArCQkvKg0KPiA+ICsJCSAqIENoZWNrIGlmIHdlIGFidXQgYSByZWdp b24gYWJvdmUgLSBub3RoaW5nIGFib3ZlIH4wICsgMS4NCj4gPiArCQkgKiBJZiB3ZSBhYnV0IGFi b3ZlIGFuZCBiZWxvdywgcmVtb3ZlIGFuZCBmcmVlLiAgSWYgb25seQ0KPiA+ICsJCSAqIGFidXQg YWJvdmUsIHJlbW92ZSwgbW9kaWZ5LCByZWluc2VydC4NCj4gPiArCQkgKi8NCj4gPiArCQlpZiAo bGlrZWx5KGlvdmFtYXAgKyBtYXBzaXplKSkgew0KPiA+ICsJCQlzdHJ1Y3QgdmZpb19kbWEgKnRt cDsNCj4gPiArCQkJdG1wID0gdmZpb19maW5kX2RtYShpb21tdSwgaW92YW1hcCArIG1hcHNpemUs IDEpOw0KPiA+ICsJCQlpZiAodG1wICYmIHRtcC0+cHJvdCA9PSBwcm90ICYmDQo+ID4gKwkJCSAg ICB0bXAtPnZhZGRyID09IHZhZGRyICsgbWFwc2l6ZSkgew0KPiA+ICsJCQkJdmZpb19yZW1vdmVf ZG1hKGlvbW11LCB0bXApOw0KPiA+ICsJCQkJaWYgKGRtYSkgew0KPiA+ICsJCQkJCWRtYS0+c2l6 ZSArPSB0bXAtPnNpemU7DQo+ID4gKwkJCQkJa2ZyZWUodG1wKTsNCj4gPiArCQkJCX0gZWxzZSB7 DQo+ID4gKwkJCQkJdG1wLT5zaXplICs9IG1hcHNpemU7DQo+ID4gKwkJCQkJdG1wLT5pb3ZhID0g aW92YW1hcDsNCj4gPiArCQkJCQl0bXAtPnZhZGRyID0gdmFkZHI7DQo+ID4gKwkJCQkJdmZpb19p bnNlcnRfZG1hKGlvbW11LCB0bXApOw0KPiA+ICsJCQkJCWRtYSA9IHRtcDsNCj4gPiArCQkJCX0N Cj4gPiArCQkJfQ0KPiA+ICsJCX0NCj4gPiArDQo+ID4gKwkJaWYgKCFkbWEpIHsNCj4gPiArCQkJ ZG1hID0ga3phbGxvYyhzaXplb2YoKmRtYSksIEdGUF9LRVJORUwpOw0KPiA+ICsJCQlpZiAoIWRt YSkgew0KPiA+ICsJCQkJaW9tbXVfdW5tYXAoaW9tbXUtPmRvbWFpbiwgaW92YW1hcCwgbWFwc2l6 ZSk7DQo+ID4gKwkJCQl2ZmlvX3VucGluX3BhZ2VzKHBmbiwgbnBhZ2UsIHByb3QsIHRydWUpOw0K PiA+ICsJCQkJcmV0ID0gLUVOT01FTTsNCj4gPiArCQkJCWJyZWFrOw0KPiA+ICsJCQl9DQo+ID4g Kw0KPiA+ICsJCQlkbWEtPnNpemUgPSBtYXBzaXplOw0KPiA+ICsJCQlkbWEtPmlvdmEgPSBpb3Zh bWFwOw0KPiA+ICsJCQlkbWEtPnZhZGRyID0gdmFkZHI7DQo+ID4gKwkJCWRtYS0+cHJvdCA9IHBy b3Q7DQo+ID4gKwkJCXZmaW9faW5zZXJ0X2RtYShpb21tdSwgZG1hKTsNCj4gPiArCQl9DQo+ID4g Kw0KPiA+ICsJCWlvdmFtYXAgKz0gbWFwc2l6ZTsNCj4gPiArCQl2YWRkciArPSBtYXBzaXplOw0K PiANCj4gQW5vdGhlciBjaHVuayB0aGF0IGxvb2tzIGxpa2UgaXQncyBwcm9iYWJseSBpZGVudGlj YWwgdG8gdHlwZTEuICBDYW4gd2UgcmlwIHRoaXMNCj4gb3V0IHRvIGFub3RoZXIgZnVuY3Rpb24g YW5kIGFkZCBpdCB0byBjb21tb24/DQoNClllcywgYW5kIHNhbWUgYW5zd2VyIDopDQoNCj4gDQo+ ID4gKwl9DQo+ID4gKw0KPiA+ICsgICAgICAgIGlmIChyZXQpIHsNCj4gPiArICAgICAgICAgICAg ICAgIHN0cnVjdCB2ZmlvX2RtYSAqdG1wOw0KPiA+ICsgICAgICAgICAgICAgICAgd2hpbGUgKCh0 bXAgPSB2ZmlvX2ZpbmRfZG1hKGlvbW11LCBpb3ZhLCBzaXplKSkpIHsNCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgaW50IHIgPSB2ZmlvX3JlbW92ZV9kbWFfb3ZlcmxhcChpb21tdSwgaW92 YSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAmc2l6ZSwgdG1wKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFdB Uk5fT04ociB8fCAhc2l6ZSkpDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg YnJlYWs7DQo+ID4gKyAgICAgICAgICAgICAgICB9DQo+ID4gKyAgICAgICAgfQ0KPiANCj4gDQo+ IEJyb2tlbiB3aGl0ZXNwYWNlLCBwbGVhc2UgcnVuIHNjcmlwdHMvY2hlY2twYXRjaC5wbCBiZWZv cmUgcG9zdGluZy4NCj4gDQo+ID4gKw0KPiA+ICsJdmZpb19lbmFibGVfaW9tbXVfZG9tYWluKGlv bW11KTsNCj4gDQo+IEkgZG9uJ3QgcXVpdGUgdW5kZXJzdGFuZCB5b3VyIHNlbWFudGljcyBoZXJl IHNpbmNlIHlvdSBuZXZlciB1c2UgdGhlIGRpc2FibGUNCj4gdmVyc2lvbiwgaXMgdGhpcyBqdXN0 IHJlZHVuZGFudCBhZnRlciB0aGUgZmlyc3QgbWFwcGluZz8gIFdoZW4gZG1hX2xpc3QgaXMgZW1w dHkNCj4gc2hvdWxkIGl0IGJlIGRpc2FibGVkPw0KDQpZZXMsIEkgaW50ZW5kZWQgdG8gZG8gdGhh dCBidXQgc29tZWhvdyBpbiBmaW5hbCB2ZXJzaW9uIGl0IGlzIG5vdCB0aGVyZSA6KA0KDQo+ICBJ cyB0aGVyZSBhIGJ1ZyBoZXJlIHRoYXQgYW4gZXJyb3Igd2lsbCBlbmFibGUgdGhlIGlvbW11DQo+ IGRvbWFpbiBldmVuIGlmIHRoZXJlIGFyZSBubyBlbnRyaWVzPw0KDQpXaWxsIGNvcnJlY3QgdGhp cy4NCg0KPiANCj4gPiArCXJldHVybiAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50 IHZmaW9fZG1hX2RvX21hcChzdHJ1Y3QgdmZpb19pb21tdSAqaW9tbXUsDQo+ID4gKwkJCSAgIHN0 cnVjdCB2ZmlvX2lvbW11X3R5cGUxX2RtYV9tYXAgKm1hcCkgew0KPiA+ICsJZG1hX2FkZHJfdCBp b3ZhID0gbWFwLT5pb3ZhOw0KPiA+ICsJc2l6ZV90IHNpemUgPSBtYXAtPnNpemU7DQo+ID4gKwl1 bnNpZ25lZCBsb25nIHZhZGRyID0gbWFwLT52YWRkcjsNCj4gPiArCWludCByZXQgPSAwLCBwcm90 ID0gMDsNCj4gPiArCWxvbmcgbnBhZ2U7DQo+ID4gKw0KPiA+ICsJLyogUkVBRC9XUklURSBmcm9t IGRldmljZSBwZXJzcGVjdGl2ZSAqLw0KPiA+ICsJaWYgKG1hcC0+ZmxhZ3MgJiBWRklPX0RNQV9N QVBfRkxBR19XUklURSkNCj4gPiArCQlwcm90IHw9IElPTU1VX1dSSVRFOw0KPiA+ICsJaWYgKG1h cC0+ZmxhZ3MgJiBWRklPX0RNQV9NQVBfRkxBR19SRUFEKQ0KPiA+ICsJCXByb3QgfD0gSU9NTVVf UkVBRDsNCj4gPiArDQo+ID4gKwlpZiAoIXByb3QpDQo+ID4gKwkJcmV0dXJuIC1FSU5WQUw7IC8q IE5vIFJFQUQvV1JJVEU/ICovDQo+ID4gKw0KPiA+ICsJLyogRG9uJ3QgYWxsb3cgSU9WQSB3cmFw ICovDQo+ID4gKwlpZiAoaW92YSArIHNpemUgJiYgaW92YSArIHNpemUgPCBpb3ZhKQ0KPiA+ICsJ CXJldHVybiAtRUlOVkFMOw0KPiA+ICsNCj4gPiArCS8qIERvbid0IGFsbG93IHZpcnR1YWwgYWRk cmVzcyB3cmFwICovDQo+ID4gKwlpZiAodmFkZHIgKyBzaXplICYmIHZhZGRyICsgc2l6ZSA8IHZh ZGRyKQ0KPiA+ICsJCXJldHVybiAtRUlOVkFMOw0KPiA+ICsNCj4gPiArCS8qDQo+ID4gKwkgKiBG SVhNRTogQ3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCBtYXBwaW5nIHBhZ2Utc2l6ZQ0KPiA+ICsJ ICogb2Ygc3Vid2luZG93LXNpemUuDQo+ID4gKwkgKi8NCj4gPiArCWlmIChzaXplIDwgaW9tbXUt PnBhZ2Vfc2l6ZSkNCj4gPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gPiArDQo+IA0KPiBJJ2QgdGhp bmsgdGhlIHN0YXJ0IGFuZCBlbmQgYWxpZ25tZW50IGNvdWxkIGJlIHRlc3RlZCBoZXJlLg0KPiAN Cj4gPiArCW5wYWdlID0gc2l6ZSA+PiBQQUdFX1NISUZUOw0KPiA+ICsJaWYgKCFucGFnZSkNCj4g PiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gPiArDQo+ID4gKwltdXRleF9sb2NrKCZpb21tdS0+bG9j ayk7DQo+ID4gKw0KPiA+ICsJaWYgKHZmaW9fZmluZF9kbWEoaW9tbXUsIGlvdmEsIHNpemUpKSB7 DQo+ID4gKwkJcmV0ID0gLUVFWElTVDsNCj4gPiArCQlnb3RvIG91dF9sb2NrOw0KPiA+ICsJfQ0K PiA+ICsNCj4gPiArCXZmaW9fZG1hX21hcChpb21tdSwgaW92YSwgdmFkZHIsIG5wYWdlLCBwcm90 KTsNCj4gPiArDQo+ID4gK291dF9sb2NrOg0KPiA+ICsJbXV0ZXhfdW5sb2NrKCZpb21tdS0+bG9j ayk7DQo+ID4gKwlyZXR1cm4gcmV0Ow0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50IHZm aW9fZG1hX2RvX3VubWFwKHN0cnVjdCB2ZmlvX2lvbW11ICppb21tdSwNCj4gPiArCQkJICAgICBz dHJ1Y3QgdmZpb19pb21tdV90eXBlMV9kbWFfdW5tYXAgKnVubWFwKSB7DQo+ID4gKwlzdHJ1Y3Qg dmZpb19kbWEgKmRtYTsNCj4gPiArCXNpemVfdCB1bm1hcHBlZCA9IDAsIHNpemU7DQo+ID4gKwlp bnQgcmV0ID0gMDsNCj4gPiArDQo+ID4gKwltdXRleF9sb2NrKCZpb21tdS0+bG9jayk7DQo+ID4g Kw0KPiA+ICsJd2hpbGUgKChkbWEgPSB2ZmlvX2ZpbmRfZG1hKGlvbW11LCB1bm1hcC0+aW92YSwg dW5tYXAtPnNpemUpKSkgew0KPiA+ICsJCXNpemUgPSB1bm1hcC0+c2l6ZTsNCj4gPiArCQlyZXQg PSB2ZmlvX3JlbW92ZV9kbWFfb3ZlcmxhcChpb21tdSwgdW5tYXAtPmlvdmEsICZzaXplLCBkbWEp Ow0KPiA+ICsJCWlmIChyZXQgfHwgIXNpemUpDQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJCXVubWFw cGVkICs9IHNpemU7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJbXV0ZXhfdW5sb2NrKCZpb21tdS0+ bG9jayk7DQo+ID4gKw0KPiA+ICsJLyoNCj4gPiArCSAqIFdlIG1heSB1bm1hcCBtb3JlIHRoYW4g cmVxdWVzdGVkLCB1cGRhdGUgdGhlIHVubWFwIHN0cnVjdCBzbw0KPiA+ICsJICogdXNlcnNwYWNl IGNhbiBrbm93Lg0KPiA+ICsJICovDQo+ID4gKwl1bm1hcC0+c2l6ZSA9IHVubWFwcGVkOw0KPiA+ ICsNCj4gPiArCXJldHVybiByZXQ7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgdmZp b19oYW5kbGVfZ2V0X2F0dHIoc3RydWN0IHZmaW9faW9tbXUgKmlvbW11LA0KPiA+ICsJCQkgc3Ry dWN0IHZmaW9fcGFtdV9hdHRyICpwYW11X2F0dHIpIHsNCj4gPiArCXN3aXRjaCAocGFtdV9hdHRy LT5hdHRyaWJ1dGUpIHsNCj4gPiArCWNhc2UgVkZJT19BVFRSX0dFT01FVFJZOiB7DQo+ID4gKwkJ c3RydWN0IGlvbW11X2RvbWFpbl9nZW9tZXRyeSBnZW9tOw0KPiA+ICsJCWlmIChpb21tdV9kb21h aW5fZ2V0X2F0dHIoaW9tbXUtPmRvbWFpbiwNCj4gPiArCQkJCSAgICAgIERPTUFJTl9BVFRSX0dF T01FVFJZLCAmZ2VvbSkpIHsNCj4gPiArCQkJcHJfZXJyKCIlcyBFcnJvciBnZXR0aW5nIGRvbWFp biBnZW9tZXRyeVxuIiwNCj4gPiArCQkJICAgICAgIF9fZnVuY19fKTsNCj4gPiArCQkJcmV0dXJu IC1FRkFVTFQ7DQo+ID4gKwkJfQ0KPiA+ICsNCj4gPiArCQlwYW11X2F0dHItPmF0dHJfaW5mby5h dHRyLmFwZXJ0dXJlX3N0YXJ0ID0gZ2VvbS5hcGVydHVyZV9zdGFydDsNCj4gPiArCQlwYW11X2F0 dHItPmF0dHJfaW5mby5hdHRyLmFwZXJ0dXJlX2VuZCA9IGdlb20uYXBlcnR1cmVfZW5kOw0KPiA+ ICsJCWJyZWFrOw0KPiA+ICsJfQ0KPiA+ICsJY2FzZSBWRklPX0FUVFJfV0lORE9XUzogew0KPiA+ ICsJCXUzMiBjb3VudDsNCj4gPiArCQlpZiAoaW9tbXVfZG9tYWluX2dldF9hdHRyKGlvbW11LT5k b21haW4sDQo+ID4gKwkJCQkgICAgICBET01BSU5fQVRUUl9XSU5ET1dTLCAmY291bnQpKSB7DQo+ ID4gKwkJCXByX2VycigiJXMgRXJyb3IgZ2V0dGluZyBkb21haW4gd2luZG93c1xuIiwNCj4gPiAr CQkJICAgICAgIF9fZnVuY19fKTsNCj4gPiArCQkJcmV0dXJuIC1FRkFVTFQ7DQo+ID4gKwkJfQ0K PiA+ICsNCj4gPiArCQlwYW11X2F0dHItPmF0dHJfaW5mby53aW5kb3dzID0gY291bnQ7DQo+ID4g KwkJYnJlYWs7DQo+ID4gKwl9DQo+ID4gKwljYXNlIFZGSU9fQVRUUl9QQU1VX1NUQVNIOiB7DQo+ ID4gKwkJc3RydWN0IHBhbXVfc3Rhc2hfYXR0cmlidXRlIHN0YXNoOw0KPiA+ICsJCWlmIChpb21t dV9kb21haW5fZ2V0X2F0dHIoaW9tbXUtPmRvbWFpbiwNCj4gPiArCQkJCSAgICAgIERPTUFJTl9B VFRSX0ZTTF9QQU1VX1NUQVNILCAmc3Rhc2gpKSB7DQo+ID4gKwkJCXByX2VycigiJXMgRXJyb3Ig Z2V0dGluZyBkb21haW4gd2luZG93c1xuIiwNCj4gPiArCQkJICAgICAgIF9fZnVuY19fKTsNCj4g PiArCQkJcmV0dXJuIC1FRkFVTFQ7DQo+ID4gKwkJfQ0KPiA+ICsNCj4gPiArCQlwYW11X2F0dHIt PmF0dHJfaW5mby5zdGFzaC5jcHUgPSBzdGFzaC5jcHU7DQo+ID4gKwkJcGFtdV9hdHRyLT5hdHRy X2luZm8uc3Rhc2guY2FjaGUgPSBzdGFzaC5jYWNoZTsNCj4gPiArCQlicmVhazsNCj4gPiArCX0N Cj4gPiArDQo+ID4gKwlkZWZhdWx0Og0KPiA+ICsJCXByX2VycigiJXMgRXJyb3I6IEludmFsaWQg YXR0cmlidXRlICglZClcbiIsDQo+ID4gKwkJCSBfX2Z1bmNfXywgcGFtdV9hdHRyLT5hdHRyaWJ1 dGUpOw0KPiA+ICsJCXJldHVybiAtRUlOVkFMOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJldHVy biAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50IHZmaW9faGFuZGxlX3NldF9hdHRy KHN0cnVjdCB2ZmlvX2lvbW11ICppb21tdSwNCj4gPiArCQkJIHN0cnVjdCB2ZmlvX3BhbXVfYXR0 ciAqcGFtdV9hdHRyKSB7DQo+ID4gKwlzd2l0Y2ggKHBhbXVfYXR0ci0+YXR0cmlidXRlKSB7DQo+ ID4gKwljYXNlIFZGSU9fQVRUUl9HRU9NRVRSWTogew0KPiA+ICsJCXN0cnVjdCBpb21tdV9kb21h aW5fZ2VvbWV0cnkgZ2VvbTsNCj4gPiArDQo+ID4gKwkJZ2VvbS5hcGVydHVyZV9zdGFydCA9IHBh bXVfYXR0ci0+YXR0cl9pbmZvLmF0dHIuYXBlcnR1cmVfc3RhcnQ7DQo+ID4gKwkJZ2VvbS5hcGVy dHVyZV9lbmQgPSBwYW11X2F0dHItPmF0dHJfaW5mby5hdHRyLmFwZXJ0dXJlX2VuZDsNCj4gPiAr CQlpb21tdS0+YXBlcnR1cmVfc3RhcnQgPSBnZW9tLmFwZXJ0dXJlX3N0YXJ0Ow0KPiA+ICsJCWlv bW11LT5hcGVydHVyZV9lbmQgPSBnZW9tLmFwZXJ0dXJlX2VuZDsNCj4gPiArCQlnZW9tLmZvcmNl X2FwZXJ0dXJlID0gMTsNCj4gPiArCQlpZiAoaW9tbXVfZG9tYWluX3NldF9hdHRyKGlvbW11LT5k b21haW4sDQo+ID4gKwkJCQkJICBET01BSU5fQVRUUl9HRU9NRVRSWSwgJmdlb20pKSB7DQo+ID4g KwkJCXByX2VycigiJXMgRXJyb3Igc2V0dGluZyBkb21haW4gZ2VvbWV0cnlcbiIsIF9fZnVuY19f KTsNCj4gPiArCQkJcmV0dXJuIC1FRkFVTFQ7DQo+ID4gKwkJfQ0KPiA+ICsNCj4gPiArCQlicmVh azsNCj4gPiArCX0NCj4gPiArCWNhc2UgVkZJT19BVFRSX1dJTkRPV1M6IHsNCj4gPiArCQl1MzIg Y291bnQgPSBwYW11X2F0dHItPmF0dHJfaW5mby53aW5kb3dzOw0KPiA+ICsJCXU2NCBzaXplOw0K PiA+ICsJCWlmIChjb3VudCA+IDI1Nikgew0KPiA+ICsJCQlwcl9lcnIoIk51bWJlciBvZiBzdWJ3 aW5kb3dzIHJlcXVlc3RlZCAoJWQpIGlzIDI1NlxuIiwNCj4gPiArCQkJCWNvdW50KTsNCj4gPiAr CQkJcmV0dXJuIC1FSU5WQUw7DQo+ID4gKwkJfQ0KPiA+ICsJCWlvbW11LT5uc3Vid2luZG93cyA9 IHBhbXVfYXR0ci0+YXR0cl9pbmZvLndpbmRvd3M7DQo+ID4gKwkJc2l6ZSA9IGlvbW11LT5hcGVy dHVyZV9lbmQgLSBpb21tdS0+YXBlcnR1cmVfc3RhcnQgKyAxOw0KPiA+ICsJCWRvX2RpdihzaXpl LCBjb3VudCk7DQo+ID4gKwkJaW9tbXUtPnBhZ2Vfc2l6ZSA9IHNpemU7DQo+ID4gKwkJaWYgKGlv bW11X2RvbWFpbl9zZXRfYXR0cihpb21tdS0+ZG9tYWluLA0KPiA+ICsJCQkJICAgICAgRE9NQUlO X0FUVFJfV0lORE9XUywgJmNvdW50KSkgew0KPiA+ICsJCQlwcl9lcnIoIiVzIEVycm9yIGdldHRp bmcgZG9tYWluIHdpbmRvd3NcbiIsDQo+ID4gKwkJCSAgICAgICBfX2Z1bmNfXyk7DQo+ID4gKwkJ CXJldHVybiAtRUZBVUxUOw0KPiA+ICsJCX0NCj4gPiArDQo+ID4gKwkJYnJlYWs7DQo+ID4gKwl9 DQo+ID4gKwljYXNlIFZGSU9fQVRUUl9QQU1VX1NUQVNIOiB7DQo+ID4gKwkJc3RydWN0IHBhbXVf c3Rhc2hfYXR0cmlidXRlIHN0YXNoOw0KPiA+ICsNCj4gPiArCQlzdGFzaC5jcHUgPSBwYW11X2F0 dHItPmF0dHJfaW5mby5zdGFzaC5jcHU7DQo+ID4gKwkJc3Rhc2guY2FjaGUgPSBwYW11X2F0dHIt PmF0dHJfaW5mby5zdGFzaC5jYWNoZTsNCj4gPiArCQlpZiAoaW9tbXVfZG9tYWluX3NldF9hdHRy KGlvbW11LT5kb21haW4sDQo+ID4gKwkJCQkgICAgICBET01BSU5fQVRUUl9GU0xfUEFNVV9TVEFT SCwgJnN0YXNoKSkgew0KPiA+ICsJCQlwcl9lcnIoIiVzIEVycm9yIGdldHRpbmcgZG9tYWluIHdp bmRvd3NcbiIsDQo+ID4gKwkJCSAgICAgICBfX2Z1bmNfXyk7DQo+ID4gKwkJCXJldHVybiAtRUZB VUxUOw0KPiA+ICsJCX0NCj4gPiArCQlicmVhazsNCj4gDQo+IFdoeSBkbyB3ZSB0aHJvdyBhd2F5 IHRoZSByZXR1cm4gdmFsdWUgb2YgaW9tbXVfZG9tYWluX3NldF9hdHRyIGFuZCByZXBsYWNlIGl0 DQo+IHdpdGggRUZBVUxUIGluIGFsbCB0aGVzZSBjYXNlcz8NCg0KV2lsbCB1c2UgdGhlIHJldHVy biBvZiBpb21tdV9kb21haW5fc2V0X2F0dHIoKS4NCg0KPiAgSSBhc3N1bWUgYWxsIHRoZXNlIHBy X2VycigpcyBhcmUgbGVmdG92ZXINCj4gZGVidWcuICBDYW4gdGhlIHVzZXIgZG8gYW55dGhpbmcg dGhleSBzaG91bGRuJ3QgdGhyb3VnaCB0aGVzZT8gIEhvdyBkbyB3ZQ0KPiBndWFyYW50ZWUgdGhh dD8NCg0KSSB3aWxsIG1vdmUgdGhlc2UgdG8gcHJfZGVidWcoKQ0KDQo+IA0KPiA+ICsJfQ0KPiA+ ICsNCj4gPiArCWRlZmF1bHQ6DQo+ID4gKwkJcHJfZXJyKCIlcyBFcnJvcjogSW52YWxpZCBhdHRy aWJ1dGUgKCVkKVxuIiwNCj4gPiArCQkJIF9fZnVuY19fLCBwYW11X2F0dHItPmF0dHJpYnV0ZSk7 DQo+ID4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJcmV0dXJuIDA7 DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgdmZpb19tc2lfbWFwKHN0cnVjdCB2Zmlv X2lvbW11ICppb21tdSwNCj4gPiArCQkJc3RydWN0IHZmaW9fcGFtdV9tc2lfYmFua19tYXAgKm1z aV9tYXAsIGludCBwcm90KSB7DQo+ID4gKwlzdHJ1Y3QgbXNpX3JlZ2lvbiByZWdpb247DQo+ID4g KwlpbnQgd2luZG93Ow0KPiA+ICsJaW50IHJldDsNCj4gPiArDQo+ID4gKwlyZXQgPSBtc2lfZ2V0 X3JlZ2lvbihtc2lfbWFwLT5tc2lfYmFua19pbmRleCwgJnJlZ2lvbik7DQo+ID4gKwlpZiAocmV0 KSB7DQo+ID4gKwkJcHJfZXJyKCIlcyBNU0kgcmVnaW9uICglZCkgbm90IGZvdW5kXG4iLCBfX2Z1 bmNfXywNCj4gPiArCQkgICAgICAgbXNpX21hcC0+bXNpX2JhbmtfaW5kZXgpOw0KPiA+ICsJCXJl dHVybiByZXQ7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJd2luZG93ID0gaW92YV90b193aW4oaW9t bXUsIG1zaV9tYXAtPmlvdmEpOw0KPiA+ICsJcmV0ID0gaW9tbXVfZG9tYWluX3dpbmRvd19lbmFi bGUoaW9tbXUtPmRvbWFpbiwgd2luZG93LCByZWdpb24uYWRkciwNCj4gPiArCQkJCQkgcmVnaW9u LnNpemUsIHByb3QpOw0KPiA+ICsJaWYgKHJldCkgew0KPiA+ICsJCXByX2VycigiJXMgRXJyb3I6 IHVuYWJsZSB0byBtYXAgbXNpIHJlZ2lvblxuIiwgX19mdW5jX18pOw0KPiA+ICsJCXJldHVybiBy ZXQ7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJcmV0dXJuIDA7DQo+ID4gK30NCj4gPiArDQo+ID4g K3N0YXRpYyBpbnQgdmZpb19kb19tc2lfbWFwKHN0cnVjdCB2ZmlvX2lvbW11ICppb21tdSwNCj4g PiArCQkJc3RydWN0IHZmaW9fcGFtdV9tc2lfYmFua19tYXAgKm1zaV9tYXApIHsNCj4gPiArCXN0 cnVjdCB2ZmlvX21zaV9kbWEgKm1zaV9kbWE7DQo+ID4gKwlpbnQgcmV0LCBwcm90ID0gMDsNCj4g PiArDQo+ID4gKwkvKiBSRUFEL1dSSVRFIGZyb20gZGV2aWNlIHBlcnNwZWN0aXZlICovDQo+ID4g KwlpZiAobXNpX21hcC0+ZmxhZ3MgJiBWRklPX0RNQV9NQVBfRkxBR19XUklURSkNCj4gPiArCQlw cm90IHw9IElPTU1VX1dSSVRFOw0KPiA+ICsJaWYgKG1zaV9tYXAtPmZsYWdzICYgVkZJT19ETUFf TUFQX0ZMQUdfUkVBRCkNCj4gPiArCQlwcm90IHw9IElPTU1VX1JFQUQ7DQo+ID4gKw0KPiA+ICsJ aWYgKCFwcm90KQ0KPiA+ICsJCXJldHVybiAtRUlOVkFMOyAvKiBObyBSRUFEL1dSSVRFPyAqLw0K PiA+ICsNCj4gPiArCXJldCA9IHZmaW9fbXNpX21hcChpb21tdSwgbXNpX21hcCwgcHJvdCk7DQo+ ID4gKwlpZiAocmV0KQ0KPiA+ICsJCXJldHVybiByZXQ7DQo+ID4gKw0KPiA+ICsJbXNpX2RtYSA9 IGt6YWxsb2Moc2l6ZW9mKCptc2lfZG1hKSwgR0ZQX0tFUk5FTCk7DQo+ID4gKwlpZiAoIW1zaV9k bWEpDQo+ID4gKwkJcmV0dXJuIC1FTk9NRU07DQo+ID4gKw0KPiA+ICsJbXNpX2RtYS0+aW92YSA9 IG1zaV9tYXAtPmlvdmE7DQo+ID4gKwltc2lfZG1hLT5iYW5rX2lkID0gbXNpX21hcC0+bXNpX2Jh bmtfaW5kZXg7DQo+ID4gKwlsaXN0X2FkZCgmbXNpX2RtYS0+bmV4dCwgJmlvbW11LT5tc2lfZG1h X2xpc3QpOw0KPiA+ICsJcmV0dXJuIDA7DQo+IA0KPiBXaGF0IGhhcHBlbnMgd2hlbiB0aGUgdXNl ciBjcmVhdGVzIG11bHRpcGxlIE1TSSBtYXBwaW5ncyBhdCB0aGUgc2FtZSBpb3ZhPyAgV2hhdA0K PiBoYXBwZW5zIHdoZW4gRE1BIG1hcHBpbmdzIG92ZXJsYXAgTVNJIG1hcHBpbmdzPw0KDQpHb29k IHBvaW50LCB3aWxsIGNvcnJlY3QgdGhpcy4NCg0KPiAgU2hvdWxkbid0IHRoZXJlIGJlIHNvbWUg bG9ja2luZw0KPiBhcm91bmQgbGlzdCBtYW5pcHVsYXRpb24/DQoNClllcywgd2lsbCBjb3JyZWN0 IHRoaXMgYXMgd2VsbC4NCg0KVGhhbmtzDQotQmhhcmF0DQoNCj4gDQo+ID4gK30NCj4gPiArDQo+ ID4gK3N0YXRpYyB2b2lkIHZmaW9fbXNpX3VubWFwKHN0cnVjdCB2ZmlvX2lvbW11ICppb21tdSwg ZG1hX2FkZHJfdCBpb3ZhKQ0KPiA+ICt7DQo+ID4gKwlpbnQgd2luZG93Ow0KPiA+ICsJd2luZG93 ID0gaW92YV90b193aW4oaW9tbXUsIGlvdmEpOw0KPiA+ICsJaW9tbXVfZG9tYWluX3dpbmRvd19k aXNhYmxlKGlvbW11LT5kb21haW4sIHdpbmRvdyk7IH0NCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQg dmZpb19kb19tc2lfdW5tYXAoc3RydWN0IHZmaW9faW9tbXUgKmlvbW11LA0KPiA+ICsJCQkgICAg IHN0cnVjdCB2ZmlvX3BhbXVfbXNpX2JhbmtfdW5tYXAgKm1zaV91bm1hcCkgew0KPiA+ICsJc3Ry dWN0IHZmaW9fbXNpX2RtYSAqbWRtYSwgKm1kbWFfdG1wOw0KPiA+ICsNCj4gPiArCWxpc3RfZm9y X2VhY2hfZW50cnlfc2FmZShtZG1hLCBtZG1hX3RtcCwgJmlvbW11LT5tc2lfZG1hX2xpc3QsIG5l eHQpIHsNCj4gPiArCQlpZiAobWRtYS0+aW92YSA9PSBtc2lfdW5tYXAtPmlvdmEpIHsNCj4gPiAr CQkJdmZpb19tc2lfdW5tYXAoaW9tbXUsIG1kbWEtPmlvdmEpOw0KPiA+ICsJCQlsaXN0X2RlbCgm bWRtYS0+bmV4dCk7DQo+ID4gKwkJCWtmcmVlKG1kbWEpOw0KPiA+ICsJCQlyZXR1cm4gMDsNCj4g PiArCQl9DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJcmV0dXJuIC1FSU5WQUw7DQo+ID4gK30NCj4g PiArc3RhdGljIHZvaWQgKnZmaW9faW9tbXVfZnNsX3BhbXVfb3Blbih1bnNpZ25lZCBsb25nIGFy Zykgew0KPiA+ICsJc3RydWN0IHZmaW9faW9tbXUgKmlvbW11Ow0KPiA+ICsNCj4gPiArCWlmIChh cmcgIT0gVkZJT19GU0xfUEFNVV9JT01NVSkNCj4gPiArCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFM KTsNCj4gPiArDQo+ID4gKwlpb21tdSA9IGt6YWxsb2Moc2l6ZW9mKCppb21tdSksIEdGUF9LRVJO RUwpOw0KPiA+ICsJaWYgKCFpb21tdSkNCj4gPiArCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsN Cj4gPiArDQo+ID4gKwlJTklUX0xJU1RfSEVBRCgmaW9tbXUtPmdyb3VwX2xpc3QpOw0KPiA+ICsJ aW9tbXUtPmRtYV9saXN0ID0gUkJfUk9PVDsNCj4gPiArCUlOSVRfTElTVF9IRUFEKCZpb21tdS0+ bXNpX2RtYV9saXN0KTsNCj4gPiArCW11dGV4X2luaXQoJmlvbW11LT5sb2NrKTsNCj4gPiArDQo+ ID4gKwkvKg0KPiA+ICsJICogV2lzaCB3ZSBkaWRuJ3QgaGF2ZSB0byBrbm93IGFib3V0IGJ1c190 eXBlIGhlcmUuDQo+ID4gKwkgKi8NCj4gPiArCWlvbW11LT5kb21haW4gPSBpb21tdV9kb21haW5f YWxsb2MoJnBjaV9idXNfdHlwZSk7DQo+ID4gKwlpZiAoIWlvbW11LT5kb21haW4pIHsNCj4gPiAr CQlrZnJlZShpb21tdSk7DQo+ID4gKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7DQo+ID4gKwl9DQo+ ID4gKw0KPiA+ICsJcmV0dXJuIGlvbW11Ow0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgdm9p ZCB2ZmlvX2lvbW11X2ZzbF9wYW11X3JlbGVhc2Uodm9pZCAqaW9tbXVfZGF0YSkgew0KPiA+ICsJ c3RydWN0IHZmaW9faW9tbXUgKmlvbW11ID0gaW9tbXVfZGF0YTsNCj4gPiArCXN0cnVjdCB2Zmlv X2dyb3VwICpncm91cCwgKmdyb3VwX3RtcDsNCj4gPiArCXN0cnVjdCB2ZmlvX21zaV9kbWEgKm1k bWEsICptZG1hX3RtcDsNCj4gPiArCXN0cnVjdCByYl9ub2RlICpub2RlOw0KPiA+ICsNCj4gPiAr CWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShncm91cCwgZ3JvdXBfdG1wLCAmaW9tbXUtPmdyb3Vw X2xpc3QsIG5leHQpIHsNCj4gPiArCQlpb21tdV9kZXRhY2hfZ3JvdXAoaW9tbXUtPmRvbWFpbiwg Z3JvdXAtPmlvbW11X2dyb3VwKTsNCj4gPiArCQlsaXN0X2RlbCgmZ3JvdXAtPm5leHQpOw0KPiA+ ICsJCWtmcmVlKGdyb3VwKTsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwl3aGlsZSAoKG5vZGUgPSBy Yl9maXJzdCgmaW9tbXUtPmRtYV9saXN0KSkpIHsNCj4gPiArCQlzdHJ1Y3QgdmZpb19kbWEgKmRt YSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCB2ZmlvX2RtYSwgbm9kZSk7DQo+ID4gKwkJc2l6ZV90 IHNpemUgPSBkbWEtPnNpemU7DQo+ID4gKwkJdmZpb19yZW1vdmVfZG1hX292ZXJsYXAoaW9tbXUs IGRtYS0+aW92YSwgJnNpemUsIGRtYSk7DQo+ID4gKwkJaWYgKFdBUk5fT04oIXNpemUpKQ0KPiA+ ICsJCQlicmVhazsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3Nh ZmUobWRtYSwgbWRtYV90bXAsICZpb21tdS0+bXNpX2RtYV9saXN0LCBuZXh0KSB7DQo+ID4gKwkJ dmZpb19tc2lfdW5tYXAoaW9tbXUsIG1kbWEtPmlvdmEpOw0KPiA+ICsJCWxpc3RfZGVsKCZtZG1h LT5uZXh0KTsNCj4gPiArCQlrZnJlZShtZG1hKTsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwlpb21t dV9kb21haW5fZnJlZShpb21tdS0+ZG9tYWluKTsNCj4gPiArCWlvbW11LT5kb21haW4gPSBOVUxM Ow0KPiA+ICsJa2ZyZWUoaW9tbXUpOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgbG9uZyB2 ZmlvX2lvbW11X2ZzbF9wYW11X2lvY3RsKHZvaWQgKmlvbW11X2RhdGEsDQo+ID4gKwkJCQkgICB1 bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykgew0KPiA+ICsJc3RydWN0IHZmaW9f aW9tbXUgKmlvbW11ID0gaW9tbXVfZGF0YTsNCj4gPiArCXVuc2lnbmVkIGxvbmcgbWluc3o7DQo+ ID4gKw0KPiA+ICsJaWYgKGNtZCA9PSBWRklPX0NIRUNLX0VYVEVOU0lPTikgew0KPiA+ICsJCXN3 aXRjaCAoYXJnKSB7DQo+ID4gKwkJY2FzZSBWRklPX0ZTTF9QQU1VX0lPTU1VOg0KPiA+ICsJCQly ZXR1cm4gMTsNCj4gPiArCQlkZWZhdWx0Og0KPiA+ICsJCQlyZXR1cm4gMDsNCj4gPiArCQl9DQo+ ID4gKwl9IGVsc2UgaWYgKGNtZCA9PSBWRklPX0lPTU1VX01BUF9ETUEpIHsNCj4gPiArCQlzdHJ1 Y3QgdmZpb19pb21tdV90eXBlMV9kbWFfbWFwIG1hcDsNCj4gPiArCQl1aW50MzJfdCBtYXNrID0g VkZJT19ETUFfTUFQX0ZMQUdfUkVBRCB8DQo+ID4gKwkJCQlWRklPX0RNQV9NQVBfRkxBR19XUklU RTsNCj4gPiArDQo+ID4gKwkJbWluc3ogPSBvZmZzZXRvZmVuZChzdHJ1Y3QgdmZpb19pb21tdV90 eXBlMV9kbWFfbWFwLCBzaXplKTsNCj4gPiArDQo+ID4gKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZt YXAsICh2b2lkIF9fdXNlciAqKWFyZywgbWluc3opKQ0KPiA+ICsJCQlyZXR1cm4gLUVGQVVMVDsN Cj4gPiArDQo+ID4gKwkJaWYgKG1hcC5hcmdzeiA8IG1pbnN6IHx8IG1hcC5mbGFncyAmIH5tYXNr KQ0KPiA+ICsJCQlyZXR1cm4gLUVJTlZBTDsNCj4gPiArDQo+ID4gKwkJcmV0dXJuIHZmaW9fZG1h X2RvX21hcChpb21tdSwgJm1hcCk7DQo+ID4gKw0KPiA+ICsJfSBlbHNlIGlmIChjbWQgPT0gVkZJ T19JT01NVV9VTk1BUF9ETUEpIHsNCj4gPiArCQlzdHJ1Y3QgdmZpb19pb21tdV90eXBlMV9kbWFf dW5tYXAgdW5tYXA7DQo+ID4gKwkJbG9uZyByZXQ7DQo+ID4gKw0KPiA+ICsJCW1pbnN6ID0gb2Zm c2V0b2ZlbmQoc3RydWN0IHZmaW9faW9tbXVfdHlwZTFfZG1hX3VubWFwLCBzaXplKTsNCj4gPiAr DQo+ID4gKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1bm1hcCwgKHZvaWQgX191c2VyICopYXJnLCBt aW5zeikpDQo+ID4gKwkJCXJldHVybiAtRUZBVUxUOw0KPiA+ICsNCj4gPiArCQlpZiAodW5tYXAu YXJnc3ogPCBtaW5zeiB8fCB1bm1hcC5mbGFncykNCj4gPiArCQkJcmV0dXJuIC1FSU5WQUw7DQo+ ID4gKw0KPiA+ICsJCXJldCA9IHZmaW9fZG1hX2RvX3VubWFwKGlvbW11LCAmdW5tYXApOw0KPiA+ ICsJCWlmIChyZXQpDQo+ID4gKwkJCXJldHVybiByZXQ7DQo+ID4gKw0KPiA+ICsJCXJldHVybiBj b3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdW5tYXAsIG1pbnN6KTsNCj4gPiArCX0g ZWxzZSBpZiAoY21kID09IFZGSU9fSU9NTVVfUEFNVV9HRVRfQVRUUikgew0KPiA+ICsJCXN0cnVj dCB2ZmlvX3BhbXVfYXR0ciBwYW11X2F0dHI7DQo+ID4gKw0KPiA+ICsJCW1pbnN6ID0gb2Zmc2V0 b2ZlbmQoc3RydWN0IHZmaW9fcGFtdV9hdHRyLCBhdHRyX2luZm8pOw0KPiA+ICsJCWlmIChjb3B5 X2Zyb21fdXNlcigmcGFtdV9hdHRyLCAodm9pZCBfX3VzZXIgKilhcmcsIG1pbnN6KSkNCj4gPiAr CQkJcmV0dXJuIC1FRkFVTFQ7DQo+ID4gKw0KPiA+ICsJCWlmIChwYW11X2F0dHIuYXJnc3ogPCBt aW5zeikNCj4gPiArCQkJcmV0dXJuIC1FSU5WQUw7DQo+ID4gKw0KPiA+ICsJCXZmaW9faGFuZGxl X2dldF9hdHRyKGlvbW11LCAmcGFtdV9hdHRyKTsNCj4gPiArDQo+ID4gKwkJY29weV90b191c2Vy KCh2b2lkIF9fdXNlciAqKWFyZywgJnBhbXVfYXR0ciwgbWluc3opOw0KPiA+ICsJCXJldHVybiAw Ow0KPiA+ICsJfSBlbHNlIGlmIChjbWQgPT0gVkZJT19JT01NVV9QQU1VX1NFVF9BVFRSKSB7DQo+ ID4gKwkJc3RydWN0IHZmaW9fcGFtdV9hdHRyIHBhbXVfYXR0cjsNCj4gPiArDQo+ID4gKwkJbWlu c3ogPSBvZmZzZXRvZmVuZChzdHJ1Y3QgdmZpb19wYW11X2F0dHIsIGF0dHJfaW5mbyk7DQo+ID4g KwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwYW11X2F0dHIsICh2b2lkIF9fdXNlciAqKWFyZywgbWlu c3opKQ0KPiA+ICsJCQlyZXR1cm4gLUVGQVVMVDsNCj4gPiArDQo+ID4gKwkJaWYgKHBhbXVfYXR0 ci5hcmdzeiA8IG1pbnN6KQ0KPiA+ICsJCQlyZXR1cm4gLUVJTlZBTDsNCj4gPiArDQo+ID4gKwkJ dmZpb19oYW5kbGVfc2V0X2F0dHIoaW9tbXUsICZwYW11X2F0dHIpOw0KPiA+ICsJCXJldHVybiAw Ow0KPiA+ICsJfSBlbHNlIGlmIChjbWQgPT0gVkZJT19JT01NVV9QQU1VX0dFVF9NU0lfQkFOS19D T1VOVCkgew0KPiA+ICsJCXJldHVybiBtc2lfZ2V0X3JlZ2lvbl9jb3VudCgpOw0KPiA+ICsJfSBl bHNlIGlmIChjbWQgPT0gVkZJT19JT01NVV9QQU1VX01BUF9NU0lfQkFOSykgew0KPiA+ICsJCXN0 cnVjdCB2ZmlvX3BhbXVfbXNpX2JhbmtfbWFwIG1zaV9tYXA7DQo+ID4gKw0KPiA+ICsJCW1pbnN6 ID0gb2Zmc2V0b2ZlbmQoc3RydWN0IHZmaW9fcGFtdV9tc2lfYmFua19tYXAsIGlvdmEpOw0KPiA+ ICsJCWlmIChjb3B5X2Zyb21fdXNlcigmbXNpX21hcCwgKHZvaWQgX191c2VyICopYXJnLCBtaW5z eikpDQo+ID4gKwkJCXJldHVybiAtRUZBVUxUOw0KPiA+ICsNCj4gPiArCQlpZiAobXNpX21hcC5h cmdzeiA8IG1pbnN6KQ0KPiA+ICsJCQlyZXR1cm4gLUVJTlZBTDsNCj4gPiArDQo+ID4gKwkJdmZp b19kb19tc2lfbWFwKGlvbW11LCAmbXNpX21hcCk7DQo+ID4gKwkJcmV0dXJuIDA7DQo+ID4gKwl9 IGVsc2UgaWYgKGNtZCA9PSBWRklPX0lPTU1VX1BBTVVfVU5NQVBfTVNJX0JBTkspIHsNCj4gPiAr CQlzdHJ1Y3QgdmZpb19wYW11X21zaV9iYW5rX3VubWFwIG1zaV91bm1hcDsNCj4gPiArDQo+ID4g KwkJbWluc3ogPSBvZmZzZXRvZmVuZChzdHJ1Y3QgdmZpb19wYW11X21zaV9iYW5rX3VubWFwLCBp b3ZhKTsNCj4gPiArCQlpZiAoY29weV9mcm9tX3VzZXIoJm1zaV91bm1hcCwgKHZvaWQgX191c2Vy ICopYXJnLCBtaW5zeikpDQo+ID4gKwkJCXJldHVybiAtRUZBVUxUOw0KPiA+ICsNCj4gPiArCQlp ZiAobXNpX3VubWFwLmFyZ3N6IDwgbWluc3opDQo+ID4gKwkJCXJldHVybiAtRUlOVkFMOw0KPiA+ ICsNCj4gPiArCQl2ZmlvX2RvX21zaV91bm1hcChpb21tdSwgJm1zaV91bm1hcCk7DQo+ID4gKwkJ cmV0dXJuIDA7DQo+ID4gKw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJldHVybiAtRU5PVFRZOw0K PiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50IHZmaW9faW9tbXVfZnNsX3BhbXVfYXR0YWNo X2dyb3VwKHZvaWQgKmlvbW11X2RhdGEsDQo+ID4gKwkJCQkJIHN0cnVjdCBpb21tdV9ncm91cCAq aW9tbXVfZ3JvdXApIHsNCj4gPiArCXN0cnVjdCB2ZmlvX2lvbW11ICppb21tdSA9IGlvbW11X2Rh dGE7DQo+ID4gKwlzdHJ1Y3QgdmZpb19ncm91cCAqZ3JvdXAsICp0bXA7DQo+ID4gKwlpbnQgcmV0 Ow0KPiA+ICsNCj4gPiArCWdyb3VwID0ga3phbGxvYyhzaXplb2YoKmdyb3VwKSwgR0ZQX0tFUk5F TCk7DQo+ID4gKwlpZiAoIWdyb3VwKQ0KPiA+ICsJCXJldHVybiAtRU5PTUVNOw0KPiA+ICsNCj4g PiArCW11dGV4X2xvY2soJmlvbW11LT5sb2NrKTsNCj4gPiArDQo+ID4gKwlsaXN0X2Zvcl9lYWNo X2VudHJ5KHRtcCwgJmlvbW11LT5ncm91cF9saXN0LCBuZXh0KSB7DQo+ID4gKwkJaWYgKHRtcC0+ aW9tbXVfZ3JvdXAgPT0gaW9tbXVfZ3JvdXApIHsNCj4gPiArCQkJbXV0ZXhfdW5sb2NrKCZpb21t dS0+bG9jayk7DQo+ID4gKwkJCWtmcmVlKGdyb3VwKTsNCj4gPiArCQkJcmV0dXJuIC1FSU5WQUw7 DQo+ID4gKwkJfQ0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJldCA9IGlvbW11X2F0dGFjaF9ncm91 cChpb21tdS0+ZG9tYWluLCBpb21tdV9ncm91cCk7DQo+ID4gKwlpZiAocmV0KSB7DQo+ID4gKwkJ bXV0ZXhfdW5sb2NrKCZpb21tdS0+bG9jayk7DQo+ID4gKwkJa2ZyZWUoZ3JvdXApOw0KPiA+ICsJ CXJldHVybiByZXQ7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJZ3JvdXAtPmlvbW11X2dyb3VwID0g aW9tbXVfZ3JvdXA7DQo+ID4gKwlsaXN0X2FkZCgmZ3JvdXAtPm5leHQsICZpb21tdS0+Z3JvdXBf bGlzdCk7DQo+ID4gKw0KPiA+ICsJbXV0ZXhfdW5sb2NrKCZpb21tdS0+bG9jayk7DQo+ID4gKw0K PiA+ICsJcmV0dXJuIDA7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyB2b2lkIHZmaW9faW9t bXVfZnNsX3BhbXVfZGV0YWNoX2dyb3VwKHZvaWQgKmlvbW11X2RhdGEsDQo+ID4gKwkJCQkJICBz dHJ1Y3QgaW9tbXVfZ3JvdXAgKmlvbW11X2dyb3VwKSB7DQo+ID4gKwlzdHJ1Y3QgdmZpb19pb21t dSAqaW9tbXUgPSBpb21tdV9kYXRhOw0KPiA+ICsJc3RydWN0IHZmaW9fZ3JvdXAgKmdyb3VwOw0K PiA+ICsNCj4gPiArCW11dGV4X2xvY2soJmlvbW11LT5sb2NrKTsNCj4gPiArDQo+ID4gKwlsaXN0 X2Zvcl9lYWNoX2VudHJ5KGdyb3VwLCAmaW9tbXUtPmdyb3VwX2xpc3QsIG5leHQpIHsNCj4gPiAr CQlpZiAoZ3JvdXAtPmlvbW11X2dyb3VwID09IGlvbW11X2dyb3VwKSB7DQo+ID4gKwkJCWlvbW11 X2RldGFjaF9ncm91cChpb21tdS0+ZG9tYWluLCBpb21tdV9ncm91cCk7DQo+ID4gKwkJCWxpc3Rf ZGVsKCZncm91cC0+bmV4dCk7DQo+ID4gKwkJCWtmcmVlKGdyb3VwKTsNCj4gPiArCQkJYnJlYWs7 DQo+ID4gKwkJfQ0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCW11dGV4X3VubG9jaygmaW9tbXUtPmxv Y2spOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHZmaW9faW9tbXVf ZHJpdmVyX29wcyB2ZmlvX2lvbW11X2RyaXZlcl9vcHNfZnNsX3BhbXUgPSB7DQo+ID4gKwkubmFt ZQkJPSAidmZpby1pb21tdS1mc2xfcGFtdSIsDQo+ID4gKwkub3duZXIJCT0gVEhJU19NT0RVTEUs DQo+ID4gKwkub3BlbgkJPSB2ZmlvX2lvbW11X2ZzbF9wYW11X29wZW4sDQo+ID4gKwkucmVsZWFz ZQk9IHZmaW9faW9tbXVfZnNsX3BhbXVfcmVsZWFzZSwNCj4gPiArCS5pb2N0bAkJPSB2ZmlvX2lv bW11X2ZzbF9wYW11X2lvY3RsLA0KPiA+ICsJLmF0dGFjaF9ncm91cAk9IHZmaW9faW9tbXVfZnNs X3BhbXVfYXR0YWNoX2dyb3VwLA0KPiA+ICsJLmRldGFjaF9ncm91cAk9IHZmaW9faW9tbXVfZnNs X3BhbXVfZGV0YWNoX2dyb3VwLA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArc3RhdGljIGludCBfX2lu aXQgdmZpb19pb21tdV9mc2xfcGFtdV9pbml0KHZvaWQpIHsNCj4gPiArCWlmICghaW9tbXVfcHJl c2VudCgmcGNpX2J1c190eXBlKSkNCj4gPiArCQlyZXR1cm4gLUVOT0RFVjsNCj4gPiArDQo+ID4g KwlyZXR1cm4gdmZpb19yZWdpc3Rlcl9pb21tdV9kcml2ZXIoJnZmaW9faW9tbXVfZHJpdmVyX29w c19mc2xfcGFtdSk7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyB2b2lkIF9fZXhpdCB2Zmlv X2lvbW11X2ZzbF9wYW11X2NsZWFudXAodm9pZCkgew0KPiA+ICsJdmZpb191bnJlZ2lzdGVyX2lv bW11X2RyaXZlcigmdmZpb19pb21tdV9kcml2ZXJfb3BzX2ZzbF9wYW11KTsNCj4gPiArfQ0KPiA+ ICsNCj4gPiArbW9kdWxlX2luaXQodmZpb19pb21tdV9mc2xfcGFtdV9pbml0KTsNCj4gPiArbW9k dWxlX2V4aXQodmZpb19pb21tdV9mc2xfcGFtdV9jbGVhbnVwKTsNCj4gPiArDQo+ID4gK01PRFVM RV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsNCj4gPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIp Ow0KPiA+ICtNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOw0KPiA+ICtNT0RVTEVfREVTQ1JJ UFRJT04oRFJJVkVSX0RFU0MpOw0KPiA+IGRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgv dmZpby5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3ZmaW8uaA0KPiA+IGluZGV4IDBmZDQ3ZjUuLmQz NTkwNTUgMTAwNjQ0DQo+ID4gLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3ZmaW8uaA0KPiA+ICsr KyBiL2luY2x1ZGUvdWFwaS9saW51eC92ZmlvLmgNCj4gPiBAQCAtMjMsNiArMjMsNyBAQA0KPiA+ DQo+ID4gICNkZWZpbmUgVkZJT19UWVBFMV9JT01NVQkJMQ0KPiA+ICAjZGVmaW5lIFZGSU9fU1BB UFJfVENFX0lPTU1VCQkyDQo+ID4gKyNkZWZpbmUgVkZJT19GU0xfUEFNVV9JT01NVQkJMw0KPiA+ DQo+ID4gIC8qDQo+ID4gICAqIFRoZSBJT0NUTCBpbnRlcmZhY2UgaXMgZGVzaWduZWQgZm9yIGV4 dGVuc2liaWxpdHkgYnkgZW1iZWRkaW5nIHRoZQ0KPiA+IEBAIC00NTEsNCArNDUyLDEwMyBAQCBz dHJ1Y3QgdmZpb19pb21tdV9zcGFwcl90Y2VfaW5mbyB7DQo+ID4NCj4gPiAgLyogKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioN Cj4gPiAqLw0KPiA+DQo+ID4gKy8qKioqKioqKioqKiBBUElzIGZvciBWRklPX1BBTVUgdHlwZSBv bmx5ICoqKioqKioqKioqKioqKiovDQo+ID4gKy8qDQo+ID4gKyAqIFZGSU9fSU9NTVVfUEFNVV9H RVRfQVRUUiAtIF9JTyhWRklPX1RZUEUsIFZGSU9fQkFTRSArIDE3LA0KPiA+ICsgKgkJCQkgIHN0 cnVjdCB2ZmlvX3BhbXVfYXR0cikNCj4gPiArICoNCj4gPiArICogR2V0cyB0aGUgaW9tbXUgYXR0 cmlidXRlcyBmb3IgdGhlIGN1cnJlbnQgdmZpbyBjb250YWluZXIuDQo+ID4gKyAqIENhbGxlciBz ZXRzIGFyZ3N6IGFuZCBhdHRyaWJ1dGUuICBUaGUgaW9jdGwgZmlsbHMgaW4NCj4gPiArICogdGhl IHByb3ZpZGVkIHN0cnVjdCB2ZmlvX3BhbXVfYXR0ciBiYXNlZCBvbiB0aGUgYXR0cmlidXRlDQo+ ID4gKyAqIHZhbHVlIHRoYXQgd2FzIHNldC4NCj4gPiArICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Ms IC1lcnJubyBvbiBmYWlsdXJlICAqLyBzdHJ1Y3QgdmZpb19wYW11X2F0dHINCj4gPiArew0KPiA+ ICsJX191MzIJYXJnc3o7DQo+ID4gKwlfX3UzMglmbGFnczsJLyogbm8gZmxhZ3MgY3VycmVudGx5 ICovDQo+ID4gKyNkZWZpbmUgVkZJT19BVFRSX0dFT01FVFJZCTANCj4gPiArI2RlZmluZSBWRklP X0FUVFJfV0lORE9XUwkxDQo+ID4gKyNkZWZpbmUgVkZJT19BVFRSX1BBTVVfU1RBU0gJMg0KPiA+ ICsJX191MzIJYXR0cmlidXRlOw0KPiA+ICsNCj4gPiArCXVuaW9uIHsNCj4gPiArCQkvKiBWRklP X0FUVFJfR0VPTUVUUlkgKi8NCj4gPiArCQlzdHJ1Y3Qgew0KPiA+ICsJCQkvKiBmaXJzdCBhZGRy IHRoYXQgY2FuIGJlIG1hcHBlZCAqLw0KPiA+ICsJCQlfX3U2NCBhcGVydHVyZV9zdGFydDsNCj4g PiArCQkJLyogbGFzdCBhZGRyIHRoYXQgY2FuIGJlIG1hcHBlZCAqLw0KPiA+ICsJCQlfX3U2NCBh cGVydHVyZV9lbmQ7DQo+ID4gKwkJfSBhdHRyOw0KPiA+ICsNCj4gPiArCQkvKiBWRklPX0FUVFJf V0lORE9XUyAqLw0KPiA+ICsJCV9fdTMyIHdpbmRvd3M7ICAvKiBudW1iZXIgb2Ygd2luZG93cyBp biB0aGUgYXBlcnR1cmUNCj4gPiArCQkJCSAqIGluaXRpYWxseSB0aGlzIHdpbGwgYmUgdGhlIG1h eCBudW1iZXINCj4gPiArCQkJCSAqIG9mIHdpbmRvd3MgdGhhdCBjYW4gYmUgc2V0DQo+ID4gKwkJ CQkgKi8NCj4gPiArCQkvKiBWRklPX0FUVFJfUEFNVV9TVEFTSCAqLw0KPiA+ICsJCXN0cnVjdCB7 DQo+ID4gKwkJCV9fdTMyIGNwdTsJLyogQ1BVIG51bWJlciBmb3Igc3Rhc2hpbmcgKi8NCj4gPiAr CQkJX191MzIgY2FjaGU7CS8qIGNhY2hlIElEIGZvciBzdGFzaGluZyAqLw0KPiA+ICsJCX0gc3Rh c2g7DQo+ID4gKwl9IGF0dHJfaW5mbzsNCj4gPiArfTsNCj4gPiArI2RlZmluZSBWRklPX0lPTU1V X1BBTVVfR0VUX0FUVFIgIF9JTyhWRklPX1RZUEUsIFZGSU9fQkFTRSArIDE3KQ0KPiA+ICsNCj4g PiArLyoNCj4gPiArICogVkZJT19JT01NVV9QQU1VX1NFVF9BVFRSIC0gX0lPKFZGSU9fVFlQRSwg VkZJT19CQVNFICsgMTgsDQo+ID4gKyAqCQkJCSAgc3RydWN0IHZmaW9fcGFtdV9hdHRyKQ0KPiA+ ICsgKg0KPiA+ICsgKiBTZXRzIHRoZSBpb21tdSBhdHRyaWJ1dGVzIGZvciB0aGUgY3VycmVudCB2 ZmlvIGNvbnRhaW5lci4NCj4gPiArICogQ2FsbGVyIHNldHMgc3RydWN0IHZmaW9fcGFtdSBhdHRy LCBpbmNsdWRpbmcgYXJnc3ogYW5kIGF0dHJpYnV0ZQ0KPiA+ICthbmQNCj4gPiArICogc2V0dGlu ZyBhbnkgZmllbGRzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGUgYXR0cmlidXRlLg0KPiA+ICsgKiBS ZXR1cm46IDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUgICovICNkZWZpbmUNCj4gPiAr VkZJT19JT01NVV9QQU1VX1NFVF9BVFRSICBfSU8oVkZJT19UWVBFLCBWRklPX0JBU0UgKyAxOCkN Cj4gPiArDQo+ID4gKy8qDQo+ID4gKyAqIFZGSU9fSU9NTVVfUEFNVV9HRVRfTVNJX0JBTktfQ09V TlQgLSBfSU8oVkZJT19UWVBFLCBWRklPX0JBU0UgKw0KPiA+ICsxOSwgX191MzIpDQo+ID4gKyAq DQo+ID4gKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBNU0kgYmFua3MgZm9yIHRoaXMgcGxhdGZv cm0uICBUaGlzIHRlbGxzDQo+ID4gK3VzZXIgc3BhY2UNCj4gPiArICogaG93IG1hbnkgYXBlcnR1 cmUgd2luZG93cyBzaG91bGQgYmUgcmVzZXJ2ZWQgZm9yIE1TSSBiYW5rcyB3aGVuDQo+ID4gK3Nl dHRpbmcNCj4gPiArICogdGhlIFBBTVUgZ2VvbWV0cnkgYW5kIHdpbmRvdyBjb3VudC4NCj4gPiAr ICogUmV0dXJuOiBfX3UzMiBiYW5rIGNvdW50IG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJl ICAqLyAjZGVmaW5lDQo+ID4gK1ZGSU9fSU9NTVVfUEFNVV9HRVRfTVNJX0JBTktfQ09VTlQgX0lP KFZGSU9fVFlQRSwgVkZJT19CQVNFICsgMTkpDQo+ID4gKw0KPiA+ICsvKg0KPiA+ICsgKiBWRklP X0lPTU1VX1BBTVVfTUFQX01TSV9CQU5LIC0gX0lPKFZGSU9fVFlQRSwgVkZJT19CQVNFICsgMjAs DQo+ID4gKyAqCQkJCSAgICAgIHN0cnVjdCB2ZmlvX3BhbXVfbXNpX2JhbmtfbWFwKQ0KPiA+ICsg Kg0KPiA+ICsgKiBNYXBzIHRoZSBNU0kgYmFuayBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGFuZCBp b3ZhLiAgVXNlciBzcGFjZQ0KPiA+ICttdXN0DQo+ID4gKyAqIGNhbGwgdGhpcyBpb2N0bCBvbmNl IGZvciBlYWNoIE1TSSBiYW5rIChjb3VudCBvZiBiYW5rcyBpcyByZXR1cm5lZA0KPiA+ICtieQ0K PiA+ICsgKiBWRklPX0lPTU1VX1BBTVVfR0VUX01TSV9CQU5LX0NPVU5UKS4NCj4gPiArICogQ2Fs bGVyIHByb3ZpZGVzIHN0cnVjdCB2ZmlvX3BhbXVfbXNpX2JhbmtfbWFwIHdpdGggYWxsIGZpZWxk cyBzZXQuDQo+ID4gKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZSAg Ki8NCj4gPiArDQo+ID4gK3N0cnVjdCB2ZmlvX3BhbXVfbXNpX2JhbmtfbWFwIHsNCj4gPiArCV9f dTMyCWFyZ3N6Ow0KPiA+ICsJX191MzIJZmxhZ3M7CQkvKiBubyBmbGFncyBjdXJyZW50bHkgKi8N Cj4gPiArCV9fdTMyCW1zaV9iYW5rX2luZGV4OwkvKiB0aGUgaW5kZXggb2YgdGhlIE1TSSBiYW5r ICovDQo+ID4gKwlfX3U2NAlpb3ZhOwkJLyogdGhlIGlvdmEgdGhlIGJhbmsgaXMgdG8gYmUgbWFw cGVkIHRvICovDQo+ID4gK307DQo+ID4gKyNkZWZpbmUgVkZJT19JT01NVV9QQU1VX01BUF9NU0lf QkFOSyAgX0lPKFZGSU9fVFlQRSwgVkZJT19CQVNFICsgMjApDQo+ID4gKw0KPiA+ICsvKg0KPiA+ ICsgKiBWRklPX0lPTU1VX1BBTVVfVU5NQVBfTVNJX0JBTksgLSBfSU8oVkZJT19UWVBFLCBWRklP X0JBU0UgKyAyMSwNCj4gPiArICoJCQkJCXN0cnVjdCB2ZmlvX3BhbXVfbXNpX2JhbmtfdW5tYXAp DQo+ID4gKyAqDQo+ID4gKyAqIFVubWFwcyB0aGUgTVNJIGJhbmsgYXQgdGhlIHNwZWNpZmllZCBp b3ZhLg0KPiA+ICsgKiBDYWxsZXIgcHJvdmlkZXMgc3RydWN0IHZmaW9fcGFtdV9tc2lfYmFua191 bm1hcCB3aXRoIGFsbCBmaWVsZHMgc2V0Lg0KPiA+ICsgKiBPcGVyYXRlcyBvbiBWRklPIGZpbGUg ZGVzY3JpcHRvciAoL2Rldi92ZmlvL3ZmaW8pLg0KPiA+ICsgKiBSZXR1cm46IDAgb24gc3VjY2Vz cywgLWVycm5vIG9uIGZhaWx1cmUgICovDQo+ID4gKw0KPiA+ICtzdHJ1Y3QgdmZpb19wYW11X21z aV9iYW5rX3VubWFwIHsNCj4gPiArCV9fdTMyCWFyZ3N6Ow0KPiA+ICsJX191MzIJZmxhZ3M7CS8q IG5vIGZsYWdzIGN1cnJlbnRseSAqLw0KPiA+ICsJX191NjQJaW92YTsJLyogdGhlIGlvdmEgdG8g YmUgdW5tYXBwZWQgdG8gKi8NCj4gPiArfTsNCj4gPiArI2RlZmluZSBWRklPX0lPTU1VX1BBTVVf VU5NQVBfTVNJX0JBTksgIF9JTyhWRklPX1RZUEUsIFZGSU9fQkFTRSArDQo+ID4gKzIxKQ0KPiA+ ICsNCj4gPiAgI2VuZGlmIC8qIF9VQVBJVkZJT19IICovDQo+IA0KPiANCj4gDQoNCg==