LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qKgogKiBAZmlsZSB0YWJsZV9pdGVyYXRvci5oCiAqIEBhZGR0b2dyb3VwIHRhYmxlX2l0ZXJhdG9yCiAqIEB7CiAqLwojaWZuZGVmIF9UQUJMRV9JVEVSQVRPUl9IQU5ETEVSX0hfCiNkZWZpbmUgX1RBQkxFX0lURVJBVE9SX0hBTkRMRVJfSF8KCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gICAgICAgICAgIkMiIHsKI2VuZGlmCgogICAgc3RydWN0IG5ldHNubXBfaXRlcmF0b3JfaW5mb19zOwoKICAgIHR5cGVkZWYgbmV0c25tcF92YXJpYWJsZV9saXN0ICoKICAgICAgICAgICAgICAgKE5ldHNubXBfRmlyc3RfRGF0YV9Qb2ludCkgKHZvaWQgKipsb29wX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YV9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0c25tcF9pdGVyYXRvcl9pbmZvX3MgKik7CiAgICB0eXBlZGVmIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqCiAgICAgICAgICAgICAgIChOZXRzbm1wX05leHRfRGF0YV9Qb2ludCkgICh2b2lkICoqbG9vcF9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGFfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldHNubXBfaXRlcmF0b3JfaW5mb19zICopOwogICAgdHlwZWRlZiB2b2lkICooTmV0c25tcF9NYWtlX0RhdGFfQ29udGV4dCkgKHZvaWQgKmxvb3BfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldHNubXBfaXRlcmF0b3JfaW5mb19zICopOwogICAgdHlwZWRlZiB2b2lkICAoTmV0c25tcF9GcmVlX0xvb3BfQ29udGV4dCkgKHZvaWQgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldHNubXBfaXRlcmF0b3JfaW5mb19zICopOwogICAgdHlwZWRlZiB2b2lkICAoTmV0c25tcF9GcmVlX0RhdGFfQ29udGV4dCkgKHZvaWQgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldHNubXBfaXRlcmF0b3JfaW5mb19zICopOwoKICAgIC8qKiBAdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9pdGVyYXRvcl9pbmZvX3MgbmV0c25tcF9pdGVyYXRvcl9pbmZvCiAgICAgKiBUeXBlZGVmcyB0aGUgbmV0c25tcF9pdGVyYXRvcl9pbmZvX3Mgc3RydWN0IGludG8gbmV0c25tcF9pdGVyYXRvcl9pbmZvICovCgogICAgLyoqIEBzdHJ1Y3QgbmV0c25tcF9pdGVyYXRvcl9pbmZvX3MKCiAgICAgKiBIb2xkcyBpdGVyYXRvciBpbmZvcm1hdGlvbiBjb250YWluaW5nIGZ1bmN0aW9ucyB3aGljaCBzaG91bGQgYmUKICAgICAgIGNhbGxlZCBieSB0aGUgaXRlcmF0b3JfaGFuZGxlciB0byBsb29wIG92ZXIgeW91ciBkYXRhIHNldCBhbmQKICAgICAgIHNvcnQgaXQgaW4gYSBTTk1QIHNwZWNpZmljIG1hbm5lci4KICAgICAgIAogICAgICAgVGhlIG5ldHNubXBfaXRlcmF0b3JfaW5mbyB0eXBlZGVmIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgZGlyZWN0bHkgY2FsbGluZyB0aGlzIHN0cnVjdCBpZiB5b3Ugd291bGQgcHJlZmVyLgogICAgICovCiAgICB0eXBlZGVmIHN0cnVjdCBuZXRzbm1wX2l0ZXJhdG9yX2luZm9fcyB7CiAgICAgICAvKiogTnVtYmVyIG9mIGhhbmRsZXJzIHRoYXQgb3duIHRoaXMgZGF0YSBzdHJ1Y3R1cmUuICovCiAgICAgICBpbnQgcmVmY250OwoKICAgICAgIC8qKiBSZXNwb25zaWJsZSBmb3I6IHJldHVybmluZyB0aGUgZmlyc3Qgc2V0IG9mICJpbmRleCIgZGF0YSwgYQogICAgICAgICAgIGxvb3AtY29udGV4dCBwb2ludGVyLCBhbmQgb3B0aW9uYWxseSBhIGRhdGEgY29udGV4dAogICAgICAgICAgIHBvaW50ZXIgKi8KICAgICAgICBOZXRzbm1wX0ZpcnN0X0RhdGFfUG9pbnQgKmdldF9maXJzdF9kYXRhX3BvaW50OwoKICAgICAgIC8qKiBHaXZlbiB0aGUgcHJldmlvdXMgbG9vcCBjb250ZXh0LCB0aGlzIHNob3VsZCByZXR1cm4gdGhlCiAgICAgICAgICAgbmV4dCBsb29wIGNvbnRleHQsIGFzc29jaWF0ZWQgaW5kZXggc2V0IGFuZCBvcHRpb25hbGx5IGEKICAgICAgICAgICBkYXRhIGNvbnRleHQgKi8KICAgICAgICBOZXRzbm1wX05leHRfRGF0YV9Qb2ludCAqZ2V0X25leHRfZGF0YV9wb2ludDsKCiAgICAgICAvKiogSWYgYSBkYXRhIGNvbnRleHQgd2Fzbid0IHN1cHBsaWVkIGJ5IHRoZQogICAgICAgICAgIGdldF9maXJzdF9kYXRhX3BvaW50IG9yIGdldF9uZXh0X2RhdGFfcG9pbnQgZnVuY3Rpb25zIGFuZAogICAgICAgICAgIHRoZSBtYWtlX2RhdGFfY29udGV4dCBwb2ludGVyIGlzIGRlZmluZWQsIGl0IHdpbGwgYmUgY2FsbGVkCiAgICAgICAgICAgdG8gY29udmVydCBhIGxvb3AgY29udGV4dCBpbnRvIGEgZGF0YSBjb250ZXh0LiAqLwogICAgICAgIE5ldHNubXBfTWFrZV9EYXRhX0NvbnRleHQgKm1ha2VfZGF0YV9jb250ZXh0OwoKICAgICAgIC8qKiBBIGZ1bmN0aW9uIHdoaWNoIHNob3VsZCBmcmVlIHRoZSBsb29wIGNvbnRleHQuICBUaGlzCiAgICAgICAgICAgZnVuY3Rpb24gaXMgY2FsbGVkIGF0ICplYWNoKiBpdGVyYXRpb24gc3RlcCwgd2hpY2ggaXMKICAgICAgICAgICBub3Qtb3B0aW1hbCBmb3Igc3BlZWQgcHVycG9zZXMuICBUaGUgdXNlIG9mCiAgICAgICAgICAgZnJlZV9sb29wX2NvbnRleHRfYXRfZW5kIGluc3RlYWQgaXMgc3Ryb25nbHkKICAgICAgICAgICBlbmNvdXJhZ2VkLiBUaGlzIGNhbiBiZSBzZXQgdG8gTlVMTCB0byBhdm9pZCBpdHMgdXNhZ2UuICovCiAgICAgICAgTmV0c25tcF9GcmVlX0xvb3BfQ29udGV4dCAqZnJlZV9sb29wX2NvbnRleHQ7CgogICAgICAgLyoqIEZyZWVzIGEgZGF0YSBjb250ZXh0LiAgVGhpcyB3aWxsIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBhCiAgICAgICAgICAgZGF0YSBjb250ZXh0IG5lZWRzIHRvIGJlIGZyZWVkLiAgVGhpcyBtYXkgYmUgYXQgdGhlIHNhbWUKICAgICAgICAgICB0aW1lIGFzIGEgY29ycmVzcG9uZG5nIGxvb3AgY29udGV4dCBpcyBmcmVlZCwgb3IgbXVjaCBtdWNoCiAgICAgICAgICAgbGF0ZXIuICBNdWx0aXBsZSBkYXRhIGNvbnRleHRzIG1heSBiZSBrZXB0IGluIGV4aXN0ZW5jZSBhdAogICAgICAgICAgIGFueSB0aW1lLiAqLwogICAgICAgTmV0c25tcF9GcmVlX0RhdGFfQ29udGV4dCAqZnJlZV9kYXRhX2NvbnRleHQ7CgogICAgICAgLyoqIEZyZWVzIGEgbG9vcCBjb250ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGVudGlyZSBpdGVyYXRpb24KICAgICAgICAgICBzZXF1ZW5jZS4gIEdlbmVyYWxseSwgdGhpcyB3b3VsZCBmcmVlIHRoZSBsb29wIGNvbnRleHQKICAgICAgICAgICBhbGxvY2F0ZWQgYnkgdGhlIGdldF9maXJzdF9kYXRhX3BvaW50IGZ1bmN0aW9uICh3aGljaCB3b3VsZAogICAgICAgICAgIHRoZW4gYmUgdXBkYXRlZCBieSBlYWNoIGNhbGwgdG8gdGhlIGdldF9uZXh0X2RhdGFfcG9pbnQKICAgICAgICAgICBmdW5jdGlvbikuICBJdCBpcyBub3QgY2FsbGVkIHVudGlsIHRoZSBnZXRfbmV4dF9kYXRhX3BvaW50CiAgICAgICAgICAgZnVuY3Rpb24gcmV0dXJucyBhIE5VTEwgKi8KICAgICAgICBOZXRzbm1wX0ZyZWVfTG9vcF9Db250ZXh0ICpmcmVlX2xvb3BfY29udGV4dF9hdF9lbmQ7CgogICAgICAgLyoqIFRoaXMgY2FuIGJlIHVzZWQgYnkgY2xpZW50IGhhbmRsZXJzIHRvIHN0b3JlIGFueQogICAgICAgICAgIGluZm9ybWF0aW9uIHRoZXkgbmVlZCAqLwogICAgICAgIHZvaWQgICAgICAgICAgICpteXZvaWQ7CiAgICAgICAgaW50ICAgICAgICAgICAgIGZsYWdzOwojZGVmaW5lIE5FVFNOTVBfSVRFUkFUT1JfRkxBR19TT1JURUQJMHgwMQojZGVmaW5lIE5FVFNOTVBfSEFORExFUl9PV05TX0lJTkZPCTB4MDIKCiAgICAgICAvKiogQSBwb2ludGVyIHRvIHRoZSBuZXRzbm1wX3RhYmxlX3JlZ2lzdHJhdGlvbl9pbmZvIG9iamVjdAogICAgICAgICAgIHRoaXMgaXRlcmF0b3IgaXMgcmVnaXN0ZXJlZCBhbG9uZyB3aXRoLiAqLwogICAgICAgIG5ldHNubXBfdGFibGVfcmVnaXN0cmF0aW9uX2luZm8gKnRhYmxlX3JlZ2luZm87CgogICAgICAgIC8qIEV4cGVyaW1lbnRhbCBleHRlbnNpb24gLSBVc2UgQXQgWW91ciBPd24gUmlzawogICAgICAgICAgICh0aGVzZSB0d28gZmllbGRzIG1heSBjaGFuZ2UvZGlzYXBwZWFyIHdpdGhvdXQgd2FybmluZykgKi8KICAgICAgICBOZXRzbm1wX0ZpcnN0X0RhdGFfUG9pbnQgKmdldF9yb3dfaW5kZXhlczsKICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKmluZGV4ZXM7CiAgICB9IG5ldHNubXBfaXRlcmF0b3JfaW5mbzsKCiNkZWZpbmUgVEFCTEVfSVRFUkFUT1JfTkFNRSAidGFibGVfaXRlcmF0b3IiCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIEl0ZXJhdG9yIEFQSTogVGFibGUgbWFpbnRlbmFuY2UKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogICAgICAgIC8qIE4vQSAqLwoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBJdGVyYXRvciBBUEk6IE1JQiBtYWludGVuYW5jZQogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgogICAgdm9pZCAgIG5ldHNubXBfaGFuZGxlcl9vd25zX2l0ZXJhdG9yX2luZm8obmV0c25tcF9taWJfaGFuZGxlciAqaCk7CiAgICBuZXRzbm1wX21pYl9oYW5kbGVyCiAgICAgICAgICAqbmV0c25tcF9nZXRfdGFibGVfaXRlcmF0b3JfaGFuZGxlcihuZXRzbm1wX2l0ZXJhdG9yX2luZm8gKmlpbmZvKTsKICAgIGludCBuZXRzbm1wX3JlZ2lzdGVyX3RhYmxlX2l0ZXJhdG9yKG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gKnJlZ2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2l0ZXJhdG9yX2luZm8gKmlpbmZvKTsKICAgIHZvaWQgIG5ldHNubXBfaXRlcmF0b3JfZGVsZXRlX3RhYmxlKG5ldHNubXBfaXRlcmF0b3JfaW5mbyAqaWluZm8pOwoKICAgIHZvaWQgKm5ldHNubXBfZXh0cmFjdF9pdGVyYXRvcl9jb250ZXh0KG5ldHNubXBfcmVxdWVzdF9pbmZvICopOwogICAgdm9pZCAgIG5ldHNubXBfaW5zZXJ0X2l0ZXJhdG9yX2NvbnRleHQobmV0c25tcF9yZXF1ZXN0X2luZm8gKiwgdm9pZCAqKTsKCiAgICBOZXRzbm1wX05vZGVfSGFuZGxlciBuZXRzbm1wX3RhYmxlX2l0ZXJhdG9yX2hlbHBlcl9oYW5kbGVyOwoKI2RlZmluZSBuZXRzbm1wX3JlZ2lzdGVyX3RhYmxlX2l0ZXJhdG9yMihyZWdpbmZvLCBpaW5mbykgICAgICAgIFwKICAgICgoKGlpbmZvKS0+ZmxhZ3MgfD0gTkVUU05NUF9IQU5ETEVSX09XTlNfSUlORk8pLCAgICAgICAgICAgXAogICAgICAgIG5ldHNubXBfcmVnaXN0ZXJfdGFibGVfaXRlcmF0b3IoKHJlZ2luZm8pLCAoaWluZm8pKSkKCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIEl0ZXJhdG9yIEFQSTogUm93IG9wZXJhdGlvbnMKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKdm9pZCAqbmV0c25tcF9pdGVyYXRvcl9yb3dfZmlyc3QoICAgICAgbmV0c25tcF9pdGVyYXRvcl9pbmZvICopOwp2b2lkICpuZXRzbm1wX2l0ZXJhdG9yX3Jvd19nZXQoICAgICAgICBuZXRzbm1wX2l0ZXJhdG9yX2luZm8gKiwgdm9pZCAqKTsKdm9pZCAqbmV0c25tcF9pdGVyYXRvcl9yb3dfbmV4dCggICAgICAgbmV0c25tcF9pdGVyYXRvcl9pbmZvICosIHZvaWQgKik7CnZvaWQgKm5ldHNubXBfaXRlcmF0b3Jfcm93X2dldF9ieWlkeCggIG5ldHNubXBfaXRlcmF0b3JfaW5mbyAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKik7CnZvaWQgKm5ldHNubXBfaXRlcmF0b3Jfcm93X25leHRfYnlpZHgoIG5ldHNubXBfaXRlcmF0b3JfaW5mbyAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKik7CnZvaWQgKm5ldHNubXBfaXRlcmF0b3Jfcm93X2dldF9ieW9pZCggIG5ldHNubXBfaXRlcmF0b3JfaW5mbyAqLCBvaWQgKiwgc2l6ZV90KTsKdm9pZCAqbmV0c25tcF9pdGVyYXRvcl9yb3dfbmV4dF9ieW9pZCggbmV0c25tcF9pdGVyYXRvcl9pbmZvICosIG9pZCAqLCBzaXplX3QpOwppbnQgICBuZXRzbm1wX2l0ZXJhdG9yX3Jvd19jb3VudCggICAgICBuZXRzbm1wX2l0ZXJhdG9yX2luZm8gKik7CgoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBJdGVyYXRvciBBUEk6IEluZGV4IG9wZXJhdGlvbnMKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmCgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIF9UQUJMRV9JVEVSQVRPUl9IQU5ETEVSX0hfICovCi8qKiBAfSAqLwo=