From mboxrd@z Thu Jan 1 00:00:00 1970 From: Arnaud Pouliquen Subject: Re: [PATCH v4 09/12] IIO: ADC: add stm32 DFSDM support for PDM microphone Date: Fri, 24 Nov 2017 15:52:26 +0100 Message-ID: <4362763f-2182-a3cf-cbd6-6c71df59af52@st.com> References: <1510222354-15290-1-git-send-email-arnaud.pouliquen@st.com> <1510222354-15290-10-git-send-email-arnaud.pouliquen@st.com> <20171119141830.29f1cfc9@archlinux> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20171119141830.29f1cfc9@archlinux> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: Jonathan Cameron Cc: Mark Rutland , "devicetree@vger.kernel.org" , "alsa-devel@alsa-project.org" , Lars-Peter Clausen , Maxime Coquelin , Liam Girdwood , "linux-iio@vger.kernel.org" , Mark Brown , Takashi Iwai , Rob Herring , Peter Meerwald-Stadler , Hartmut Knaack , "linux-arm-kernel@lists.infradead.org" , Alexandre TORGUE List-Id: devicetree@vger.kernel.org CgpPbiAxMS8xOS8yMDE3IDAzOjE4IFBNLCBKb25hdGhhbiBDYW1lcm9uIHdyb3RlOgo+IE9uIFRo dSwgOSBOb3YgMjAxNyAxMToxMjozMSArMDEwMAo+IEFybmF1ZCBQb3VsaXF1ZW4gPGFybmF1ZC5w b3VsaXF1ZW5Ac3QuY29tPiB3cm90ZToKPiAKPj4gVGhpcyBjb2RlIG9mZmVycyBhIHdheSB0byBo YW5kbGUgUERNIGF1ZGlvIG1pY3JvcGhvbmVzIGluCj4+IEFTT0MgZnJhbWV3b3JrLiBBdWRpbyBk cml2ZXIgc2hvdWxkIHVzZSBjb25zdW1lciBBUEkuCj4+IEEgc3BlY2lmaWMgbWFuYWdlbWVudCBp cyBpbXBsZW1lbnRlZCBmb3IgRE1BLCB3aXRoIGEKPj4gY2FsbGJhY2ssIHRvIGFsbG93cyB0byBo YW5kbGUgYXVkaW8gYnVmZmVycyBlZmZpY2llbnRseS4KPj4gCj4+IFNpZ25lZC1vZmYtYnk6IEFy bmF1ZCBQb3VsaXF1ZW4gPGFybmF1ZC5wb3VsaXF1ZW5Ac3QuY29tPgo+IAo+IEEgZmV3IG1pbm9y IHBvaW50cyBpbmxpbmUuwqAgSSdtIG5vdCBzdXJlIEkgcmVhbGx5ICdsaWtlJyB0aGUKPiBzb2x1 dGlvbiB3ZSd2ZSBlbmRlZCB1cCB3aXRoIGN1cnJlbnRseSBidXQgaWYgaXQgd29ya3MgaXQgd2ls bAo+IGRvIGp1c3QgZmluZSBmb3Igbm93IDopCj4gCj4gSm9uYXRoYW4KPiAKPiAKPj4gLS0tCj4+ IFYzIC0+IFY0IGNoYW5nZXM6Cj4+wqAgLSBNZXJnZSBhdWRpbyBpbXBsZW1lbnRhdGlvbiBpbiBz dG0zMi1kZnNkbS1hZGMuYyBpbnN0ZWFkIG9mIGNyZWF0aW5nIHNlcGFyYXRlIGZpbGUKPj7CoCAt IEFkZCBzeXNmcyBkb2N1bWVudCBmb3IgZXhwb3J0ZWQgYXR0cmlidXRlcwo+PiAKPj7CoCAuLi4v QUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLWlpby1kZnNkbS1hZGMtc3RtMzLCoMKgwqDCoMKgIHzCoCAy MiArCj4+wqAgZHJpdmVycy9paW8vYWRjL3N0bTMyLWRmc2RtLWFkYy5jwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB8IDUxNyArKysrKysrKysrKysrKysrKysrKy0KPj7CoCBpbmNs dWRlL2xpbnV4L2lpby9hZGMvc3RtMzItZGZzZG0tYWRjLmjCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHzCoCAyNyArKwo+PsKgIDMgZmlsZXMgY2hhbmdlZCwgNTYyIGluc2VydGlvbnMoKyksIDQgZGVs ZXRpb25zKC0pCj4+wqAgY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3VtZW50YXRpb24vQUJJL3Rlc3Rp bmcvc3lzZnMtYnVzLWlpby1kZnNkbS1hZGMtc3RtMzIKPj7CoCBjcmVhdGUgbW9kZSAxMDA2NDQg aW5jbHVkZS9saW51eC9paW8vYWRjL3N0bTMyLWRmc2RtLWFkYy5oCj4+IAo+PiBkaWZmIC0tZ2l0 IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtaWlvLWRmc2RtLWFkYy1zdG0z MiBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLWlpby1kZnNkbS1hZGMtc3Rt MzIKPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4gaW5kZXggMDAwMDAwMC4uMGNlNTUwOAo+PiAt LS0gL2Rldi9udWxsCj4+ICsrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVz LWlpby1kZnNkbS1hZGMtc3RtMzIKPj4gQEAgLTAsMCArMSwyMiBAQAo+PiArV2hhdDrCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgv aW5fdm9sdGFnZV9hdWRpb19zYW1wbGluZ19yYXRlCj4+ICtLZXJuZWxWZXJzaW9uOsKgwqDCoMKg wqDCoCA0LjE0Cj4+ICtDb250YWN0OsKgwqDCoMKgIGFybmF1ZC5wb3VsaXF1ZW5Ac3QuY29tCj4+ ICtEZXNjcmlwdGlvbjoKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBGb3IgYXVkaW8gcHVy cG9zZSBvbmx5Lgo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFVzZWQgYnkgYXVkaW8gZHJp dmVyIHRvIHNldC9nZXQgdGhlIGF1ZGlvIHNhbXBsaW5nIHJhdGUuCj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgUmVhZGluZyByZXR1cm5zIGN1cnJlbnQgYXVkaW8gc2FtcGxlIGZyZXF1ZW5j eS4KPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBXcml0aW5nIHZhbHVlIGJlZm9yZSBzdGFy dGluZyBjb252ZXJzaW9ucy4KPiAKPiBJIHdvdWxkIGxpa2UgdG8gc2VlIGEgbm90ZSBoZXJlIG9u IHdoeSBzYW1wbGluZ19mcmVxdWVuY3kgY2FuJ3QgYmUgdXNlZCBmb3IKPiB0aGlzIHB1cnBvc2Uu ClRoZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUSBjYW4gbm90IGJlIHVzZWQgYmVjYXVzZSBjb25z dW1lciBBUEkgYWxsb3dzCm9ubHkgdG8gYWNjZXNzIHRvIGV4dF9pbmZvIGF0dHJpYnV0ZXMuCkFu IGFsdGVybmF0ZSBpcyB0byBleHBvcnQgY2hhbm5lbCBhdHRyaWJ1dGUgZnVuY3Rpb25zIHRoZSBj b25zdW1lciBBUEkuCi0gaWlvX3JlYWRfY2hhbm5lbF9hdHRyaWJ1dGUgKGFscmVhZHkgZXhpc3Qp Ci0gaWlvX3dyaXRlX2NoYW5uZWxfYXR0cmlidXRlCgpQbGVhc2UsIHRlbGwgbWUgeW91ciBwcmVm ZXJlbmNlLgo+IAo+PiArCj4+ICtXaGF0OsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAv c3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl92b2x0YWdlX3NwaV9jbGtfZnJlcQo+ PiArS2VybmVsVmVyc2lvbjrCoMKgwqDCoMKgwqAgNC4xNAo+PiArQ29udGFjdDrCoMKgwqDCoCBh cm5hdWQucG91bGlxdWVuQHN0LmNvbQo+PiArRGVzY3JpcHRpb246Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgRm9yIGF1ZGlvIHB1cnBvc2Ugb25seS4KPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBVc2VkIGJ5IGF1ZGlvIGRyaXZlciB0byBzZXQvZ2V0IHRoZSBzcGkgaW5wdXQgZnJl cXVlbmN5Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgd2hlbiBERlNETSBTUEkgaW5wdXQg Y2hhbm5lbCBpcyBpbiBzbGF2ZSBtb2RlLgo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlm IERGU0RNIGlucHV0IGlzIFNQSSBtYXN0ZXIKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgUmVhZGluZ8KgIDAsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGVycm9yIG9uIHdyaXRpbmcKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBJZiBERlNETSBpbnB1dCBpcyBTUEkgU2xhdmU6Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgUmVhZGluZyByZXR1cm5zIHZhbHVlIHByZXZpb3VzbHkgc2V0Lgo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIFdyaXRpbmcgdmFsdWUgYmVmb3JlIHN0YXJ0aW5nIGNvbnZlcnNpb25z Lgo+IAo+IEknZCBsaWtlIGEgYnJpZWYgbm90ZSBoZXJlIG9uIHdoeSB3ZSBtaWdodCBjaGFuZ2Ug dGhpcyBhdCBydW50aW1lLgpTdXJlLCBpIHdpbGwgYWRkIGl0LCBvdXRwdXQgYXVkaW8gc2FtcGxl IGZyZXF1ZW5jeSBpcyBjb21wdXRlZCBmcm9tIHRoZQpTUElfY2xvY2sgYnVzLiBVc2VyIGNhbiBu ZWVkIHRvIGNoYW5nZSBpdCBkZXBlbmRpbmcgb24gdGhlIEF1ZGlvCmZyZXF1ZW5jeSBjb25maWd1 cmVkIGZvciB0aGUgYXVkaW8gY2FyZC4gVGhpcyBjb25maWd1cmF0aW9uIG9jY3VycyBhZnRlcgph dWRpbyBkcml2ZXIgcHJvYmluZy4KPiAKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9z dG0zMi1kZnNkbS1hZGMuYyBiL2RyaXZlcnMvaWlvL2FkYy9zdG0zMi1kZnNkbS1hZGMuYwo+PiBp bmRleCBmOTQxOWFiLi5mMDk1MmUyNiAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9paW8vYWRjL3N0 bTMyLWRmc2RtLWFkYy5jCj4+ICsrKyBiL2RyaXZlcnMvaWlvL2FkYy9zdG0zMi1kZnNkbS1hZGMu Ywo+PiBAQCAtMTksMTEgKzE5LDE1IEBACj4+wqDCoCAqIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBz ZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lgo+PsKgwqAgKi8KPj7CoCAKPj4gKyNp bmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGlu Zy5oPgo+PsKgICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KPj7CoCAjaW5jbHVkZSA8bGlu dXgvaWlvL2J1ZmZlci5oPgo+PsKgICNpbmNsdWRlIDxsaW51eC9paW8vaHctY29uc3VtZXIuaD4K Pj7CoCAjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgo+PsKgICNpbmNsdWRlIDxsaW51eC9paW8v c3lzZnMuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgo+PiAr I2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmg+Cj4+wqAgI2luY2x1ZGUgPGxp bnV4L21vZHVsZS5oPgo+PsKgICNpbmNsdWRlIDxsaW51eC9vZi5oPgo+PsKgICNpbmNsdWRlIDxs aW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPj4gQEAgLTMyLDYgKzM2LDggQEAKPj7CoCAKPj7CoCAj aW5jbHVkZSAic3RtMzItZGZzZG0uaCIKPj7CoCAKPj4gKyNkZWZpbmUgREZTRE1fRE1BX0JVRkZF Ul9TSVpFICg0ICogUEFHRV9TSVpFKQo+PiArCj4+wqAgLyogQ29udmVyc2lvbiB0aW1lb3V0ICov Cj4+wqAgI2RlZmluZSBERlNETV9USU1FT1VUX1VTIDEwMDAwMAo+PsKgICNkZWZpbmUgREZTRE1f VElNRU9VVCAobXNlY3NfdG9famlmZmllcyhERlNETV9USU1FT1VUX1VTIC8gMTAwMCkpCj4+IEBA IC03MSw2ICs3NywxOCBAQCBzdHJ1Y3Qgc3RtMzJfZGZzZG1fYWRjIHsKPj7CoMKgwqDCoMKgwqDC oCBzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOwo+PsKgwqDCoMKgwqDCoMKgIHUzMiAqYnVm ZmVyOwo+PsKgIAo+PiArwqDCoMKgwqAgLyogQXVkaW8gc3BlY2lmaWMgKi8KPj4gK8KgwqDCoMKg IHVuc2lnbmVkIGludCBzcGlfZnJlcTvCoCAvKiBTUEkgYnVzIGNsb2NrIGZyZXF1ZW5jeSAqLwo+ PiArwqDCoMKgwqAgdW5zaWduZWQgaW50IHNhbXBsZV9mcmVxOyAvKiBTYW1wbGUgZnJlcXVlbmN5 IGFmdGVyIGZpbHRlciBkZWNpbWF0aW9uICovCj4+ICvCoMKgwqDCoCBpbnQgKCpjYikoY29uc3Qg dm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKmNiX3ByaXYpOwo+PiArwqDCoMKgwqAgdm9p ZCAqY2JfcHJpdjsKPj4gKwo+PiArwqDCoMKgwqAgLyogRE1BICovCj4+ICvCoMKgwqDCoCB1OCAq cnhfYnVmOwo+PiArwqDCoMKgwqAgdW5zaWduZWQgaW50IGJ1Zmk7IC8qIEJ1ZmZlciBjdXJyZW50 IHBvc2l0aW9uICovCj4+ICvCoMKgwqDCoCB1bnNpZ25lZCBpbnQgYnVmX3N6OyAvKiBCdWZmZXIg c2l6ZSAqLwo+PiArwqDCoMKgwqAgc3RydWN0IGRtYV9jaGFuICpkbWFfY2hhbjsKPj4gK8KgwqDC oMKgIGRtYV9hZGRyX3QgZG1hX2J1ZjsKPj7CoCB9Owo+PsKgIAo+PsKgIHN0cnVjdCBzdG0zMl9k ZnNkbV9zdHIyZmllbGQgewo+PiBAQCAtMzY0LDEwICszODIsMTEwIEBAIGludCBzdG0zMl9kZnNk bV9jaGFubmVsX3BhcnNlX29mKHN0cnVjdCBzdG0zMl9kZnNkbSAqZGZzZG0sCj4+wqDCoMKgwqDC oMKgwqAgcmV0dXJuIDA7Cj4+wqAgfQo+PsKgIAo+PiArc3RhdGljIHNzaXplX3QgZGZzZG1fYWRj X2F1ZGlvX2dldF9yYXRlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgdWludHB0cl90IHByaXYsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29uc3Qgc3RydWN0IGlp b19jaGFuX3NwZWMgKmNoYW4sCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2hhciAqYnVmKQo+PiArewo+ PiArwqDCoMKgwqAgc3RydWN0IHN0bTMyX2Rmc2RtX2FkYyAqYWRjID0gaWlvX3ByaXYoaW5kaW9f ZGV2KTsKPj4gKwo+PiArwqDCoMKgwqAgcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAi JWRcbiIsIGFkYy0+c2FtcGxlX2ZyZXEpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgc3NpemVfdCBk ZnNkbV9hZGNfYXVkaW9fc2V0X3JhdGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB1aW50cHRyX3QgcHJpdiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb25zdCBz dHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb25zdCBjaGFy ICpidWYsIHNpemVfdCBsZW4pCj4+ICt7Cj4+ICvCoMKgwqDCoCBzdHJ1Y3Qgc3RtMzJfZGZzZG1f YWRjICphZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOwo+PiArwqDCoMKgwqAgc3RydWN0IHN0bTMy X2Rmc2RtX2ZpbHRlciAqZmwgPSAmYWRjLT5kZnNkbS0+ZmxfbGlzdFthZGMtPmZsX2lkXTsKPj4g K8KgwqDCoMKgIHN0cnVjdCBzdG0zMl9kZnNkbV9jaGFubmVsICpjaCA9ICZhZGMtPmRmc2RtLT5j aF9saXN0W2FkYy0+Y2hfaWRdOwo+PiArwqDCoMKgwqAgdW5zaWduZWQgaW50IHNwaV9mcmVxID0g YWRjLT5zcGlfZnJlcTsKPj4gK8KgwqDCoMKgIHVuc2lnbmVkIGludCBzYW1wbGVfZnJlcTsKPj4g K8KgwqDCoMKgIGludCByZXQ7Cj4+ICsKPj4gK8KgwqDCoMKgIHJldCA9IGtzdHJ0b2ludChidWYs IDAsICZzYW1wbGVfZnJlcSk7Cj4+ICvCoMKgwqDCoCBpZiAocmV0KQo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+ICvCoMKgwqDCoCBkZXZfZGJnKCZpbmRpb19kZXYt PmRldiwgIlJlcXVlc3RlZCBzYW1wbGVfZnJlcSA6JWRcbiIsIHNhbXBsZV9mcmVxKTsKPj4gKwo+ PiArwqDCoMKgwqAgaWYgKCFzYW1wbGVfZnJlcSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCByZXR1cm4gLUVJTlZBTDsKPj4gKwo+PiArwqDCoMKgwqAgaWYgKGNoLT5zcmMgIT0gREZTRE1f Q0hBTk5FTF9TUElfQ0xPQ0tfRVhURVJOQUwpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg c3BpX2ZyZXEgPSBhZGMtPmRmc2RtLT5zcGlfbWFzdGVyX2ZyZXE7Cj4+ICsKPj4gK8KgwqDCoMKg IGlmIChzcGlfZnJlcSAlIHNhbXBsZV9mcmVxKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGRldl93YXJuKCZpbmRpb19kZXYtPmRldiwgIlNhbXBsaW5nIHJhdGUgbm90IGFjY3VyYXRlICgl ZClcbiIsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3Bp X2ZyZXEgLyAoc3BpX2ZyZXEgLyBzYW1wbGVfZnJlcSkpOwo+PiArCj4+ICvCoMKgwqDCoCByZXQg PSBzdG0zMl9kZnNkbV9zZXRfb3NycyhmbCwgMCwgKHNwaV9mcmVxIC8gc2FtcGxlX2ZyZXEpKTsK Pj4gK8KgwqDCoMKgIGlmIChyZXQgPCAwKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg ZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgICJOb3QgYWJsZSB0byBmaW5kIGZpbHRlciBwYXJhbWV0ZXIgdGhhdCBtYXRj aCFcbiIpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+ICvCoMKg wqDCoCB9Cj4+ICvCoMKgwqDCoCBhZGMtPnNhbXBsZV9mcmVxID0gc2FtcGxlX2ZyZXE7Cj4+ICsK Pj4gK8KgwqDCoMKgIHJldHVybiBsZW47Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBzc2l6ZV90IGRm c2RtX2FkY19hdWRpb19nZXRfc3BpY2xrKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHVpbnRwdHJfdCBwcml2LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgY2hhciAqYnVmKQo+PiArewo+PiArwqDCoMKgwqAgc3RydWN0IHN0bTMyX2Rmc2RtX2FkYyAq YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKPj4gKwo+PiArwqDCoMKgwqAgcmV0dXJuIHNucHJp bnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGFkYy0+c3BpX2ZyZXEpOwo+PiArfQo+PiArCj4+ ICtzdGF0aWMgc3NpemVfdCBkZnNkbV9hZGNfYXVkaW9fc2V0X3NwaWNsayhzdHJ1Y3QgaWlvX2Rl diAqaW5kaW9fZGV2LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1aW50cHRyX3QgcHJpdiwKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW4sCj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKPj4gK3sK Pj4gK8KgwqDCoMKgIHN0cnVjdCBzdG0zMl9kZnNkbV9hZGMgKmFkYyA9IGlpb19wcml2KGluZGlv X2Rldik7Cj4+ICvCoMKgwqDCoCBzdHJ1Y3Qgc3RtMzJfZGZzZG1fZmlsdGVyICpmbCA9ICZhZGMt PmRmc2RtLT5mbF9saXN0W2FkYy0+ZmxfaWRdOwo+PiArwqDCoMKgwqAgc3RydWN0IHN0bTMyX2Rm c2RtX2NoYW5uZWwgKmNoID0gJmFkYy0+ZGZzZG0tPmNoX2xpc3RbYWRjLT5jaF9pZF07Cj4+ICvC oMKgwqDCoCB1bnNpZ25lZCBpbnQgc2FtcGxlX2ZyZXEgPSBhZGMtPnNhbXBsZV9mcmVxOwo+PiAr wqDCoMKgwqAgdW5zaWduZWQgaW50IHNwaV9mcmVxOwo+PiArwqDCoMKgwqAgaW50IHJldDsKPj4g Kwo+PiArwqDCoMKgwqAgZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsICJlbnRlciAlc1xuIiwgX19m dW5jX18pOwo+PiArwqDCoMKgwqAgLyogSWYgREZTRE0gaXMgbWFzdGVyIG9uIFNQSSwgU1BJIGZy ZXEgY2FuIG5vdCBiZSB1cGRhdGVkICovCj4+ICvCoMKgwqDCoCBpZiAoY2gtPnNyYyAhPSBERlNE TV9DSEFOTkVMX1NQSV9DTE9DS19FWFRFUk5BTCkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCByZXR1cm4gLUVQRVJNOwo+PiArCj4+ICvCoMKgwqDCoCByZXQgPSBrc3RydG9pbnQoYnVmLCAw LCAmc3BpX2ZyZXEpOwo+PiArwqDCoMKgwqAgaWYgKHJldCkKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCByZXR1cm4gcmV0Owo+PiArCj4+ICvCoMKgwqDCoCBpZiAoIXNwaV9mcmVxKQo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOwo+PiArCj4+ICvCoMKgwqDC oCBpZiAoc2FtcGxlX2ZyZXEpIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoc3Bp X2ZyZXEgJSBzYW1wbGVfZnJlcSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgZGV2X3dhcm4oJmluZGlvX2Rldi0+ZGV2LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAiU2FtcGxpbmcgcmF0ZSBu b3QgYWNjdXJhdGUgKCVkKVxuIiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3BpX2ZyZXEgLyAoc3BpX2ZyZXEgLyBzYW1wbGVf ZnJlcSkpOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0gc3RtMzJfZGZz ZG1fc2V0X29zcnMoZmwsIDAsIChzcGlfZnJlcSAvIHNhbXBsZV9mcmVxKSk7Cj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgaWYgKHJldCA8IDApIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsCj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAiTm8gZmls dGVyIHBhcmFtZXRlcnMgdGhhdCBtYXRjaCFcbiIpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIH0KPj4gK8KgwqDCoMKgIH0KPj4gK8KgwqDCoMKgIGFkYy0+c3BpX2ZyZXEgPSBzcGlfZnJl cTsKPj4gKwo+PiArwqDCoMKgwqAgcmV0dXJuIGxlbjsKPj4gK30KPiBibGFuayBsaW5lIGhlcmUg cGxlYXNlLgo+IAo+PsKgIHN0YXRpYyBpbnQgc3RtMzJfZGZzZG1fc3RhcnRfY29udihzdHJ1Y3Qg c3RtMzJfZGZzZG1fYWRjICphZGMsIGJvb2wgZG1hKQo+PsKgIHsKPj7CoMKgwqDCoMKgwqDCoCBz dHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBhZGMtPmRmc2RtLT5yZWdtYXA7Cj4+wqDCoMKgwqDCoMKg wqAgaW50IHJldDsKPj4gK8KgwqDCoMKgIHVuc2lnbmVkIGludCBkbWFfZW4gPSAwLCBjb250X2Vu ID0gMDsKPj7CoCAKPj7CoMKgwqDCoMKgwqDCoCByZXQgPSBzdG0zMl9kZnNkbV9zdGFydF9jaGFu bmVsKGFkYy0+ZGZzZG0sIGFkYy0+Y2hfaWQpOwo+PsKgwqDCoMKgwqDCoMKgIGlmIChyZXQgPCAw KQo+PiBAQCAtMzc4LDYgKzQ5NiwyNCBAQCBzdGF0aWMgaW50IHN0bTMyX2Rmc2RtX3N0YXJ0X2Nv bnYoc3RydWN0IHN0bTMyX2Rmc2RtX2FkYyAqYWRjLCBib29sIGRtYSkKPj7CoMKgwqDCoMKgwqDC oCBpZiAocmV0IDwgMCkKPj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBzdG9w X2NoYW5uZWxzOwo+PsKgIAo+PiArwqDCoMKgwqAgaWYgKGRtYSkgewo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIC8qIEVuYWJsZSBETUEgdHJhbnNmZXIqLwo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGRtYV9lbiA9wqAgREZTRE1fQ1IxX1JETUFFTigxKTsKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAvKiBFbmFibGUgY29udmVyc2lvbiB0cmlnZ2VyZWQgYnkgU1BJIGNsb2Nr Ki8KPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250X2VuID0gREZTRE1fQ1IxX1JDT05U KDEpOwo+PiArwqDCoMKgwqAgfQo+PiArwqDCoMKgwqAgLyogRW5hYmxlIERNQSB0cmFuc2Zlciov Cj4+ICvCoMKgwqDCoCByZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBERlNETV9DUjEo YWRjLT5mbF9pZCksCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIERGU0RNX0NSMV9SRE1BRU5fTUFTSywgZG1hX2VuKTsKPj4gK8Kg wqDCoMKgIGlmIChyZXQgPCAwKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gc3Rv cF9jaGFubmVsczsKPj4gKwo+PiArwqDCoMKgwqAgLyogRW5hYmxlIGNvbnZlcnNpb24gdHJpZ2dl cmVkIGJ5IFNQSSBjbG9jayovCj4+ICvCoMKgwqDCoCByZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMo cmVnbWFwLCBERlNETV9DUjEoYWRjLT5mbF9pZCksCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIERGU0RNX0NSMV9SQ09OVF9NQVNL LCBjb250X2VuKTsKPj4gK8KgwqDCoMKgIGlmIChyZXQgPCAwKQo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGdvdG8gc3RvcF9jaGFubmVsczsKPj4gKwo+PsKgwqDCoMKgwqDCoMKgIHJldCA9 IHN0bTMyX2Rmc2RtX3N0YXJ0X2ZpbHRlcihhZGMtPmRmc2RtLCBhZGMtPmZsX2lkKTsKPj7CoMKg wqDCoMKgwqDCoCBpZiAocmV0IDwgMCkKPj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Z290byBzdG9wX2NoYW5uZWxzOwo+PiBAQCAtNDExLDYgKzU0NywyNDEgQEAgc3RhdGljIHZvaWQg c3RtMzJfZGZzZG1fc3RvcF9jb252KHN0cnVjdCBzdG0zMl9kZnNkbV9hZGMgKmFkYykKPj7CoMKg wqDCoMKgwqDCoCBzdG0zMl9kZnNkbV9zdG9wX2NoYW5uZWwoYWRjLT5kZnNkbSwgYWRjLT5jaF9p ZCk7Cj4+wqAgfQo+PsKgIAo+PiArc3RhdGljIGludCBzdG0zMl9kZnNkbV9zZXRfd2F0ZXJtYXJr KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgaW50IHZh bCkKPj4gK3sKPj4gK8KgwqDCoMKgIHN0cnVjdCBzdG0zMl9kZnNkbV9hZGMgKmFkYyA9IGlpb19w cml2KGluZGlvX2Rldik7Cj4+ICvCoMKgwqDCoCB1bnNpZ25lZCBpbnQgd2F0ZXJtYXJrID0gREZT RE1fRE1BX0JVRkZFUl9TSVpFIC8gMjsKPj4gKwo+PiArwqDCoMKgwqAgLyoKPj4gK8KgwqDCoMKg wqAgKiBETUEgY3ljbGljIHRyYW5zZmVycyBhcmUgdXNlZCwgYnVmZmVyIGlzIHNwbGl0IGludG8g dHdvIHBlcmlvZHMuCj4+ICvCoMKgwqDCoMKgICogVGhlcmUgc2hvdWxkIGJlIDoKPj4gK8KgwqDC oMKgwqAgKiAtIGFsd2F5cyBvbmUgYnVmZmVyIChwZXJpb2QpIERNQSBpcyB3b3JraW5nIG9uCj4+ ICvCoMKgwqDCoMKgICogLSBvbmUgYnVmZmVyIChwZXJpb2QpIGRyaXZlciBwdXNoZWQgdG8gQVNv QyBzaWRlLgo+PiArwqDCoMKgwqDCoCAqLwo+PiArwqDCoMKgwqAgd2F0ZXJtYXJrID0gbWluKHdh dGVybWFyaywgdmFsICogKHVuc2lnbmVkIGludCkoc2l6ZW9mKHUzMikpKTsKPj4gK8KgwqDCoMKg IGFkYy0+YnVmX3N6ID0gd2F0ZXJtYXJrICogMjsKPj4gKwo+PiArwqDCoMKgwqAgcmV0dXJuIDA7 Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gc3RtMzJfZGZzZG1f aW5mb19hdWRpbyA9IHsKPj4gK8KgwqDCoMKgIC5od2ZpZm9fc2V0X3dhdGVybWFyayA9IHN0bTMy X2Rmc2RtX3NldF93YXRlcm1hcmssCj4+ICvCoMKgwqDCoCAuZHJpdmVyX21vZHVsZSA9IFRISVNf TU9EVUxFLAo+IAo+IFRoaXMgaGFzIGdvbmUgLSBub3cgaGFuZGxlZCBieSBtYWNybyBtYWdpYy4u Lgo+IAo+PiArfTsKPj4gKwo+PiArc3RhdGljIHVuc2lnbmVkIGludCBzdG0zMl9kZnNkbV9hZGNf ZG1hX3Jlc2lkdWUoc3RydWN0IHN0bTMyX2Rmc2RtX2FkYyAqYWRjKQo+PiArewo+PiArwqDCoMKg wqAgc3RydWN0IGRtYV90eF9zdGF0ZSBzdGF0ZTsKPj4gK8KgwqDCoMKgIGVudW0gZG1hX3N0YXR1 cyBzdGF0dXM7Cj4+ICsKPj4gK8KgwqDCoMKgIHN0YXR1cyA9IGRtYWVuZ2luZV90eF9zdGF0dXMo YWRjLT5kbWFfY2hhbiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhZGMtPmRtYV9jaGFuLT5jb29raWUsCj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgJnN0YXRlKTsKPj4gK8KgwqDCoMKgIGlmIChzdGF0dXMgPT0gRE1BX0lOX1BST0dS RVNTKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLyogUmVzaWR1ZSBpcyBzaXplIGlu IGJ5dGVzIGZyb20gZW5kIG9mIGJ1ZmZlciAqLwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHVuc2lnbmVkIGludCBpID0gYWRjLT5idWZfc3ogLSBzdGF0ZS5yZXNpZHVlOwo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGludCBzaXplOwo+PiArCj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgLyogUmV0dXJuIGF2YWlsYWJsZSBieXRlcyAqLwo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGlmIChpID49IGFkYy0+YnVmaSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2l6ZSA9IGkgLSBhZGMtPmJ1Zmk7Cj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgZWxzZQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBzaXplID0gYWRjLT5idWZfc3ogKyBpIC0gYWRjLT5idWZpOwo+PiArCj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHNpemU7Cj4+ICvCoMKgwqDCoCB9Cj4+ICsK Pj4gK8KgwqDCoMKgIHJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBzdG0zMl9k ZnNkbV9hdWRpb19kbWFfYnVmZmVyX2RvbmUodm9pZCAqZGF0YSkKPj4gK3sKPj4gK8KgwqDCoMKg IHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkYXRhOwo+PiArwqDCoMKgwqAgc3RydWN0IHN0 bTMyX2Rmc2RtX2FkYyAqYWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKPj4gK8KgwqDCoMKgIGlu dCBhdmFpbGFibGUgPSBzdG0zMl9kZnNkbV9hZGNfZG1hX3Jlc2lkdWUoYWRjKTsKPj4gK8KgwqDC oMKgIHNpemVfdCBvbGRfcG9zOwo+PiArCj4+ICvCoMKgwqDCoCAvKgo+PiArwqDCoMKgwqDCoCAq IEZJWE1FOiBCdWZmZXIgaW50ZXJmYWNlIGRvZXMgbm90IHN1cHBvcnQgY3ljbGljIERNQSBidWZm ZXIsYW5kIG9mZmVycwo+PiArwqDCoMKgwqDCoCAqIG9ubHkgYW4gaW50ZXJmYWNlIHRvIHB1c2gg ZGF0YSBzYW1wbGVzIHBlciBzYW1wbGVzLgo+PiArwqDCoMKgwqDCoCAqIEZvciB0aGlzIHJlYXNv biBJSU8gYnVmZmVyIGludGVyZmFjZSBpcyBub3QgdXNlZCBhbmQgaW50ZXJmYWNlIGlzCj4+ICvC oMKgwqDCoMKgICogYnlwYXNzZWQgdXNpbmcgYSBwcml2YXRlIGNhbGxiYWNrIHJlZ2lzdGVyZWQg YnkgQVNvQy4KPj4gK8KgwqDCoMKgwqAgKiBUaGlzIHNob3VsZCBiZSBhIHRlbXBvcmFyeSBzb2x1 dGlvbiB3YWl0aW5nIGEgY3ljbGljIERNQSBlbmdpbmUKPj4gK8KgwqDCoMKgwqAgKiBzdXBwb3J0 IGluIElJTy4KPiBNb3JlIHNwZWNpZmljYWxseSB0aGUgaW4ga2VybmVsIGludGVyZmFjZXMgZG9u J3Qgc3VwcG9ydCBkbWEgY3ljbGljCj4gYnVmZmVycy7CoCBXZSBjYW4gYWxyZWFkeSBkbyB0aGVt IHRvIHVzZXJzcGFjZS7CoCBEb2Vzbid0IHJlYWxseSBtYXR0ZXIKPiB0aG91Z2ghCk9rIEkgd2ls bCBjaGFuZ2UgY29tbWVudAo+IAo+PiArwqDCoMKgwqDCoCAqLwo+PiArCj4+ICvCoMKgwqDCoCBk ZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgIiVzOiBwb3MgPSAlZCwgYXZhaWxhYmxlID0gJWRcbiIs IF9fZnVuY19fLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGFkYy0+YnVmaSwgYXZhaWxh YmxlKTsKPj4gK8KgwqDCoMKgIG9sZF9wb3MgPSBhZGMtPmJ1Zmk7Cj4+ICsKPj4gK8KgwqDCoMKg IHdoaWxlIChhdmFpbGFibGUgPj0gaW5kaW9fZGV2LT5zY2FuX2J5dGVzKSB7Cj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgdTMyICpidWZmZXIgPSAodTMyICopJmFkYy0+cnhfYnVmW2FkYy0+ YnVmaV07Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBNYXNrIDggTFNCIHRo YXQgY29udGFpbnMgdGhlIGNoYW5uZWwgSUQgKi8KPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAqYnVmZmVyID0gKCpidWZmZXIgJiAweEZGRkZGRjAwKSA8PCA4Owo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGF2YWlsYWJsZSAtPSBpbmRpb19kZXYtPnNjYW5fYnl0ZXM7Cj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgYWRjLT5idWZpICs9IGluZGlvX2Rldi0+c2Nhbl9ieXRlczsK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoYWRjLT5idWZpID49IGFkYy0+YnVmX3N6 KSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChhZGMt PmNiKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgYWRjLT5jYigmYWRjLT5yeF9idWZbb2xkX3Bvc10sCj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBhZGMtPmJ1Zl9zeiAtIG9sZF9wb3MsIGFkYy0+Y2JfcHJpdik7Cj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGFkYy0+YnVmaSA9IDA7Cj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG9sZF9wb3MgPSAwOwo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoMKgIH0KPj4gK8KgwqDCoMKgIGlmIChhZGMt PmNiKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGFkYy0+Y2IoJmFkYy0+cnhfYnVmW29s ZF9wb3NdLCBhZGMtPmJ1ZmkgLSBvbGRfcG9zLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYWRjLT5jYl9wcml2KTsKPj4gK30KPj4g Kwo+PiArc3RhdGljIGludCBzdG0zMl9kZnNkbV9hZGNfZG1hX3N0YXJ0KHN0cnVjdCBpaW9fZGV2 ICppbmRpb19kZXYpCj4+ICt7Cj4+ICvCoMKgwqDCoCBzdHJ1Y3Qgc3RtMzJfZGZzZG1fYWRjICph ZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOwo+PiArwqDCoMKgwqAgc3RydWN0IGRtYV9hc3luY190 eF9kZXNjcmlwdG9yICpkZXNjOwo+PiArwqDCoMKgwqAgZG1hX2Nvb2tpZV90IGNvb2tpZTsKPj4g K8KgwqDCoMKgIGludCByZXQ7Cj4+ICsKPj4gK8KgwqDCoMKgIGlmICghYWRjLT5kbWFfY2hhbikK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJTlZBTDsKPj4gKwo+PiArwqDC oMKgwqAgZGV2X2RiZygmaW5kaW9fZGV2LT5kZXYsICIlcyBzaXplPSVkIHdhdGVybWFyaz0lZFxu IiwgX19mdW5jX18sCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYWRjLT5idWZfc3osIGFk Yy0+YnVmX3N6IC8gMik7Cj4+ICsKPj4gK8KgwqDCoMKgIC8qIFByZXBhcmUgYSBETUEgY3ljbGlj IHRyYW5zYWN0aW9uICovCj4+ICvCoMKgwqDCoCBkZXNjID0gZG1hZW5naW5lX3ByZXBfZG1hX2N5 Y2xpYyhhZGMtPmRtYV9jaGFuLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYWRjLT5kbWFfYnVmLAo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgYWRjLT5idWZfc3osIGFkYy0+YnVmX3N6IC8gMiwKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIERNQV9ERVZfVE9fTUVNLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRE1B X1BSRVBfSU5URVJSVVBUKTsKPj4gK8KgwqDCoMKgIGlmICghZGVzYykKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCByZXR1cm4gLUVCVVNZOwo+PiArCj4+ICvCoMKgwqDCoCBkZXNjLT5jYWxs YmFjayA9IHN0bTMyX2Rmc2RtX2F1ZGlvX2RtYV9idWZmZXJfZG9uZTsKPj4gK8KgwqDCoMKgIGRl c2MtPmNhbGxiYWNrX3BhcmFtID0gaW5kaW9fZGV2Owo+PiArCj4+ICvCoMKgwqDCoCBjb29raWUg PSBkbWFlbmdpbmVfc3VibWl0KGRlc2MpOwo+PiArwqDCoMKgwqAgcmV0ID0gZG1hX3N1Ym1pdF9l cnJvcihjb29raWUpOwo+PiArwqDCoMKgwqAgaWYgKHJldCkgewo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKGFkYy0+ZG1hX2NoYW4pOwo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+ICvCoMKgwqDCoCB9Cj4+ICsKPj4g K8KgwqDCoMKgIC8qIElzc3VlIHBlbmRpbmcgRE1BIHJlcXVlc3RzICovCj4+ICvCoMKgwqDCoCBk bWFfYXN5bmNfaXNzdWVfcGVuZGluZyhhZGMtPmRtYV9jaGFuKTsKPj4gKwo+PiArwqDCoMKgwqAg cmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgc3RtMzJfZGZzZG1fcG9zdGVuYWJs ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQo+PiArewo+PiArwqDCoMKgwqAgc3RydWN0IHN0 bTMyX2Rmc2RtX2FkYyAqYWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKPj4gK8KgwqDCoMKgIGlu dCByZXQ7Cj4+ICsKPj4gK8KgwqDCoMKgIC8qIFJlc2V0IGFkYyBidWZmZXIgaW5kZXggKi8KPj4g K8KgwqDCoMKgIGFkYy0+YnVmaSA9IDA7Cj4+ICsKPj4gK8KgwqDCoMKgIHJldCA9IHN0bTMyX2Rm c2RtX3N0YXJ0X2Rmc2RtKGFkYy0+ZGZzZG0pOwo+PiArwqDCoMKgwqAgaWYgKHJldCA8IDApCj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHJldDsKPj4gKwo+PiArwqDCoMKgwqAg cmV0ID0gc3RtMzJfZGZzZG1fc3RhcnRfY29udihhZGMsIHRydWUpOwo+PiArwqDCoMKgwqAgaWYg KHJldCkgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRldl9lcnIoJmluZGlvX2Rldi0+ ZGV2LCAiQ2FuJ3Qgc3RhcnQgY29udmVyc2lvblxuIik7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgZ290byBzdG9wX2Rmc2RtOwo+PiArwqDCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqDCoCBp ZiAoYWRjLT5kbWFfY2hhbikgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCA9IHN0 bTMyX2Rmc2RtX2FkY19kbWFfc3RhcnQoaW5kaW9fZGV2KTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBpZiAocmV0KSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGRldl9lcnIoJmluZGlvX2Rldi0+ZGV2LCAiQ2FuJ3Qgc3RhcnQgRE1BXG4iKTsKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBlcnJfc3RvcF9j b252Owo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoMKgIH0KPj4gKwo+ PiArwqDCoMKgwqAgcmV0dXJuIDA7Cj4+ICsKPj4gK2Vycl9zdG9wX2NvbnY6Cj4+ICvCoMKgwqDC oCBzdG0zMl9kZnNkbV9zdG9wX2NvbnYoYWRjKTsKPj4gK3N0b3BfZGZzZG06Cj4+ICvCoMKgwqDC oCBzdG0zMl9kZnNkbV9zdG9wX2Rmc2RtKGFkYy0+ZGZzZG0pOwo+PiArCj4+ICvCoMKgwqDCoCBy ZXR1cm4gcmV0Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHN0bTMyX2Rmc2RtX3ByZWRpc2Fi bGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKPj4gK3sKPj4gK8KgwqDCoMKgIHN0cnVjdCBz dG0zMl9kZnNkbV9hZGMgKmFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7Cj4+ICsKPj4gK8KgwqDC oMKgIGlmIChhZGMtPmRtYV9jaGFuKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRtYWVu Z2luZV90ZXJtaW5hdGVfYWxsKGFkYy0+ZG1hX2NoYW4pOwo+PiArCj4+ICvCoMKgwqDCoCBzdG0z Ml9kZnNkbV9zdG9wX2NvbnYoYWRjKTsKPj4gKwo+PiArwqDCoMKgwqAgc3RtMzJfZGZzZG1fc3Rv cF9kZnNkbShhZGMtPmRmc2RtKTsKPj4gKwo+PiArwqDCoMKgwqAgcmV0dXJuIDA7Cj4+ICt9Cj4+ ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgc3RtMzJfZGZz ZG1fYnVmZmVyX3NldHVwX29wcyA9IHsKPj4gK8KgwqDCoMKgIC5wb3N0ZW5hYmxlID0gJnN0bTMy X2Rmc2RtX3Bvc3RlbmFibGUsCj4+ICvCoMKgwqDCoCAucHJlZGlzYWJsZSA9ICZzdG0zMl9kZnNk bV9wcmVkaXNhYmxlLAo+PiArfTsKPj4gKwo+PiArLyoqCj4+ICsgKiBzdG0zMl9kZnNkbV9nZXRf YnVmZl9jYiAtIHJlZ2lzdGVyIGEgY2FsbGJhY2sKPj4gKyAqwqDCoCB0aGF0IHdpbGwgYmUgY2Fs bGVkIHdoZW4gRE1BIHRyYW5zZmVyIHBlcmlvZCBpcyBhY2hpZXZlZC4KPiBQbGVhc2UgcnVuIGtl cm5lbC1kb2Mgb3ZlciB0aGlzIGZpbGUuIEknbSBmYWlybHkgc3VyZSB0aGlzIGlzbid0Cj4gcXVp dGUgbWVldGluZyB0aGUgc3BlYy4uLgpTb3JyeSBpdCBpcyBub3QgY3J5c3RhbCBjbGVhciBmb3Ig bWUsIGNvdWxkIHlvdSBkZXRhaWwgd2hhdCB5b3Ugd291bGQKbWVhbiBieQoiSSdtIGZhaXJseSBz dXJlIHRoaXMgaXNuJ3QgcXVpdGUgbWVldGluZyB0aGUgc3BlYy4uIj8KCj4gCj4+ICsgKgo+PiAr ICogQGlpb19kZXY6IEhhbmRsZSB0byBJSU8gZGV2aWNlLgo+PiArICogQGNiOiBwb2ludGVyIHRv IGNhbGxiYWNrIGZ1bmN0aW9uLgo+PiArICrCoMKgIEBkYXRhOiBwb2ludGVyIHRvIGRhdGEgYnVm ZmVyCj4+ICsgKsKgwqAgQHNpemU6IHNpemUgaW4gYnl0ZSBvZiB0aGUgZGF0YSBidWZmZXIKPj4g KyAqwqDCoCBAcHJpdmF0ZTogcG9pbnRlciB0byBjb25zdW1lciBwcml2YXRlIHN0cnVjdHVyZQo+ PiArICogQHByaXZhdGU6IHBvaW50ZXIgdG8gY29uc3VtZXIgcHJpdmF0ZSBzdHJ1Y3R1cmUKPj4g KyAqLwo+PiAraW50IHN0bTMyX2Rmc2RtX2dldF9idWZmX2NiKHN0cnVjdCBpaW9fZGV2ICppaW9f ZGV2LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGludCAoKmNiKShjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHZvaWQgKnByaXZhdGUpLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHZvaWQgKnByaXZhdGUpCj4+ICt7Cj4+ICvCoMKgwqDCoCBzdHJ1Y3Qgc3Rt MzJfZGZzZG1fYWRjICphZGM7Cj4+ICsKPj4gK8KgwqDCoMKgIGlmICghaWlvX2RldikKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJTlZBTDsKPj4gK8KgwqDCoMKgIGFkYyA9 IGlpb19wcml2KGlpb19kZXYpOwo+PiArCj4+ICvCoMKgwqDCoCBpZiAoaWlvX2RldiAhPcKgIGlp b19wcml2X3RvX2RldihhZGMpKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAt RUlOVkFMOwo+IFNhbWUgYXMgZm9yIHRoZSBjYXNlIGJlbG93Li4KPiAKPj4gKwo+PiArwqDCoMKg wqAgYWRjLT5jYiA9IGNiOwo+PiArwqDCoMKgwqAgYWRjLT5jYl9wcml2ID0gcHJpdmF0ZTsKPj4g Kwo+PiArwqDCoMKgwqAgcmV0dXJuIDA7Cj4+ICt9Cj4+ICtFWFBPUlRfU1lNQk9MX0dQTChzdG0z Ml9kZnNkbV9nZXRfYnVmZl9jYik7Cj4+ICsKPj4gKy8qKgo+PiArICogc3RtMzJfZGZzZG1fcmVs ZWFzZV9idWZmX2NiIC0gdW5yZWdpc3RlciBidWZmZXIgY2FsbGJhY2sKPj4gKyAqCj4+ICsgKiBA aWlvX2RldjogSGFuZGxlIHRvIElJTyBkZXZpY2UuCj4+ICsgKi8KPj4gK2ludCBzdG0zMl9kZnNk bV9yZWxlYXNlX2J1ZmZfY2Ioc3RydWN0IGlpb19kZXYgKmlpb19kZXYpCj4+ICt7Cj4+ICvCoMKg wqDCoCBzdHJ1Y3Qgc3RtMzJfZGZzZG1fYWRjICphZGM7Cj4+ICsKPj4gK8KgwqDCoMKgIGlmICgh aWlvX2RldikKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJTlZBTDsKPj4g K8KgwqDCoMKgIGFkYyA9IGlpb19wcml2KGlpb19kZXYpOwo+PiArCj4+ICvCoMKgwqDCoCBpZiAo aWlvX2RldiAhPcKgIGlpb19wcml2X3RvX2RldihhZGMpKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHJldHVybiAtRUlOVkFMOwo+IEkgY2FuJ3QgaW1tZWRpYXRlbHkgc3BvdCB3aHkgdGhp cyBjb3VsZCBldmVyIGZhaWwgc28gd2UgZGVmaW5pdGVseQo+IG5lZWQgYSBjb21tZW50IGhlcmUg c2F5aW5nIHdoYXQgaXQgaXMgcHJvdGVjdGluZyBhZ2FpbnN0IQpZb3UncmUgcmlnaHQgLCBpdCBp cyBvdmVyLXByb3RlY3Rpb24sIGkgd2lsbCBzdXBwcmVzcyBpdAoKVGhhbmtzCkFybmF1ZAoKPiAK Pj4gK8KgwqDCoMKgIGFkYy0+Y2IgPSBOVUxMOwo+PiArwqDCoMKgwqAgYWRjLT5jYl9wcml2ID0g TlVMTDsKPj4gKwo+PiArwqDCoMKgwqAgcmV0dXJuIDA7Cj4+ICt9Cj4+ICtFWFBPUlRfU1lNQk9M X0dQTChzdG0zMl9kZnNkbV9yZWxlYXNlX2J1ZmZfY2IpOwo+PiArCj4+wqAgc3RhdGljIGludCBz dG0zMl9kZnNkbV9zaW5nbGVfY29udihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAo+PsKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuLCBpbnQgKnJlcykKPj7CoCB7 Cj4+IEBAIC01NDQsNiArOTE1LDY3IEBAIHN0YXRpYyBpcnFyZXR1cm5fdCBzdG0zMl9kZnNkbV9p cnEoaW50IGlycSwgdm9pZCAqYXJnKQo+PsKgwqDCoMKgwqDCoMKgIHJldHVybiBJUlFfSEFORExF RDsKPj7CoCB9Cj4+wqAgCj4+ICsvKgo+PiArICogRGVmaW5lIGV4dGVybmFsIGluZm8gZm9yIFNQ SSBGcmVxdWVuY3kgYW5kIGF1ZGlvIHNhbXBsaW5nIHJhdGUgdGhhdCBjYW4gYmUKPj4gKyAqIGNv bmZpZ3VyZWQgYnkgQVNvQyBkcml2ZXIgdGhyb3VnaCBjb25zdW1lci5oIEFQSQo+PiArICovCj4+ ICtzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWNfZXh0X2luZm8gZGZzZG1fYWRjX2F1 ZGlvX2V4dF9pbmZvW10gPSB7Cj4+ICvCoMKgwqDCoCAvKiBmaWx0ZXIgb3ZlcnNhbXBsaW5nOiBQ b3N0IGZpbHRlciBvdmVyc2FtcGxpbmcgcmF0aW8gKi8KPj4gK8KgwqDCoMKgIHsKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAubmFtZSA9ICJhdWRpb19zYW1wbGluZ19yYXRlIiwKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAuc2hhcmVkID0gSUlPX1NIQVJFRF9CWV9UWVBFLAo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC5yZWFkID0gZGZzZG1fYWRjX2F1ZGlvX2dldF9yYXRl LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC53cml0ZSA9IGRmc2RtX2FkY19hdWRpb19z ZXRfcmF0ZSwKPj4gK8KgwqDCoMKgIH0sCj4+ICvCoMKgwqDCoCAvKiBkYXRhX3JpZ2h0X2JpdF9z aGlmdCA6IEZpbHRlciBvdXRwdXQgZGF0YSBzaGlmdGluZyAqLwo+PiArwqDCoMKgwqAgewo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC5uYW1lID0gInNwaV9jbGtfZnJlcSIsCj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgLnNoYXJlZCA9IElJT19TSEFSRURfQllfVFlQRSwKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAucmVhZCA9IGRmc2RtX2FkY19hdWRpb19nZXRfc3BpY2xr LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC53cml0ZSA9IGRmc2RtX2FkY19hdWRpb19z ZXRfc3BpY2xrLAo+PiArwqDCoMKgwqAgfSwKPj4gK8KgwqDCoMKgIHt9LAo+PiArfTsKPj4gKwo+ PiArc3RhdGljIGludCBzdG0zMl9kZnNkbV9kbWFfcmVxdWVzdChzdHJ1Y3QgaWlvX2RldiAqaW5k aW9fZGV2KQo+PiArewo+PiArwqDCoMKgwqAgc3RydWN0IHN0bTMyX2Rmc2RtX2FkYyAqYWRjID0g aWlvX3ByaXYoaW5kaW9fZGV2KTsKPj4gK8KgwqDCoMKgIHN0cnVjdCBkbWFfc2xhdmVfY29uZmln IGNvbmZpZzsKPj4gK8KgwqDCoMKgIGludCByZXQ7Cj4+ICsKPj4gK8KgwqDCoMKgIGFkYy0+ZG1h X2NoYW4gPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsKCZpbmRpb19kZXYtPmRldiwgInJ4Iik7 Cj4+ICvCoMKgwqDCoCBpZiAoIWFkYy0+ZG1hX2NoYW4pCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcmV0dXJuIC1FSU5WQUw7Cj4+ICsKPj4gK8KgwqDCoMKgIGFkYy0+cnhfYnVmID0gZG1h X2FsbG9jX2NvaGVyZW50KGFkYy0+ZG1hX2NoYW4tPmRldmljZS0+ZGV2LAo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgREZTRE1fRE1BX0JVRkZFUl9TSVpFLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJmFk Yy0+ZG1hX2J1ZiwgR0ZQX0tFUk5FTCk7Cj4+ICvCoMKgwqDCoCBpZiAoIWFkYy0+cnhfYnVmKSB7 Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0gLUVOT01FTTsKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBnb3RvIGVycl9yZWxlYXNlOwo+PiArwqDCoMKgwqAgfQo+PiArCj4+ ICvCoMKgwqDCoCAvKiBDb25maWd1cmUgRE1BIGNoYW5uZWwgdG8gcmVhZCBkYXRhIHJlZ2lzdGVy ICovCj4+ICvCoMKgwqDCoCBtZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOwo+PiAr wqDCoMKgwqAgY29uZmlnLnNyY19hZGRyID0gKGRtYV9hZGRyX3QpYWRjLT5kZnNkbS0+cGh5c19i YXNlOwo+PiArwqDCoMKgwqAgY29uZmlnLnNyY19hZGRyICs9IERGU0RNX1JEQVRBUihhZGMtPmZs X2lkKTsKPj4gK8KgwqDCoMKgIGNvbmZpZy5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNX SURUSF80X0JZVEVTOwo+PiArCj4+ICvCoMKgwqDCoCByZXQgPSBkbWFlbmdpbmVfc2xhdmVfY29u ZmlnKGFkYy0+ZG1hX2NoYW4sICZjb25maWcpOwo+PiArwqDCoMKgwqAgaWYgKHJldCkKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIGVycl9mcmVlOwo+PiArCj4+ICvCoMKgwqDCoCBy ZXR1cm4gMDsKPj4gKwo+PiArZXJyX2ZyZWU6Cj4+ICvCoMKgwqDCoCBkbWFfZnJlZV9jb2hlcmVu dChhZGMtPmRtYV9jaGFuLT5kZXZpY2UtPmRldiwgREZTRE1fRE1BX0JVRkZFUl9TSVpFLAo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYWRjLT5yeF9idWYs IGFkYy0+ZG1hX2J1Zik7Cj4+ICtlcnJfcmVsZWFzZToKPj4gK8KgwqDCoMKgIGRtYV9yZWxlYXNl X2NoYW5uZWwoYWRjLT5kbWFfY2hhbik7Cj4+ICsKPj4gK8KgwqDCoMKgIHJldHVybiByZXQ7Cj4+ ICt9Cj4+ICsKPj7CoCBzdGF0aWMgaW50IHN0bTMyX2Rmc2RtX2FkY19jaGFuX2luaXRfb25lKHN0 cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCj4+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0 IGlpb19jaGFuX3NwZWMgKmNoKQo+PsKgIHsKPj4gQEAgLTU2NCw3ICs5OTYsMTIgQEAgc3RhdGlj IGludCBzdG0zMl9kZnNkbV9hZGNfY2hhbl9pbml0X29uZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9f ZGV2LAo+PsKgwqDCoMKgwqDCoMKgIGNoLT5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NI QU5fSU5GT19SQVcpOwo+PsKgwqDCoMKgwqDCoMKgIGNoLT5pbmZvX21hc2tfc2hhcmVkX2J5X2Fs bCA9IEJJVChJSU9fQ0hBTl9JTkZPX09WRVJTQU1QTElOR19SQVRJTyk7Cj4+wqAgCj4+IC3CoMKg wqDCoCBjaC0+c2Nhbl90eXBlLnNpZ24gPSAndSc7Cj4+ICvCoMKgwqDCoCBpZiAoYWRjLT5kZXZf ZGF0YS0+dHlwZSA9PSBERlNETV9BVURJTykgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGNoLT5zY2FuX3R5cGUuc2lnbiA9ICdzJzsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBj aC0+ZXh0X2luZm8gPSBkZnNkbV9hZGNfYXVkaW9fZXh0X2luZm87Cj4+ICvCoMKgwqDCoCB9IGVs c2Ugewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNoLT5zY2FuX3R5cGUuc2lnbiA9ICd1 JzsKPj4gK8KgwqDCoMKgIH0KPj7CoMKgwqDCoMKgwqDCoCBjaC0+c2Nhbl90eXBlLnJlYWxiaXRz ID0gMjQ7Cj4+wqDCoMKgwqDCoMKgwqAgY2gtPnNjYW5fdHlwZS5zdG9yYWdlYml0cyA9IDMyOwo+ PsKgwqDCoMKgwqDCoMKgIGFkYy0+Y2hfaWQgPSBjaC0+Y2hhbm5lbDsKPj4gQEAgLTU3Myw2ICsx MDEwLDU4IEBAIHN0YXRpYyBpbnQgc3RtMzJfZGZzZG1fYWRjX2NoYW5faW5pdF9vbmUoc3RydWN0 IGlpb19kZXYgKmluZGlvX2RldiwKPj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICZhZGMtPmRm c2RtLT5jaF9saXN0W2NoLT5jaGFubmVsXSk7Cj4+wqAgfQo+PsKgIAo+PiArc3RhdGljIGludCBz dG0zMl9kZnNkbV9hdWRpb19pbml0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCj4+ICt7Cj4+ ICvCoMKgwqDCoCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2g7Cj4+ICvCoMKgwqDCoCBzdHJ1Y3Qg c3RtMzJfZGZzZG1fYWRjICphZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOwo+PiArwqDCoMKgwqAg aW50IHJldDsKPj4gKwo+PiArwqDCoMKgwqAgcmV0ID0gc3RtMzJfZGZzZG1fZG1hX3JlcXVlc3Qo aW5kaW9fZGV2KTsKPj4gK8KgwqDCoMKgIGlmIChyZXQpIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBkZXZfZXJyKCZpbmRpb19kZXYtPmRldiwgIkRNQSByZXF1ZXN0IGZhaWxlZFxuIik7 Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHJldDsKPj4gK8KgwqDCoMKgIH0K Pj4gKwo+PiArwqDCoMKgwqAgaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19CVUZGRVJfU09GVFdB UkU7Cj4+ICsKPj4gK8KgwqDCoMKgIHJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKGlu ZGlvX2RldiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICZpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIE5VTEwsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmc3RtMzJf ZGZzZG1fYnVmZmVyX3NldHVwX29wcyk7Cj4+ICvCoMKgwqDCoCBpZiAocmV0KSB7Cj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsICJCdWZmZXIgc2V0 dXAgZmFpbGVkXG4iKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIGVycl9kbWFf ZGlzYWJsZTsKPj4gK8KgwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgwqAgY2ggPSBkZXZtX2t6YWxs b2MoJmluZGlvX2Rldi0+ZGV2LCBzaXplb2YoKmNoKSwgR0ZQX0tFUk5FTCk7Cj4+ICvCoMKgwqDC oCBpZiAoIWNoKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAtRU5PTUVNOwo+ PiArCj4+ICvCoMKgwqDCoCBjaC0+c2Nhbl9pbmRleCA9IDA7Cj4+ICvCoMKgwqDCoCByZXQgPSBz dG0zMl9kZnNkbV9hZGNfY2hhbl9pbml0X29uZShpbmRpb19kZXYsIGNoKTsKPj4gK8KgwqDCoMKg IGlmIChyZXQgPCAwKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZGV2X2VycigmaW5k aW9fZGV2LT5kZXYsICJjaGFubmVscyBpbml0IGZhaWxlZFxuIik7Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgZ290byBlcnJfYnVmZmVyX2NsZWFudXA7Cj4+ICvCoMKgwqDCoCB9Cj4+ICsK Pj4gK8KgwqDCoMKgIGluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gMTsKPj4gK8KgwqDCoMKgIGlu ZGlvX2Rldi0+Y2hhbm5lbHMgPSBjaDsKPj4gKwo+PiArwqDCoMKgwqAgcmV0dXJuIDA7Cj4+ICsK Pj4gK2Vycl9idWZmZXJfY2xlYW51cDoKPj4gK8KgwqDCoMKgIGlpb190cmlnZ2VyZWRfYnVmZmVy X2NsZWFudXAoaW5kaW9fZGV2KTsKPj4gKwo+PiArZXJyX2RtYV9kaXNhYmxlOgo+PiArwqDCoMKg wqAgaWYgKGFkYy0+ZG1hX2NoYW4pIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkbWFf ZnJlZV9jb2hlcmVudChhZGMtPmRtYV9jaGFuLT5kZXZpY2UtPmRldiwKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBERlNETV9E TUFfQlVGRkVSX1NJWkUsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYWRjLT5yeF9idWYsIGFkYy0+ZG1hX2J1Zik7Cj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZG1hX3JlbGVhc2VfY2hhbm5lbChhZGMtPmRtYV9jaGFu KTsKPj4gK8KgwqDCoMKgIH0KPj4gK8KgwqDCoMKgIHJldHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj7C oCBzdGF0aWMgaW50IHN0bTMyX2Rmc2RtX2FkY19pbml0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19k ZXYpCj4+wqAgewo+PsKgwqDCoMKgwqDCoMKgIHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaDsKPj4g QEAgLTYyNSwxMCArMTExNCwxOCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHN0bTMyX2Rmc2RtX2Rl dl9kYXRhIHN0bTMyaDdfZGZzZG1fYWRjX2RhdGEgPSB7Cj4+wqDCoMKgwqDCoMKgwqAgLmluaXQg PSBzdG0zMl9kZnNkbV9hZGNfaW5pdCwKPj7CoCB9Owo+PsKgIAo+PiArc3RhdGljIGNvbnN0IHN0 cnVjdCBzdG0zMl9kZnNkbV9kZXZfZGF0YSBzdG0zMmg3X2Rmc2RtX2F1ZGlvX2RhdGEgPSB7Cj4+ ICvCoMKgwqDCoCAudHlwZSA9IERGU0RNX0FVRElPLAo+PiArwqDCoMKgwqAgLmluaXQgPSBzdG0z Ml9kZnNkbV9hdWRpb19pbml0LAo+PiArfTsKPj4gKwo+PsKgIHN0YXRpYyBjb25zdCBzdHJ1Y3Qg b2ZfZGV2aWNlX2lkIHN0bTMyX2Rmc2RtX2FkY19tYXRjaFtdID0gewo+PsKgwqDCoMKgwqDCoMKg IHsgLmNvbXBhdGlibGUgPSAic3Qsc3RtMzItZGZzZG0tYWRjIiwKPj7CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgLmRhdGEgPSAmc3RtMzJoN19kZnNkbV9hZGNfZGF0YSwKPj7CoMKgwqDC oMKgwqDCoCB9LAo+PiArwqDCoMKgwqAgeyAuY29tcGF0aWJsZSA9ICJzdCxzdG0zMi1kZnNkbS1k bWljIiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAuZGF0YSA9ICZzdG0zMmg3X2Rmc2Rt X2F1ZGlvX2RhdGEsCj4+ICvCoMKgwqDCoCB9LAo+PsKgwqDCoMKgwqDCoMKgIHt9Cj4+wqAgfTsK Pj7CoCAKPj4gQEAgLTY3OSw4ICsxMTc2LDEzIEBAIHN0YXRpYyBpbnQgc3RtMzJfZGZzZG1fYWRj X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4+wqDCoMKgwqDCoMKgwqAgbmFt ZSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigiZGZzZG0tYWRjMCIpLCBHRlBfS0VSTkVMKTsK Pj7CoMKgwqDCoMKgwqDCoCBpZiAoIW5hbWUpCj4+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHJldHVybiAtRU5PTUVNOwo+PiAtwqDCoMKgwqAgaWlvLT5pbmZvID0gJnN0bTMyX2Rmc2Rt X2luZm9fYWRjOwo+PiAtwqDCoMKgwqAgc25wcmludGYobmFtZSwgc2l6ZW9mKCJkZnNkbS1hZGMw IiksICJkZnNkbS1hZGMlZCIsIGFkYy0+ZmxfaWQpOwo+PiArwqDCoMKgwqAgaWYgKGRldl9kYXRh LT50eXBlID09IERGU0RNX0FVRElPKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWlv LT5pbmZvID0gJnN0bTMyX2Rmc2RtX2luZm9fYXVkaW87Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgc25wcmludGYobmFtZSwgc2l6ZW9mKCJkZnNkbS1wZG0wIiksICJkZnNkbS1wZG0lZCIs IGFkYy0+ZmxfaWQpOwo+PiArwqDCoMKgwqAgfSBlbHNlIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBpaW8tPmluZm8gPSAmc3RtMzJfZGZzZG1faW5mb19hZGM7Cj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgc25wcmludGYobmFtZSwgc2l6ZW9mKCJkZnNkbS1hZGMwIiksICJkZnNk bS1hZGMlZCIsIGFkYy0+ZmxfaWQpOwo+PiArwqDCoMKgwqAgfQo+PsKgwqDCoMKgwqDCoMKgIGlp by0+bmFtZSA9IG5hbWU7Cj4+wqAgCj4+wqDCoMKgwqDCoMKgwqAgLyoKPj4gQEAgLTcyMSw3ICsx MjIzLDE0IEBAIHN0YXRpYyBpbnQgc3RtMzJfZGZzZG1fYWRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZv cm1fZGV2aWNlICpwZGV2KQo+PsKgwqDCoMKgwqDCoMKgIHN0cnVjdCBpaW9fZGV2ICppbmRpb19k ZXYgPSBpaW9fcHJpdl90b19kZXYoYWRjKTsKPj7CoCAKPj7CoMKgwqDCoMKgwqDCoCBpaW9fZGV2 aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKPj4gLQo+PiArwqDCoMKgwqAgaWYgKGluZGlvX2Rl di0+cG9sbGZ1bmMpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWlvX3RyaWdnZXJlZF9i dWZmZXJfY2xlYW51cChpbmRpb19kZXYpOwo+PiArwqDCoMKgwqAgaWYgKGFkYy0+ZG1hX2NoYW4p IHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkbWFfZnJlZV9jb2hlcmVudChhZGMtPmRt YV9jaGFuLT5kZXZpY2UtPmRldiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBERlNETV9ETUFfQlVGRkVSX1NJWkUsCj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgYWRjLT5yeF9idWYsIGFkYy0+ZG1hX2J1Zik7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgZG1hX3JlbGVhc2VfY2hhbm5lbChhZGMtPmRtYV9jaGFuKTsKPj4gK8KgwqDCoMKgIH0KPj7C oMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPj7CoCB9Cj4+wqAgCj4+IGRpZmYgLS1naXQgYS9pbmNs dWRlL2xpbnV4L2lpby9hZGMvc3RtMzItZGZzZG0tYWRjLmggYi9pbmNsdWRlL2xpbnV4L2lpby9h ZGMvc3RtMzItZGZzZG0tYWRjLmgKPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4gaW5kZXggMDAw MDAwMC4uNjg4NTY0NQo+PiAtLS0gL2Rldi9udWxsCj4+ICsrKyBiL2luY2x1ZGUvbGludXgvaWlv L2FkYy9zdG0zMi1kZnNkbS1hZGMuaAo+PiBAQCAtMCwwICsxLDI3IEBACj4+ICsvKgo+PiArICog VGhpcyBmaWxlIGRpc2NyaWJlIHRoZSBTVE0zMiBERlNETSBJSU8gZHJpdmVyIEFQSSBmb3IgYXVk aW8gcGFydAo+PiArICoKPj4gKyAqIENvcHlyaWdodCAoQykgMjAxNywgU1RNaWNyb2VsZWN0cm9u aWNzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAo+PiArICogQXV0aG9yKHMpOiBBcm5hdWQgUG91bGlx dWVuIDxhcm5hdWQucG91bGlxdWVuQHN0LmNvbT4uCj4+ICsgKgo+PiArICogTGljZW5zZSB0ZXJt czogR1BMIFYyLjAuCj4+ICsgKgo+PiArICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKPj4gKyAqIHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1 Ymxpc2hlZCBieQo+PiArICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KPj4gKyAqCj4+ ICsgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs IGJlIHVzZWZ1bCwgYnV0Cj4+ICsgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgo+PiArICogRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgZm9yIG1vcmUKPj4gKyAqIGRldGFpbHMuCj4+ICsgKi8KPj4gKyNpZm5kZWYgU1RNMzJf REZTRE1fQURDX0gKPj4gKyNkZWZpbmUgU1RNMzJfREZTRE1fQURDX0gKPj4gKwo+PiAraW50IHN0 bTMyX2Rmc2RtX2dldF9idWZmX2NiKHN0cnVjdCBpaW9fZGV2ICppaW9fZGV2LAo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGludCAoKmNiKShjb25z dCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZvaWQgKnByaXZhdGUp LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZv aWQgKnByaXZhdGUpOwo+PiAraW50IHN0bTMyX2Rmc2RtX3JlbGVhc2VfYnVmZl9jYihzdHJ1Y3Qg aWlvX2RldiAqaWlvX2Rldik7Cj4+ICsKPj4gKyNlbmRpZgo+IApfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBbHNhLWRldmVsIG1haWxpbmcgbGlzdApBbHNh LWRldmVsQGFsc2EtcHJvamVjdC5vcmcKaHR0cDovL21haWxtYW4uYWxzYS1wcm9qZWN0Lm9yZy9t YWlsbWFuL2xpc3RpbmZvL2Fsc2EtZGV2ZWwK