Lyogc2V0dGVybS5jLCBzZXQgdGVybWluYWwgYXR0cmlidXRlcy4KICoKICogQ29weXJpZ2h0IChDKSAxOTkwIEdvcmRvbiBJcmxhbSAoZ29yZG9uaUBjcy51YS5vei5hdSkuICBDb25kaXRpb25zIG9mIHVzZSwKICogbW9kaWZpY2F0aW9uLCBhbmQgcmVkaXN0cmlidXRpb24gYXJlIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBDT1BZUklHSFQgdGhhdAogKiBmb3JtcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLgogKiAKICogQWRhcHRpb24gdG8gTGludXggYnkgUGV0ZXIgTWFjRG9uYWxkLgogKgogKiBFbmhhbmNlbWVudHMgYnkgTWlrYSBMaWxqZWJlcmcgKGxpbGplYmVyQGNzLkhlbHNpbmtpLkZJKQogKgogKiBCZWVwIG1vZGlmaWNhdGlvbnMgYnkgQ2hyaXN0b3BoZSBKb2xpZiAoY2pvbGlmQHN0b3JtLmdhdGVsaW5rLmZyLm5ldCkKICoKICogU2FuaXR5IGluY3JlYXNlcyBieSBDYWZlaW5lIEFkZGljdCBbc2ljXS4KICoKICogUG93ZXJzYXZlIGZlYXR1cmVzIGJ5IHRvZGQgai4gZGVyciA8dGpkQHdvcmRzbWl0aC5vcmc+CiAqCiAqIENvbnZlcnRlZCB0byB0ZXJtaW5mbyBieSBLYXJzIGRlIEpvbmcgKGpvbmdrQGNzLnV0d2VudGUubmwpCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqCiAqIFN5bnRheDoKICoKICogc2V0dGVybQogKiAgIFsgLXRlcm0gdGVybWluYWxfbmFtZSBdCiAqICAgWyAtcmVzZXQgXQogKiAgIFsgLWluaXRpYWxpemUgXQogKiAgIFsgLWN1cnNvciBbb258b2ZmXSBdCiAqICAgWyAtcmVwZWF0IFtvbnxvZmZdIF0KICogICBbIC1hcHBjdXJzb3JrZXlzIFtvbnxvZmZdIF0KICogICBbIC1saW5ld3JhcCBbb258b2ZmXSBdCiAqICAgWyAtc25vdyBbb258b2ZmXSBdCiAqICAgWyAtc29mdHNjcm9sbCBbb258b2ZmXSBdCiAqICAgWyAtZGVmYXVsdHMgXQogKiAgIFsgLWZvcmVncm91bmQgYmxhY2t8cmVkfGdyZWVufHllbGxvd3xibHVlfG1hZ2VudGF8Y3lhbnx3aGl0ZXxkZWZhdWx0IF0KICogICBbIC1iYWNrZ3JvdW5kIGJsYWNrfHJlZHxncmVlbnx5ZWxsb3d8Ymx1ZXxtYWdlbnRhfGN5YW58d2hpdGV8ZGVmYXVsdCBdCiAqICAgWyAtdWxjb2xvciBibGFja3xncmV5fHJlZHxncmVlbnx5ZWxsb3d8Ymx1ZXxtYWdlbnRhfGN5YW58d2hpdGUgXQogKiAgIFsgLXVsY29sb3IgYnJpZ2h0IHJlZHxncmVlbnx5ZWxsb3d8Ymx1ZXxtYWdlbnRhfGN5YW58d2hpdGUgXQogKiAgIFsgLWhiY29sb3IgYmxhY2t8Z3JleXxyZWR8Z3JlZW58eWVsbG93fGJsdWV8bWFnZW50YXxjeWFufHdoaXRlIF0KICogICBbIC1oYmNvbG9yIGJyaWdodCByZWR8Z3JlZW58eWVsbG93fGJsdWV8bWFnZW50YXxjeWFufHdoaXRlIF0KICogICBbIC1pbnZlcnNlc2NyZWVuIFtvbnxvZmZdIF0KICogICBbIC1ib2xkIFtvbnxvZmZdIF0KICogICBbIC1oYWxmLWJyaWdodCBbb258b2ZmXSBdCiAqICAgWyAtYmxpbmsgW29ufG9mZl0gXQogKiAgIFsgLXJldmVyc2UgW29ufG9mZl0gXQogKiAgIFsgLXVuZGVybGluZSBbb258b2ZmXSBdCiAqICAgWyAtc3RvcmUgXQogKiAgIFsgLWNsZWFyIFsgYWxsfHJlc3QgXSBdCiAqICAgWyAtdGFicyBbdGFiMSB0YWIyIHRhYjMgLi4uIF0gXSAgICAgKHRhYm4gPSAxLTE2MCkKICogICBbIC1jbHJ0YWJzIFsgdGFiMSB0YWIyIHRhYjMgLi4uIF0gICAodGFibiA9IDEtMTYwKQogKiAgIFsgLXJlZ3RhYnMgWzEtMTYwXSBdCiAqICAgWyAtYmxhbmsgWzAtNjB8Zm9yY2V8cG9rZXxdIF0KICogICBbIC1kdW1wICAgWzEtTlJfQ09OUyBdIF0KICogICBbIC1hcHBlbmQgWzEtTlJfQ09OUyBdIF0KICogICBbIC1maWxlIGR1bXBmaWxlbmFtZSBdCiAqICAgWyAtc3RhbmRvdXQgW2F0dHJdIF0KICogICBbIC1tc2cgW29ufG9mZl0gXQogKiAgIFsgLW1zZ2xldmVsIFswLThdIF0KICogICBbIC1wb3dlcnNhdmUgW29ufHZzeW5jfGhzeW5jfHBvd2VyZG93bnxvZmZdIF0KICogICBbIC1wb3dlcmRvd24gWzAtNjBdIF0KICogICBbIC1ibGVuZ3RoIFswLTIwMDBdIF0KICogICBbIC1iZnJlcSBmcmVxIF0KICoKICoKICogU2VtYW50aWNzOgogKgogKiBTZXR0ZXJtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQgYSBjaGFyYWN0ZXIgc3RyaW5nIHRoYXQgd2lsbAogKiBpbnZva2UgdGhlIHNwZWNpZmllZCB0ZXJtaW5hbCBjYXBhYmlsaXRpZXMuICBXaGVyZSBwb3NzaWJpbGUKICogdGVybWluZm8gaXMgY29uc3VsdGVkIHRvIGZpbmQgdGhlIHN0cmluZyB0byB1c2UuICBTb21lIG9wdGlvbnMKICogaG93ZXZlciBkbyBub3QgY29ycmVzcG9uZCB0byBhIHRlcm1pbmZvIGNhcGFiaWxpdHkuICBJbiB0aGlzIGNhc2UgaWYKICogdGhlIHRlcm1pbmFsIHR5cGUgaXMgImNvbioiLCBvciAibGludXgqIiB0aGUgc3RyaW5nIHRoYXQgaW52b2tlcwogKiB0aGUgc3BlY2lmaWVkIGNhcGFiaWxpdGllcyBvbiB0aGUgUEMgTGludXggdmlydHVhbCBjb25zb2xlIGRyaXZlcgogKiBpcyBvdXRwdXQuICBPcHRpb25zIHRoYXQgYXJlIG5vdCBpbXBsZW1lbnRlZCBieSB0aGUgdGVybWluYWwgYXJlCiAqIGlnbm9yZWQuCiAqCiAqIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgbm9uLW9idmlvdXMuCiAqCiAqICAgLXRlcm0gY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIFRFUk0gZW52aXJvbm1lbnQgdmFyaWFibGUuCiAqCiAqICAgLXJlc2V0IGRpc3BsYXlzIHRoZSB0ZXJtaW5hbCByZXNldCBzdHJpbmcsIHdoaWNoIHR5cGljYWxseSByZXNldHMgdGhlCiAqICAgICAgdGVybWluYWwgdG8gaXRzIHBvd2VyIG9uIHN0YXRlLgogKgogKiAgIC1pbml0aWFsaXplIGRpc3BsYXlzIHRoZSB0ZXJtaW5hbCBpbml0aWFsaXphdGlvbiBzdHJpbmcsIHdoaWNoIHR5cGljYWxseQogKiAgICAgIHNldHMgdGhlIHRlcm1pbmFsJ3MgcmVuZGVyaW5nIG9wdGlvbnMsIGFuZCBvdGhlciBhdHRyaWJ1dGVzIHRvIHRoZQogKiAgICAgIGRlZmF1bHQgdmFsdWVzLgogKgogKiAgIC1kZWZhdWx0IHNldHMgdGhlIHRlcm1pbmFsJ3MgcmVuZGVyaW5nIG9wdGlvbnMgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLgogKgogKiAgIC1zdG9yZSBzdG9yZXMgdGhlIHRlcm1pbmFsJ3MgY3VycmVudCByZW5kZXJpbmcgb3B0aW9ucyBhcyB0aGUgZGVmYXVsdAogKiAgICAgIHZhbHVlcy4gICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2lmbmRlZiBOQ1VSU0VTX0NPTlNUCiNkZWZpbmUgTkNVUlNFU19DT05TVCBjb25zdAkvKiBkZWZpbmUgYmVmb3JlIGluY2x1ZGluZyB0ZXJtLmggKi8KI2VuZGlmCiNpbmNsdWRlIDx0ZXJtLmg+CgojaWZkZWYgSEFWRV9OQ1VSU0VTX0gKI2luY2x1ZGUgPG5jdXJzZXMuaD4KI2VsaWYgZGVmaW5lZChIQVZFX05DVVJTRVNfTkNVUlNFU19IKQojaW5jbHVkZSA8bmN1cnNlcy9uY3Vyc2VzLmg+CiNlbmRpZgoKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgkJLyogZm9yIE1BWFBBVEhMRU4gKi8KI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2lmZGVmIEhBVkVfTElOVVhfVElPQ0xfSAojaW5jbHVkZSA8bGludXgvdGlvY2wuaD4KI2VuZGlmCgojaW5jbHVkZSAiYy5oIgojaW5jbHVkZSAibmxzLmgiCgojaWYgX19HTlVfTElCUkFSWV9fIDwgNQojaWZuZGVmIF9fYWxwaGFfXwojIGluY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgojZGVmaW5lIF9fTlJfa2xvZ2N0bCBfX05SX3N5c2xvZwpfc3lzY2FsbDMoaW50LCBrbG9nY3RsLCBpbnQsIHR5cGUsIGNoYXIqLCBidWYsIGludCwgbGVuKTsKI2Vsc2UgLyogX19hbHBoYV9fICovCiNkZWZpbmUga2xvZ2N0bCBzeXNsb2cKI2VuZGlmCiNlbmRpZgpleHRlcm4gaW50IGtsb2djdGwoaW50IHR5cGUsIGNoYXIgKmJ1ZiwgaW50IGxlbik7CgovKiBDb25zdGFudHMuICovCgovKiBLZXlib2FyZCB0eXBlcy4gKi8KI2RlZmluZSBQQwkgMAojZGVmaW5lIE9MSVZFVFRJIDEKI2RlZmluZSBEVVRDSCAgICAyCiNkZWZpbmUgRVhURU5ERUQgMwoKLyogQ29sb3JzLiAqLwojZGVmaW5lIEJMQUNLICAgMAojZGVmaW5lIFJFRCAgICAgMQojZGVmaW5lIEdSRUVOICAgMgojZGVmaW5lIFlFTExPVyAgMwojZGVmaW5lIEJMVUUgICAgNAojZGVmaW5lIE1BR0VOVEEgNQojZGVmaW5lIENZQU4gICAgNgojZGVmaW5lIFdISVRFICAgNwojZGVmaW5lIEdSRVkJOAojZGVmaW5lIERFRkFVTFQgOQoKLyogQmxhbmsgY29tbWFuZHMgKi8KI2RlZmluZSBCTEFOS1NDUkVFTgktMQojZGVmaW5lIFVOQkxBTktTQ1JFRU4JLTIKI2RlZmluZSBCTEFOS0VEU0NSRUVOCS0zCgovKiA8bGludXgvdGlvY2wuaD4gZmFsbGJhY2sgKi8KI2lmbmRlZiBUSU9DTF9CTEFOS1NDUkVFTgojIGRlZmluZSBUSU9DTF9VTkJMQU5LU0NSRUVOCTQgICAgICAgLyogdW5ibGFuayBzY3JlZW4gKi8KIyBkZWZpbmUgVElPQ0xfU0VUVkVTQUJMQU5LCTEwICAgICAgLyogc2V0IHZlc2EgYmxhbmtpbmcgbW9kZSAqLwojIGRlZmluZSBUSU9DTF9CTEFOS1NDUkVFTgkxNAkvKiBrZWVwIHNjcmVlbiBibGFuayBldmVuIGlmIGEga2V5IGlzIHByZXNzZWQgKi8KIyBkZWZpbmUgVElPQ0xfQkxBTktFRFNDUkVFTgkxNQkvKiByZXR1cm4gd2hpY2ggdnQgd2FzIGJsYW5rZWQgKi8KI2VuZGlmCgovKiBDb250cm9sIHNlcXVlbmNlcy4gKi8KI2RlZmluZSBFU0MgIlwwMzMiCiNkZWZpbmUgRENTICJcMDMzUCIKI2RlZmluZSBTVCAgIlwwMzNcXCIKCi8qIFN0YXRpYyB2YXJpYWJsZXMuICovCgovKiBPcHRpb24gZmxhZ3MuICBTZXQgaWYgdGhlIG9wdGlvbiBpcyB0byBiZSBpbnZva2VkLiAqLwppbnQgb3B0X3Rlcm0sIG9wdF9yZXNldCwgb3B0X2luaXRpYWxpemUsIG9wdF9jdXJzb3I7CmludCBvcHRfbGluZXdyYXAsIG9wdF9zbm93LCBvcHRfc29mdHNjcm9sbCwgb3B0X2RlZmF1bHQsIG9wdF9mb3JlZ3JvdW5kOwppbnQgb3B0X2JhY2tncm91bmQsIG9wdF9ib2xkLCBvcHRfYmxpbmssIG9wdF9yZXZlcnNlLCBvcHRfdW5kZXJsaW5lOwppbnQgb3B0X3N0b3JlLCBvcHRfY2xlYXIsIG9wdF9ibGFuaywgb3B0X3NuYXAsIG9wdF9zbmFwZmlsZSwgb3B0X3N0YW5kb3V0OwppbnQgb3B0X2FwcGVuZCwgb3B0X3VsY29sb3IsIG9wdF9oYmNvbG9yLCBvcHRfaGFsZmJyaWdodCwgb3B0X3JlcGVhdDsKaW50IG9wdF90YWJzLCBvcHRfY2xydGFicywgb3B0X3JlZ3RhYnMsIG9wdF9hcHBjdXJzb3JrZXlzLCBvcHRfaW52ZXJzZXNjcmVlbjsKaW50IG9wdF9tc2csIG9wdF9tc2dsZXZlbCwgb3B0X3Bvd2Vyc2F2ZSwgb3B0X3Bvd2VyZG93bjsKaW50IG9wdF9ibGVuZ3RoLCBvcHRfYmZyZXE7CgovKiBPcHRpb24gY29udHJvbHMuICBUaGUgdmFyaWFibGUgbmFtZXMgaGF2ZSBiZWVuIGNvbnRyYWN0ZWQgdG8gZW5zdXJlCiAqIHVuaXF1ZW5lc3MuCiAqLwpjaGFyICpvcHRfdGVfdGVybWluYWxfbmFtZTsJLyogVGVybWluYWwgbmFtZS4gKi8KaW50IG9wdF9jdV9vbiwgb3B0X2xpX29uLCBvcHRfc25fb24sIG9wdF9zb19vbiwgb3B0X2JvX29uLCBvcHRfaGJfb24sIG9wdF9ibF9vbjsKaW50IG9wdF9yZV9vbiwgb3B0X3VuX29uLCBvcHRfcmVwX29uLCBvcHRfYXBwY2tfb24sIG9wdF9pbnZzY19vbjsKaW50IG9wdF9tc2dfb247CQkJLyogQm9vbGVhbiBzd2l0Y2hlcy4gKi8KaW50IG9wdF9rZV90eXBlOwkJLyogS2V5Ym9hcmQgdHlwZS4gKi8KaW50IG9wdF9mb19jb2xvciwgb3B0X2JhX2NvbG9yOwkvKiBDb2xvcnMuICovCmludCBvcHRfdWxfY29sb3IsIG9wdF9oYl9jb2xvcjsKaW50IG9wdF9jbF9hbGw7CQkJLyogQ2xlYXIgYWxsIG9yIHJlc3QuICovCmludCBvcHRfYmxfbWluOwkJCS8qIEJsYW5rIHNjcmVlbi4gKi8KaW50IG9wdF9ibGVuZ3RoX2w7CmludCBvcHRfYmZyZXFfZjsKaW50IG9wdF9zbl9udW07CQkJLyogU25hcCBzY3JlZW4uICovCmludCBvcHRfc3RfYXR0cjsKaW50IG9wdF9ydF9sZW47CQkJLyogcmVndWxhciB0YWIgbGVuZ3RoICovCmludCBvcHRfdGJfYXJyYXlbMTYxXTsJCS8qIEFycmF5IGZvciB0YWIgbGlzdCAqLwppbnQgb3B0X21zZ2xldmVsX251bTsKaW50IG9wdF9wc19tb2RlLCBvcHRfcGRfbWluOwkvKiBwb3dlcnNhdmUgbW9kZS9wb3dlcmRvd24gdGltZSAqLwoKY2hhciBvcHRfc25fbmFtZVsyMDBdID0gInNjcmVlbi5kdW1wIjsKCnN0YXRpYyB2b2lkIHNjcmVlbmR1bXAoaW50IHZjbnVtLCBGSUxFICpGKTsKCi8qIENvbW1hbmQgbGluZSBwYXJzaW5nIHJvdXRpbmVzLgogKgogKiBOb3RlIHRoYXQgaXQgaXMgYW4gZXJyb3IgZm9yIGEgZ2l2ZW4gb3B0aW9uIHRvIGJlIGludm9rZWQgbW9yZSB0aGFuIG9uY2UuCiAqLwoKc3RhdGljIHZvaWQKcGFyc2VfdGVybShpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGludCAqb3B0aW9uLCBjaGFyICoqb3B0X3Rlcm0sIGludCAqYmFkX2FyZykgewoJLyogYXJnYzogTnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgdGhpcyBvcHRpb24uICovCgkvKiBhcmd2OiBBcmd1bWVudHMgZm9yIHRoaXMgb3B0aW9uLiAqLwoJLyogb3B0aW9uOiBUZXJtIGZsYWcgdG8gc2V0LiAqLwoJLyogb3B0X3Rlcm06IFRlcm1pbmFsIG5hbWUgdG8gc2V0LiAqLwoJLyogYmFkX2FyZzogU2V0IHRvIHRydWUgaWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQuICovCgovKiBQYXJzZSBhIC10ZXJtIHNwZWNpZmljYXRpb24uICovCgoJaWYgKGFyZ2MgIT0gMSB8fCAqb3B0aW9uKQoJCSpiYWRfYXJnID0gVFJVRTsKCSpvcHRpb24gPSBUUlVFOwoJaWYgKGFyZ2MgPT0gMSkKCQkqb3B0X3Rlcm0gPSBhcmd2WzBdOwp9CgpzdGF0aWMgdm9pZApwYXJzZV9ub25lKGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50ICpvcHRpb24sIGludCAqYmFkX2FyZykgewoJLyogYXJnYzogTnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgdGhpcyBvcHRpb24uICovCgkvKiBhcmd2OiBBcmd1bWVudHMgZm9yIHRoaXMgb3B0aW9uLiAqLwoJLyogb3B0aW9uOiBUZXJtIGZsYWcgdG8gc2V0LiAqLwoJLyogYmFkX2FyZzogU2V0IHRvIHRydWUgaWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQuICovCgovKiBQYXJzZSBhIHBhcmFtZXRlcmxlc3Mgc3BlY2lmaWNhdGlvbi4gKi8KCglpZiAoYXJnYyAhPSAwIHx8ICpvcHRpb24pCgkJKmJhZF9hcmcgPSBUUlVFOwoJKm9wdGlvbiA9IFRSVUU7Cn0KCnN0YXRpYyB2b2lkCnBhcnNlX3N3aXRjaChpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGludCAqb3B0aW9uLCBpbnQgKm9wdF9vbiwgaW50ICpiYWRfYXJnKSB7CgkvKiBhcmdjOiBOdW1iZXIgb2YgYXJndW1lbnRzIGZvciB0aGlzIG9wdGlvbi4gKi8KCS8qIGFyZ3Y6IEFyZ3VtZW50cyBmb3IgdGhpcyBvcHRpb24uICovCgkvKiBvcHRpb246IE9wdGlvbiBmbGFnIHRvIHNldC4gKi8KCS8qIG9wdF9vbjogQm9vbGVhbiBvcHRpb24gc3dpdGNoIHRvIHNldCBvciByZXNldC4gKi8KCS8qIGJhZF9hcmc6IFNldCB0byB0cnVlIGlmIGFuIGVycm9yIGlzIGRldGVjdGVkLiAqLwoKLyogUGFyc2UgYSBib29sZWFuIChvbi9vZmYpIHNwZWNpZmljYXRpb24uICovCgoJaWYgKGFyZ2MgPiAxIHx8ICpvcHRpb24pCgkJKmJhZF9hcmcgPSBUUlVFOwoJKm9wdGlvbiA9IFRSVUU7CglpZiAoYXJnYyA9PSAxKSB7CgkJaWYgKHN0cmNtcChhcmd2WzBdLCAib24iKSA9PSAwKQoJCQkqb3B0X29uID0gVFJVRTsKCQllbHNlIGlmIChzdHJjbXAoYXJndlswXSwgIm9mZiIpID09IDApCgkJCSpvcHRfb24gPSBGQUxTRTsKCQllbHNlCgkJCSpiYWRfYXJnID0gVFJVRTsKCX0gZWxzZSB7CgkJKm9wdF9vbiA9IFRSVUU7Cgl9Cn0KCnN0YXRpYyB2b2lkCnBhcl9jb2xvcihpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGludCAqb3B0aW9uLCBpbnQgKm9wdF9jb2xvciwgaW50ICpiYWRfYXJnKSB7CgkvKiBhcmdjOiBOdW1iZXIgb2YgYXJndW1lbnRzIGZvciB0aGlzIG9wdGlvbi4gKi8KCS8qIGFyZ3Y6IEFyZ3VtZW50cyBmb3IgdGhpcyBvcHRpb24uICovCgkvKiBvcHRpb246IENvbG9yIGZsYWcgdG8gc2V0LiAqLwoJLyogb3B0X2NvbG9yOiBDb2xvciB0byBzZXQuICovCgkvKiBiYWRfYXJnOiBTZXQgdG8gdHJ1ZSBpZiBhbiBlcnJvciBpcyBkZXRlY3RlZC4gKi8KCi8qIFBhcnNlIGEgLWZvcmVncm91bmQgb3IgLWJhY2tncm91bmQgc3BlY2lmaWNhdGlvbi4gKi8KCglpZiAoYXJnYyAhPSAxIHx8ICpvcHRpb24pCgkJKmJhZF9hcmcgPSBUUlVFOwoJKm9wdGlvbiA9IFRSVUU7CglpZiAoYXJnYyA9PSAxKSB7CgkJaWYgKHN0cmNtcChhcmd2WzBdLCAiYmxhY2siKSA9PSAwKQoJCQkqb3B0X2NvbG9yID0gQkxBQ0s7CgkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMF0sICJyZWQiKSA9PSAwKQoJCQkqb3B0X2NvbG9yID0gUkVEOwoJCWVsc2UgaWYgKHN0cmNtcChhcmd2WzBdLCAiZ3JlZW4iKSA9PSAwKQoJCQkqb3B0X2NvbG9yID0gR1JFRU47CgkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMF0sICJ5ZWxsb3ciKSA9PSAwKQoJCQkqb3B0X2NvbG9yID0gWUVMTE9XOwoJCWVsc2UgaWYgKHN0cmNtcChhcmd2WzBdLCAiYmx1ZSIpID09IDApCgkJCSpvcHRfY29sb3IgPSBCTFVFOwoJCWVsc2UgaWYgKHN0cmNtcChhcmd2WzBdLCAibWFnZW50YSIpID09IDApCgkJCSpvcHRfY29sb3IgPSBNQUdFTlRBOwoJCWVsc2UgaWYgKHN0cmNtcChhcmd2WzBdLCAiY3lhbiIpID09IDApCgkJCSpvcHRfY29sb3IgPSBDWUFOOwoJCWVsc2UgaWYgKHN0cmNtcChhcmd2WzBdLCAid2hpdGUiKSA9PSAwKQoJCQkqb3B0X2NvbG9yID0gV0hJVEU7CgkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMF0sICJkZWZhdWx0IikgPT0gMCkKCQkJKm9wdF9jb2xvciA9IERFRkFVTFQ7CgkJZWxzZSBpZiAoaXNkaWdpdChhcmd2WzBdWzBdKSkKCQkJKm9wdF9jb2xvciA9IGF0b2koYXJndlswXSk7CgkJZWxzZQoJCQkqYmFkX2FyZyA9IFRSVUU7CgoJCWlmKCpvcHRfY29sb3IgPCAwIHx8ICpvcHRfY29sb3IgPiA5IHx8ICpvcHRfY29sb3IgPT0gOCkKCQkJKmJhZF9hcmcgPSBUUlVFOwoJfQp9CgpzdGF0aWMgdm9pZApwYXJfY29sb3IyKGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50ICpvcHRpb24sIGludCAqb3B0X2NvbG9yLCBpbnQgKmJhZF9hcmcpIHsKCS8qIGFyZ2M6IE51bWJlciBvZiBhcmd1bWVudHMgZm9yIHRoaXMgb3B0aW9uLiAqLwoJLyogYXJndjogQXJndW1lbnRzIGZvciB0aGlzIG9wdGlvbi4gKi8KCS8qIG9wdGlvbjogQ29sb3IgZmxhZyB0byBzZXQuICovCgkvKiBvcHRfY29sb3I6IENvbG9yIHRvIHNldC4gKi8KCS8qIGJhZF9hcmc6IFNldCB0byB0cnVlIGlmIGFuIGVycm9yIGlzIGRldGVjdGVkLiAqLwoKLyogUGFyc2UgYSAtdWxjb2xvciBvciAtaGJjb2xvciBzcGVjaWZpY2F0aW9uLiAqLwoKCWlmICghYXJnYyB8fCBhcmdjID4gMiB8fCAqb3B0aW9uKQoJCSpiYWRfYXJnID0gVFJVRTsKCSpvcHRpb24gPSBUUlVFOwoJKm9wdF9jb2xvciA9IDA7CglpZiAoYXJnYyA9PSAyKSB7CgkJaWYgKHN0cmNtcChhcmd2WzBdLCAiYnJpZ2h0IikgPT0gMCkKCQkJKm9wdF9jb2xvciA9IDg7CgkJZWxzZSB7CgkJCSpiYWRfYXJnID0gVFJVRTsKCQkJcmV0dXJuOwoJCX0KCX0KCWlmIChhcmdjKSB7CgkJaWYgKHN0cmNtcChhcmd2W2FyZ2MtMV0sICJibGFjayIpID09IDApIHsKCQkJaWYoKm9wdF9jb2xvcikKCQkJCSpiYWRfYXJnID0gVFJVRTsKCQkJZWxzZQoJCQkJKm9wdF9jb2xvciA9IEJMQUNLOwoJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbYXJnYy0xXSwgImdyZXkiKSA9PSAwKSB7CgkJCWlmKCpvcHRfY29sb3IpCgkJCQkqYmFkX2FyZyA9IFRSVUU7CgkJCWVsc2UKCQkJCSpvcHRfY29sb3IgPSBHUkVZOwoJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbYXJnYy0xXSwgInJlZCIpID09IDApCgkJCSpvcHRfY29sb3IgfD0gUkVEOwoJCWVsc2UgaWYgKHN0cmNtcChhcmd2W2FyZ2MtMV0sICJncmVlbiIpID09IDApCgkJCSpvcHRfY29sb3IgfD0gR1JFRU47CgkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbYXJnYy0xXSwgInllbGxvdyIpID09IDApCgkJCSpvcHRfY29sb3IgfD0gWUVMTE9XOwoJCWVsc2UgaWYgKHN0cmNtcChhcmd2W2FyZ2MtMV0sICJibHVlIikgPT0gMCkKCQkJKm9wdF9jb2xvciB8PSBCTFVFOwoJCWVsc2UgaWYgKHN0cmNtcChhcmd2W2FyZ2MtMV0sICJtYWdlbnRhIikgPT0gMCkKCQkJKm9wdF9jb2xvciB8PSBNQUdFTlRBOwoJCWVsc2UgaWYgKHN0cmNtcChhcmd2W2FyZ2MtMV0sICJjeWFuIikgPT0gMCkKCQkJKm9wdF9jb2xvciB8PSBDWUFOOwoJCWVsc2UgaWYgKHN0cmNtcChhcmd2W2FyZ2MtMV0sICJ3aGl0ZSIpID09IDApCgkJCSpvcHRfY29sb3IgfD0gV0hJVEU7CgkJZWxzZSBpZiAoaXNkaWdpdChhcmd2W2FyZ2MtMV1bMF0pKQoJCQkqb3B0X2NvbG9yID0gYXRvaShhcmd2W2FyZ2MtMV0pOwoJCWVsc2UKCQkJKmJhZF9hcmcgPSBUUlVFOwoJCWlmKCpvcHRfY29sb3IgPCAwIHx8ICpvcHRfY29sb3IgPiAxNSkKCQkJKmJhZF9hcmcgPSBUUlVFOwoJfQp9CgpzdGF0aWMgdm9pZApwYXJzZV9jbGVhcihpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGludCAqb3B0aW9uLCBpbnQgKm9wdF9hbGwsIGludCAqYmFkX2FyZykgewoJLyogYXJnYzogTnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgdGhpcyBvcHRpb24uICovCgkvKiBhcmd2OiBBcmd1bWVudHMgZm9yIHRoaXMgb3B0aW9uLiAqLwoJLyogb3B0aW9uOiBDbGVhciBmbGFnIHRvIHNldC4gKi8KCS8qIG9wdF9hbGw6IENsZWFyIGFsbCBzd2l0Y2ggdG8gc2V0IG9yIHJlc2V0LiAqLwoJLyogYmFkX2FyZzogU2V0IHRvIHRydWUgaWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQuICovCgovKiBQYXJzZSBhIC1jbGVhciBzcGVjaWZpY2F0aW9uLiAqLwoKCWlmIChhcmdjID4gMSB8fCAqb3B0aW9uKQoJCSpiYWRfYXJnID0gVFJVRTsKCSpvcHRpb24gPSBUUlVFOwoJaWYgKGFyZ2MgPT0gMSkgewoJCWlmIChzdHJjbXAoYXJndlswXSwgImFsbCIpID09IDApCgkJCSpvcHRfYWxsID0gVFJVRTsKCQllbHNlIGlmIChzdHJjbXAoYXJndlswXSwgInJlc3QiKSA9PSAwKQoJCQkqb3B0X2FsbCA9IEZBTFNFOwoJCWVsc2UKCQkJKmJhZF9hcmcgPSBUUlVFOwoJfSBlbHNlIHsKCQkqb3B0X2FsbCA9IFRSVUU7Cgl9Cn0KCnN0YXRpYyB2b2lkCnBhcnNlX2JsYW5rKGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50ICpvcHRpb24sIGludCAqb3B0X2FsbCwgaW50ICpiYWRfYXJnKSB7CgkvKiBhcmdjOiBOdW1iZXIgb2YgYXJndW1lbnRzIGZvciB0aGlzIG9wdGlvbi4gKi8KCS8qIGFyZ3Y6IEFyZ3VtZW50cyBmb3IgdGhpcyBvcHRpb24uICovCgkvKiBvcHRpb246IENsZWFyIGZsYWcgdG8gc2V0LiAqLwoJLyogb3B0X2FsbDogQ2xlYXIgYWxsIHN3aXRjaCB0byBzZXQgb3IgcmVzZXQuICovCgkvKiBiYWRfYXJnOiBTZXQgdG8gdHJ1ZSBpZiBhbiBlcnJvciBpcyBkZXRlY3RlZC4gKi8KCi8qIFBhcnNlIGEgLWJsYW5rIHNwZWNpZmljYXRpb24uICovCgoJaWYgKGFyZ2MgPiAxIHx8ICpvcHRpb24pCgkJKmJhZF9hcmcgPSBUUlVFOwoJKm9wdGlvbiA9IFRSVUU7CglpZiAoYXJnYyA9PSAxKSB7CgkJaWYgKCFzdHJjbXAoYXJndlswXSwgImZvcmNlIikpCgkJCSpvcHRfYWxsID0gQkxBTktTQ1JFRU47CgkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAicG9rZSIpKQoJCQkqb3B0X2FsbCA9IFVOQkxBTktTQ1JFRU47CgkJZWxzZSB7CgkJCSpvcHRfYWxsID0gYXRvaShhcmd2WzBdKTsKCQkJaWYgKCgqb3B0X2FsbCA+IDYwKSB8fCAoKm9wdF9hbGwgPCAwKSkKCQkJCSpiYWRfYXJnID0gVFJVRTsKCQl9Cgl9IGVsc2UgewoJCSpvcHRfYWxsID0gQkxBTktFRFNDUkVFTjsKCX0KfQoKc3RhdGljIHZvaWQKcGFyc2VfcG93ZXJzYXZlKGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50ICpvcHRpb24sIGludCAqb3B0X21vZGUsIGludCAqYmFkX2FyZykgewoJLyogYXJnYzogTnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgdGhpcyBvcHRpb24uICovCgkvKiBhcmd2OiBBcmd1bWVudHMgZm9yIHRoaXMgb3B0aW9uLiAqLwoJLyogb3B0aW9uOiBwb3dlcnNhdmUgZmxhZyB0byBzZXQuICovCgkvKiBvcHRfbW9kZTogUG93ZXJzYXZpbmcgbW9kZSwgZGVmaW5lZCBpbiB2ZXNhX2JsYW5rLmMgKi8KCS8qIGJhZF9hcmc6IFNldCB0byB0cnVlIGlmIGFuIGVycm9yIGlzIGRldGVjdGVkLiAqLwoKLyogUGFyc2UgYSAtcG93ZXJzYXZlIG1vZGUgc3BlY2lmaWNhdGlvbi4gKi8KCglpZiAoYXJnYyA+IDEgfHwgKm9wdGlvbikKCQkqYmFkX2FyZyA9IFRSVUU7Cgkqb3B0aW9uID0gVFJVRTsKCWlmIChhcmdjID09IDEpIHsKCQlpZiAoc3RyY21wKGFyZ3ZbMF0sICJvbiIpID09IDApCgkJCSpvcHRfbW9kZSA9IDE7CgkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMF0sICJ2c3luYyIpID09IDApCgkJCSpvcHRfbW9kZSA9IDE7CgkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMF0sICJoc3luYyIpID09IDApCgkJCSpvcHRfbW9kZSA9IDI7CgkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMF0sICJwb3dlcmRvd24iKSA9PSAwKQoJCQkqb3B0X21vZGUgPSAzOwoJCWVsc2UgaWYgKHN0cmNtcChhcmd2WzBdLCAib2ZmIikgPT0gMCkKCQkJKm9wdF9tb2RlID0gMDsKCQllbHNlCgkJCSpiYWRfYXJnID0gVFJVRTsKCX0gZWxzZSB7CgkJKm9wdF9tb2RlID0gMDsKCX0KfQoKI2lmIDAKc3RhdGljIHZvaWQKcGFyc2Vfc3RhbmRvdXQoaW50IGFyZ2MsIGNoYXIgKmFyZ3YsIGludCAqb3B0aW9uLCBpbnQgKm9wdF9hbGwsIGludCAqYmFkX2FyZykgewoJLyogYXJnYzogTnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgdGhpcyBvcHRpb24uICovCgkvKiBhcmd2OiBBcmd1bWVudHMgZm9yIHRoaXMgb3B0aW9uLiAqLwoJLyogb3B0aW9uOiBDbGVhciBmbGFnIHRvIHNldC4gKi8KCS8qIG9wdF9hbGw6IENsZWFyIGFsbCBzd2l0Y2ggdG8gc2V0IG9yIHJlc2V0LiAqLwoJLyogYmFkX2FyZzogU2V0IHRvIHRydWUgaWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQuICovCgovKiBQYXJzZSBhIC1zdGFuZG91dCBzcGVjaWZpY2F0aW9uLiAqLwoKCWlmIChhcmdjID4gMSB8fCAqb3B0aW9uKQoJCSpiYWRfYXJnID0gVFJVRTsKCSpvcHRpb24gPSBUUlVFOwoJaWYgKGFyZ2MgPT0gMSkKCQkqb3B0X2FsbCA9IGF0b2koYXJndlswXSk7CgllbHNlCgkJKm9wdF9hbGwgPSAtMTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkCnBhcnNlX21zZ2xldmVsKGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50ICpvcHRpb24sIGludCAqb3B0X2FsbCwgaW50ICpiYWRfYXJnKSB7CgkvKiBhcmdjOiBOdW1iZXIgb2YgYXJndW1lbnRzIGZvciB0aGlzIG9wdGlvbi4gKi8KCS8qIGFyZ3Y6IEFyZ3VtZW50cyBmb3IgdGhpcyBvcHRpb24uICovCgkvKiBvcHRpb246IENsZWFyIGZsYWcgdG8gc2V0LiAqLwoJLyogb3B0X2FsbDogQ2xlYXIgYWxsIHN3aXRjaCB0byBzZXQgb3IgcmVzZXQuICovCgkvKiBiYWRfYXJnOiBTZXQgdG8gdHJ1ZSBpZiBhbiBlcnJvciBpcyBkZXRlY3RlZC4gKi8KCglpZiAoYXJnYyA+IDEgfHwgKm9wdGlvbikKCQkqYmFkX2FyZyA9IFRSVUU7Cgkqb3B0aW9uID0gVFJVRTsKCWlmIChhcmdjID09IDEpIHsKCQkqb3B0X2FsbCA9IGF0b2koYXJndlswXSk7CgkJaWYgKCpvcHRfYWxsIDwgMCB8fCAqb3B0X2FsbCA+IDgpCgkJCSpiYWRfYXJnID0gVFJVRTsKCX0gZWxzZSB7CgkJKm9wdF9hbGwgPSAtMTsKCX0KfQoKc3RhdGljIHZvaWQKcGFyc2Vfc25hcChpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGludCAqb3B0aW9uLCBpbnQgKm9wdF9hbGwsIGludCAqYmFkX2FyZykgewoJLyogYXJnYzogTnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgdGhpcyBvcHRpb24uICovCgkvKiBhcmd2OiBBcmd1bWVudHMgZm9yIHRoaXMgb3B0aW9uLiAqLwoJLyogb3B0aW9uOiBDbGVhciBmbGFnIHRvIHNldC4gKi8KCS8qIG9wdF9hbGw6IENsZWFyIGFsbCBzd2l0Y2ggdG8gc2V0IG9yIHJlc2V0LiAqLwoJLyogYmFkX2FyZzogU2V0IHRvIHRydWUgaWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQuICovCgovKiBQYXJzZSBhIC1kdW1wIG9yIC1hcHBlbmQgc3BlY2lmaWNhdGlvbi4gKi8KCglpZiAoYXJnYyA+IDEgfHwgKm9wdGlvbikKCQkqYmFkX2FyZyA9IFRSVUU7Cgkqb3B0aW9uID0gVFJVRTsKCWlmIChhcmdjID09IDEpIHsKCQkqb3B0X2FsbCA9IGF0b2koYXJndlswXSk7CgkJaWYgKCgqb3B0X2FsbCA8PSAwKSkKCQkJKmJhZF9hcmcgPSBUUlVFOwoJfSBlbHNlIHsKCQkqb3B0X2FsbCA9IDA7Cgl9Cn0KCnN0YXRpYyB2b2lkCnBhcnNlX3NuYXBmaWxlKGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50ICpvcHRpb24sIGludCAqb3B0X2FsbCwgaW50ICpiYWRfYXJnKSB7CgkvKiBhcmdjOiBOdW1iZXIgb2YgYXJndW1lbnRzIGZvciB0aGlzIG9wdGlvbi4gKi8KCS8qIGFyZ3Y6IEFyZ3VtZW50cyBmb3IgdGhpcyBvcHRpb24uICovCgkvKiBvcHRpb246IENsZWFyIGZsYWcgdG8gc2V0LiAqLwoJLyogb3B0X2FsbDogQ2xlYXIgYWxsIHN3aXRjaCB0byBzZXQgb3IgcmVzZXQuICovCgkvKiBiYWRfYXJnOiBTZXQgdG8gdHJ1ZSBpZiBhbiBlcnJvciBpcyBkZXRlY3RlZC4gKi8KCi8qIFBhcnNlIGEgLWZpbGUgc3BlY2lmaWNhdGlvbi4gKi8KCglpZiAoYXJnYyAhPSAxIHx8ICpvcHRpb24pCgkJKmJhZF9hcmcgPSBUUlVFOwoJKm9wdGlvbiA9IFRSVUU7CglpZiAoYXJnYyA9PSAxKQoJCXN0cmNweSgoY2hhciAqKW9wdF9hbGwsIGFyZ3ZbMF0pOwp9CgpzdGF0aWMgdm9pZApwYXJzZV90YWJzKGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50ICpvcHRpb24sIGludCAqdGFiX2FycmF5LCBpbnQgKmJhZF9hcmcpIHsKCS8qIGFyZ2M6IE51bWJlciBvZiBhcmd1bWVudHMgZm9yIHRoaXMgb3B0aW9uLiAqLwoJLyogYXJndjogQXJndW1lbnRzIGZvciB0aGlzIG9wdGlvbi4gKi8KCS8qIG9wdGlvbjogQ2xlYXIgZmxhZyB0byBzZXQuICovCgkvKiB0YWJfYXJyYXk6IEFycmF5IG9mIHRhYnMgKi8KCS8qIGJhZF9hcmc6IFNldCB0byB0cnVlIGlmIGFuIGVycm9yIGlzIGRldGVjdGVkLiAqLwoKCWlmICgqb3B0aW9uIHx8IGFyZ2MgPiAxNjApCgkJKmJhZF9hcmcgPSBUUlVFOwoJKm9wdGlvbiA9IFRSVUU7Cgl0YWJfYXJyYXlbYXJnY10gPSAtMTsKCXdoaWxlKGFyZ2MtLSkgewoJCXRhYl9hcnJheVthcmdjXSA9IGF0b2koYXJndlthcmdjXSk7CgkJaWYodGFiX2FycmF5W2FyZ2NdIDwgMSB8fCB0YWJfYXJyYXlbYXJnY10gPiAxNjApIHsKCQkJKmJhZF9hcmcgPSBUUlVFOwoJCQlyZXR1cm47CgkJfQoJfQp9CgpzdGF0aWMgdm9pZApwYXJzZV9jbHJ0YWJzKGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50ICpvcHRpb24sIGludCAqdGFiX2FycmF5LCBpbnQgKmJhZF9hcmcpIHsKCS8qIGFyZ2M6IE51bWJlciBvZiBhcmd1bWVudHMgZm9yIHRoaXMgb3B0aW9uLiAqLwoJLyogYXJndjogQXJndW1lbnRzIGZvciB0aGlzIG9wdGlvbi4gKi8KCS8qIG9wdGlvbjogQ2xlYXIgZmxhZyB0byBzZXQuICovCgkvKiB0YWJfYXJyYXk6IEFycmF5IG9mIHRhYnMgKi8KCS8qIGJhZF9hcmc6IFNldCB0byB0cnVlIGlmIGFuIGVycm9yIGlzIGRldGVjdGVkLiAqLwoKCWlmICgqb3B0aW9uIHx8IGFyZ2MgPiAxNjApCgkJKmJhZF9hcmcgPSBUUlVFOwoJKm9wdGlvbiA9IFRSVUU7CglpZihhcmdjID09IDApIHsKCQl0YWJfYXJyYXlbMF0gPSAtMTsKCQlyZXR1cm47Cgl9Cgl0YWJfYXJyYXlbYXJnY10gPSAtMTsKCXdoaWxlKGFyZ2MtLSkgewoJCXRhYl9hcnJheVthcmdjXSA9IGF0b2koYXJndlthcmdjXSk7CgkJaWYodGFiX2FycmF5W2FyZ2NdIDwgMSB8fCB0YWJfYXJyYXlbYXJnY10gPiAxNjApIHsKCQkJKmJhZF9hcmcgPSBUUlVFOwoJCQlyZXR1cm47CgkJfQoJfQp9CgpzdGF0aWMgdm9pZApwYXJzZV9yZWd0YWJzKGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50ICpvcHRpb24sIGludCAqb3B0X2xlbiwgaW50ICpiYWRfYXJnKSB7CgkvKiBhcmdjOiBOdW1iZXIgb2YgYXJndW1lbnRzIGZvciB0aGlzIG9wdGlvbi4gKi8KCS8qIGFyZ3Y6IEFyZ3VtZW50cyBmb3IgdGhpcyBvcHRpb24uICovCgkvKiBvcHRpb246IENsZWFyIGZsYWcgdG8gc2V0LiAqLwoJLyogb3B0X2xlbjogUmVndWxhciB0YWIgbGVuZ3RoLiAqLwoJLyogYmFkX2FyZzogU2V0IHRvIHRydWUgaWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQuICovCgoJaWYgKCpvcHRpb24gfHwgYXJnYyA+IDEpCgkJKmJhZF9hcmcgPSBUUlVFOwoJKm9wdGlvbiA9IFRSVUU7CglpZihhcmdjID09IDApIHsKCQkqb3B0X2xlbiA9IDg7CgkJcmV0dXJuOwoJfQoJKm9wdF9sZW4gPSBhdG9pKGFyZ3ZbMF0pOwoJaWYoKm9wdF9sZW4gPCAxIHx8ICpvcHRfbGVuID4gMTYwKSB7CgkJKmJhZF9hcmcgPSBUUlVFOwoJCXJldHVybjsKCX0KfQoKCnN0YXRpYyB2b2lkCnBhcnNlX2JsZW5ndGgoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBpbnQgKm9wdGlvbiwgaW50ICpvcHRfYWxsLCBpbnQgKmJhZF9hcmcpIHsKCS8qIGFyZ2M6IE51bWJlciBvZiBhcmd1bWVudHMgZm9yIHRoaXMgb3B0aW9uLiAqLwoJLyogYXJndjogQXJndW1lbnRzIGZvciB0aGlzIG9wdGlvbi4gKi8KCS8qIG9wdGlvbjogQ2xlYXIgZmxhZyB0byBzZXQuICovCgkvKiBvcHRfYWxsICovCgkvKiBiYWRfYXJnOiBTZXQgdG8gdHJ1ZSBpZiBhbiBlcnJvciBpcyBkZXRlY3RlZC4gKi8KCi8qIFBhcnNlICAtYmxlbmd0aCBzcGVjaWZpY2F0aW9uLiAqLwoKCWlmIChhcmdjID4gMSB8fCAqb3B0aW9uKQoJCSpiYWRfYXJnID0gVFJVRTsKCSpvcHRpb24gPSBUUlVFOwoJaWYgKGFyZ2MgPT0gMSkgewoJCSpvcHRfYWxsID0gYXRvaShhcmd2WzBdKTsKCQlpZiAoKm9wdF9hbGwgPiAyMDAwKQoJCQkqYmFkX2FyZyA9IFRSVUU7Cgl9IGVsc2UgewoJCSpvcHRfYWxsID0gMDsKCX0KfQoKc3RhdGljIHZvaWQKcGFyc2VfYmZyZXEoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBpbnQgKm9wdGlvbiwgaW50ICpvcHRfYWxsLCBpbnQgKmJhZF9hcmcpIHsKCS8qIGFyZ2M6IE51bWJlciBvZiBhcmd1bWVudHMgZm9yIHRoaXMgb3B0aW9uLiAqLwoJLyogYXJndjogQXJndW1lbnRzIGZvciB0aGlzIG9wdGlvbi4gKi8KCS8qIG9wdGlvbjogQ2xlYXIgZmxhZyB0byBzZXQuICovCgkvKiBvcHRfYWxsICovCgkvKiBiYWRfYXJnOiBTZXQgdG8gdHJ1ZSBpZiBhbiBlcnJvciBpcyBkZXRlY3RlZC4gKi8KCi8qIFBhcnNlICAtYmZyZXEgc3BlY2lmaWNhdGlvbi4gKi8KCglpZiAoYXJnYyA+IDEgfHwgKm9wdGlvbikKCQkqYmFkX2FyZyA9IFRSVUU7Cgkqb3B0aW9uID0gVFJVRTsKCWlmIChhcmdjID09IDEpIHsKCQkqb3B0X2FsbCA9IGF0b2koYXJndlswXSk7Cgl9IGVsc2UgewoJCSpvcHRfYWxsID0gMDsKCX0KfQoKCnN0YXRpYyB2b2lkCnNob3dfdGFicyh2b2lkKSB7CglpbnQgaSwgY28gPSB0aWdldG51bSgiY29scyIpOwoKCWlmKGNvID4gMCkgewoJCXByaW50ZigiXHIgICAgICAgICAiKTsKCQlmb3IoaSA9IDEwOyBpIDwgY28tMjsgaSs9MTApCgkJCXByaW50ZigiJS0xMGQiLCBpKTsKCQlwdXRjaGFyKCdcbicpOwoJCWZvcihpID0gMTsgaSA8PSBjbzsgaSsrKQoJCQlwdXRjaGFyKGklMTArJzAnKTsKCQlwdXRjaGFyKCdcbicpOwoJCWZvcihpID0gMTsgaSA8IGNvOyBpKyspCgkJCXByaW50ZigiXHRUXGIiKTsKCQlwdXRjaGFyKCdcbicpOwoJfQp9CgoKI2RlZmluZSBTVFJDTVAoc3RyMSxzdHIyKSBzdHJuY21wKHN0cjEsc3RyMixzdHJsZW4oc3RyMSkpCgpzdGF0aWMgdm9pZApwYXJzZV9vcHRpb24oY2hhciAqb3B0aW9uLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGludCAqYmFkX2FyZykgewoJLyogb3B0aW9uOiBPcHRpb24gd2l0aCBsZWFkaW5nICctJyByZW1vdmVkLiAqLwoJLyogYXJnYzogTnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgdGhpcyBvcHRpb24uICovCgkvKiBhcmd2OiBBcmd1bWVudHMgZm9yIHRoaXMgb3B0aW9uLiAqLwoJLyogYmFkX2FyZzogU2V0IHRvIHRydWUgaWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQuICovCgovKiBQYXJzZSBhIHNpbmdsZSBzcGVjaWZpY2F0aW9uLiAqLwoKCWlmIChTVFJDTVAob3B0aW9uLCAidGVybSIpID09IDApCgkJcGFyc2VfdGVybShhcmdjLCBhcmd2LCAmb3B0X3Rlcm0sICZvcHRfdGVfdGVybWluYWxfbmFtZSwgYmFkX2FyZyk7CgllbHNlIGlmIChTVFJDTVAob3B0aW9uLCAicmVzZXQiKSA9PSAwKQoJCXBhcnNlX25vbmUoYXJnYywgYXJndiwgJm9wdF9yZXNldCwgYmFkX2FyZyk7CgllbHNlIGlmIChTVFJDTVAob3B0aW9uLCAiaW5pdGlhbGl6ZSIpID09IDApCgkJcGFyc2Vfbm9uZShhcmdjLCBhcmd2LCAmb3B0X2luaXRpYWxpemUsIGJhZF9hcmcpOwoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgImN1cnNvciIpID09IDApCgkJcGFyc2Vfc3dpdGNoKGFyZ2MsIGFyZ3YsICZvcHRfY3Vyc29yLCAmb3B0X2N1X29uLCBiYWRfYXJnKTsKCWVsc2UgaWYgKFNUUkNNUChvcHRpb24sICJyZXBlYXQiKSA9PSAwKQoJCXBhcnNlX3N3aXRjaChhcmdjLCBhcmd2LCAmb3B0X3JlcGVhdCwgJm9wdF9yZXBfb24sIGJhZF9hcmcpOwoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgImFwcGN1cnNvcmtleXMiKSA9PSAwKQoJCXBhcnNlX3N3aXRjaChhcmdjLCBhcmd2LCAmb3B0X2FwcGN1cnNvcmtleXMsICZvcHRfYXBwY2tfb24sIGJhZF9hcmcpOwoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgImxpbmV3cmFwIikgPT0gMCkKCQlwYXJzZV9zd2l0Y2goYXJnYywgYXJndiwgJm9wdF9saW5ld3JhcCwgJm9wdF9saV9vbiwgYmFkX2FyZyk7CiNpZiAwCgllbHNlIGlmIChTVFJDTVAob3B0aW9uLCAic25vdyIpID09IDApCgkJcGFyc2Vfc3dpdGNoKGFyZ2MsIGFyZ3YsICZvcHRfc25vdywgJm9wdF9zbl9vbiwgYmFkX2FyZyk7CgllbHNlIGlmIChTVFJDTVAob3B0aW9uLCAic29mdHNjcm9sbCIpID09IDApCgkJcGFyc2Vfc3dpdGNoKGFyZ2MsIGFyZ3YsICZvcHRfc29mdHNjcm9sbCwgJm9wdF9zb19vbiwgYmFkX2FyZyk7CiNlbmRpZgoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgImRlZmF1bHQiKSA9PSAwKQoJCXBhcnNlX25vbmUoYXJnYywgYXJndiwgJm9wdF9kZWZhdWx0LCBiYWRfYXJnKTsKCWVsc2UgaWYgKFNUUkNNUChvcHRpb24sICJmb3JlZ3JvdW5kIikgPT0gMCkKCQlwYXJfY29sb3IoYXJnYywgYXJndiwgJm9wdF9mb3JlZ3JvdW5kLCAmb3B0X2ZvX2NvbG9yLCBiYWRfYXJnKTsKCWVsc2UgaWYgKFNUUkNNUChvcHRpb24sICJiYWNrZ3JvdW5kIikgPT0gMCkKCQlwYXJfY29sb3IoYXJnYywgYXJndiwgJm9wdF9iYWNrZ3JvdW5kLCAmb3B0X2JhX2NvbG9yLCBiYWRfYXJnKTsKCWVsc2UgaWYgKFNUUkNNUChvcHRpb24sICJ1bGNvbG9yIikgPT0gMCkKCQlwYXJfY29sb3IyKGFyZ2MsIGFyZ3YsICZvcHRfdWxjb2xvciwgJm9wdF91bF9jb2xvciwgYmFkX2FyZyk7CgllbHNlIGlmIChTVFJDTVAob3B0aW9uLCAiaGJjb2xvciIpID09IDApCgkJcGFyX2NvbG9yMihhcmdjLCBhcmd2LCAmb3B0X2hiY29sb3IsICZvcHRfaGJfY29sb3IsIGJhZF9hcmcpOwoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgImludmVyc2VzY3JlZW4iKSA9PSAwKQoJCXBhcnNlX3N3aXRjaChhcmdjLCBhcmd2LCAmb3B0X2ludmVyc2VzY3JlZW4sICZvcHRfaW52c2Nfb24sIGJhZF9hcmcpOwoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgImJvbGQiKSA9PSAwKQoJCXBhcnNlX3N3aXRjaChhcmdjLCBhcmd2LCAmb3B0X2JvbGQsICZvcHRfYm9fb24sIGJhZF9hcmcpOwoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgImhhbGYtYnJpZ2h0IikgPT0gMCkKCQlwYXJzZV9zd2l0Y2goYXJnYywgYXJndiwgJm9wdF9oYWxmYnJpZ2h0LCAmb3B0X2hiX29uLCBiYWRfYXJnKTsKCWVsc2UgaWYgKFNUUkNNUChvcHRpb24sICJibGluayIpID09IDApCgkJcGFyc2Vfc3dpdGNoKGFyZ2MsIGFyZ3YsICZvcHRfYmxpbmssICZvcHRfYmxfb24sIGJhZF9hcmcpOwoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgInJldmVyc2UiKSA9PSAwKQoJCXBhcnNlX3N3aXRjaChhcmdjLCBhcmd2LCAmb3B0X3JldmVyc2UsICZvcHRfcmVfb24sIGJhZF9hcmcpOwoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgInVuZGVybGluZSIpID09IDApCgkJcGFyc2Vfc3dpdGNoKGFyZ2MsIGFyZ3YsICZvcHRfdW5kZXJsaW5lLCAmb3B0X3VuX29uLCBiYWRfYXJnKTsKCWVsc2UgaWYgKFNUUkNNUChvcHRpb24sICJzdG9yZSIpID09IDApCgkJcGFyc2Vfbm9uZShhcmdjLCBhcmd2LCAmb3B0X3N0b3JlLCBiYWRfYXJnKTsKCWVsc2UgaWYgKFNUUkNNUChvcHRpb24sICJjbGVhciIpID09IDApCgkJcGFyc2VfY2xlYXIoYXJnYywgYXJndiwgJm9wdF9jbGVhciwgJm9wdF9jbF9hbGwsIGJhZF9hcmcpOwoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgInRhYnMiKSA9PSAwKQoJCXBhcnNlX3RhYnMoYXJnYywgYXJndiwgJm9wdF90YWJzLCBvcHRfdGJfYXJyYXksIGJhZF9hcmcpOwoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgImNscnRhYnMiKSA9PSAwKQoJCXBhcnNlX2NscnRhYnMoYXJnYywgYXJndiwgJm9wdF9jbHJ0YWJzLCBvcHRfdGJfYXJyYXksIGJhZF9hcmcpOwoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgInJlZ3RhYnMiKSA9PSAwKQoJCXBhcnNlX3JlZ3RhYnMoYXJnYywgYXJndiwgJm9wdF9yZWd0YWJzLCAmb3B0X3J0X2xlbiwgYmFkX2FyZyk7CgllbHNlIGlmIChTVFJDTVAob3B0aW9uLCAiYmxhbmsiKSA9PSAwKQoJCXBhcnNlX2JsYW5rKGFyZ2MsIGFyZ3YsICZvcHRfYmxhbmssICZvcHRfYmxfbWluLCBiYWRfYXJnKTsKCWVsc2UgaWYgKFNUUkNNUChvcHRpb24sICJkdW1wIikgPT0gMCkKCQlwYXJzZV9zbmFwKGFyZ2MsIGFyZ3YsICZvcHRfc25hcCwgJm9wdF9zbl9udW0sIGJhZF9hcmcpOwoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgImFwcGVuZCIpID09IDApCgkJcGFyc2Vfc25hcChhcmdjLCBhcmd2LCAmb3B0X2FwcGVuZCwgJm9wdF9zbl9udW0sIGJhZF9hcmcpOwoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgImZpbGUiKSA9PSAwKQoJCXBhcnNlX3NuYXBmaWxlKGFyZ2MsIGFyZ3YsICZvcHRfc25hcGZpbGUsIChpbnQgKilvcHRfc25fbmFtZSwgYmFkX2FyZyk7CgllbHNlIGlmIChTVFJDTVAob3B0aW9uLCAibXNnIikgPT0gMCkKCQlwYXJzZV9zd2l0Y2goYXJnYywgYXJndiwgJm9wdF9tc2csICZvcHRfbXNnX29uLCBiYWRfYXJnKTsKCWVsc2UgaWYgKFNUUkNNUChvcHRpb24sICJtc2dsZXZlbCIpID09IDApCgkJcGFyc2VfbXNnbGV2ZWwoYXJnYywgYXJndiwgJm9wdF9tc2dsZXZlbCwgJm9wdF9tc2dsZXZlbF9udW0sIGJhZF9hcmcpOwoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgInBvd2Vyc2F2ZSIpID09IDApCgkJcGFyc2VfcG93ZXJzYXZlKGFyZ2MsIGFyZ3YsICZvcHRfcG93ZXJzYXZlLCAmb3B0X3BzX21vZGUsIGJhZF9hcmcpOwoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgInBvd2VyZG93biIpID09IDApCgkJcGFyc2VfYmxhbmsoYXJnYywgYXJndiwgJm9wdF9wb3dlcmRvd24sICZvcHRfcGRfbWluLCBiYWRfYXJnKTsKCWVsc2UgaWYgKFNUUkNNUChvcHRpb24sICJibGVuZ3RoIikgPT0gMCkKCQlwYXJzZV9ibGVuZ3RoKGFyZ2MsIGFyZ3YsICZvcHRfYmxlbmd0aCwgJm9wdF9ibGVuZ3RoX2wsIGJhZF9hcmcpOwoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgImJmcmVxIikgPT0gMCkKCQlwYXJzZV9iZnJlcShhcmdjLCBhcmd2LCAmb3B0X2JmcmVxLCAmb3B0X2JmcmVxX2YsIGJhZF9hcmcpOwojaWYgMAoJZWxzZSBpZiAoU1RSQ01QKG9wdGlvbiwgInN0YW5kb3V0IikgPT0gMCkKCQlwYXJzZV9zdGFuZG91dChhcmdjLCBhcmd2LCAmb3B0X3N0YW5kb3V0LCAmb3B0X3N0X2F0dHIsIGJhZF9hcmcpOwojZW5kaWYKCWVsc2UKCQkqYmFkX2FyZyA9IFRSVUU7Cn0KCi8qIEVuZCBvZiBjb21tYW5kIGxpbmUgcGFyc2luZyByb3V0aW5lcy4gKi8KCnN0YXRpYyB2b2lkCnVzYWdlKGNoYXIgKnByb2dfbmFtZSkgewovKiBQcmludCBlcnJvciBtZXNzYWdlIGFib3V0IGFyZ3VtZW50cywgYW5kIHRoZSBjb21tYW5kJ3Mgc3ludGF4LiAqLwoKCWZwcmludGYoc3RkZXJyLCBfKCIlczogQXJndW1lbnQgZXJyb3IsIHVzYWdlXG4iKSwgcHJvZ19uYW1lKTsKCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIHByb2dfbmFtZSk7CglmcHJpbnRmKHN0ZGVyciwgXygiICBbIC10ZXJtIHRlcm1pbmFsX25hbWUgXVxuIikpOwoJZnByaW50ZihzdGRlcnIsIF8oIiAgWyAtcmVzZXQgXVxuIikpOwoJZnByaW50ZihzdGRlcnIsIF8oIiAgWyAtaW5pdGlhbGl6ZSBdXG4iKSk7CglmcHJpbnRmKHN0ZGVyciwgXygiICBbIC1jdXJzb3IgW29ufG9mZl0gXVxuIikpOwojaWYgMAoJZnByaW50ZihzdGRlcnIsIF8oIiAgWyAtc25vdyBbb258b2ZmXSBdXG4iKSk7CglmcHJpbnRmKHN0ZGVyciwgXygiICBbIC1zb2Z0c2Nyb2xsIFtvbnxvZmZdIF1cbiIpKTsKI2VuZGlmCglmcHJpbnRmKHN0ZGVyciwgXygiICBbIC1yZXBlYXQgW29ufG9mZl0gXVxuIikpOwoJZnByaW50ZihzdGRlcnIsIF8oIiAgWyAtYXBwY3Vyc29ya2V5cyBbb258b2ZmXSBdXG4iKSk7CglmcHJpbnRmKHN0ZGVyciwgXygiICBbIC1saW5ld3JhcCBbb258b2ZmXSBdXG4iKSk7CglmcHJpbnRmKHN0ZGVyciwgXygiICBbIC1kZWZhdWx0IF1cbiIpKTsKCWZwcmludGYoc3RkZXJyLCBfKCIgIFsgLWZvcmVncm91bmQgYmxhY2t8Ymx1ZXxncmVlbnxjeWFuIikpOwoJZnByaW50ZihzdGRlcnIsIF8oInxyZWR8bWFnZW50YXx5ZWxsb3d8d2hpdGV8ZGVmYXVsdCBdXG4iKSk7CglmcHJpbnRmKHN0ZGVyciwgXygiICBbIC1iYWNrZ3JvdW5kIGJsYWNrfGJsdWV8Z3JlZW58Y3lhbiIpKTsKCWZwcmludGYoc3RkZXJyLCBfKCJ8cmVkfG1hZ2VudGF8eWVsbG93fHdoaXRlfGRlZmF1bHQgXVxuIikpOwoJZnByaW50ZihzdGRlcnIsIF8oIiAgWyAtdWxjb2xvciBibGFja3xncmV5fGJsdWV8Z3JlZW58Y3lhbiIpKTsKCWZwcmludGYoc3RkZXJyLCBfKCJ8cmVkfG1hZ2VudGF8eWVsbG93fHdoaXRlIF1cbiIpKTsKCWZwcmludGYoc3RkZXJyLCBfKCIgIFsgLXVsY29sb3IgYnJpZ2h0IGJsdWV8Z3JlZW58Y3lhbiIpKTsKCWZwcmludGYoc3RkZXJyLCBfKCJ8cmVkfG1hZ2VudGF8eWVsbG93fHdoaXRlIF1cbiIpKTsKCWZwcmludGYoc3RkZXJyLCBfKCIgIFsgLWhiY29sb3IgYmxhY2t8Z3JleXxibHVlfGdyZWVufGN5YW4iKSk7CglmcHJpbnRmKHN0ZGVyciwgXygifHJlZHxtYWdlbnRhfHllbGxvd3x3aGl0ZSBdXG4iKSk7CglmcHJpbnRmKHN0ZGVyciwgXygiICBbIC1oYmNvbG9yIGJyaWdodCBibHVlfGdyZWVufGN5YW4iKSk7CglmcHJpbnRmKHN0ZGVyciwgXygifHJlZHxtYWdlbnRhfHllbGxvd3x3aGl0ZSBdXG4iKSk7CiNpZiAwCglmcHJpbnRmKHN0ZGVyciwgXygiICBbIC1zdGFuZG91dCBbIGF0dHIgXSBdXG4iKSk7CiNlbmRpZgoJZnByaW50ZihzdGRlcnIsIF8oIiAgWyAtaW52ZXJzZXNjcmVlbiBbb258b2ZmXSBdXG4iKSk7CglmcHJpbnRmKHN0ZGVyciwgXygiICBbIC1ib2xkIFtvbnxvZmZdIF1cbiIpKTsKCWZwcmludGYoc3RkZXJyLCBfKCIgIFsgLWhhbGYtYnJpZ2h0IFtvbnxvZmZdIF1cbiIpKTsKCWZwcmludGYoc3RkZXJyLCBfKCIgIFsgLWJsaW5rIFtvbnxvZmZdIF1cbiIpKTsKCWZwcmludGYoc3RkZXJyLCBfKCIgIFsgLXJldmVyc2UgW29ufG9mZl0gXVxuIikpOwoJZnByaW50ZihzdGRlcnIsIF8oIiAgWyAtdW5kZXJsaW5lIFtvbnxvZmZdIF1cbiIpKTsKCWZwcmludGYoc3RkZXJyLCBfKCIgIFsgLXN0b3JlIF1cbiIpKTsKCWZwcmludGYoc3RkZXJyLCBfKCIgIFsgLWNsZWFyIFthbGx8cmVzdF0gXVxuIikpOwoJZnByaW50ZihzdGRlcnIsIF8oIiAgWyAtdGFicyBbIHRhYjEgdGFiMiB0YWIzIC4uLiBdIF0gICAgICAodGFibiA9IDEtMTYwKVxuIikpOwoJZnByaW50ZihzdGRlcnIsIF8oIiAgWyAtY2xydGFicyBbIHRhYjEgdGFiMiB0YWIzIC4uLiBdIF0gICAodGFibiA9IDEtMTYwKVxuIikpOwoJZnByaW50ZihzdGRlcnIsIF8oIiAgWyAtcmVndGFicyBbMS0xNjBdIF1cbiIpKTsKCWZwcmludGYoc3RkZXJyLCBfKCIgIFsgLWJsYW5rIFswLTYwfGZvcmNlfHBva2VdIF1cbiIpKTsKCWZwcmludGYoc3RkZXJyLCBfKCIgIFsgLWR1bXAgICBbMS1OUl9DT05TT0xFU10gXVxuIikpOwoJZnByaW50ZihzdGRlcnIsIF8oIiAgWyAtYXBwZW5kIFsxLU5SX0NPTlNPTEVTXSBdXG4iKSk7CglmcHJpbnRmKHN0ZGVyciwgXygiICBbIC1maWxlIGR1bXBmaWxlbmFtZSBdXG4iKSk7CglmcHJpbnRmKHN0ZGVyciwgXygiICBbIC1tc2cgW29ufG9mZl0gXVxuIikpOwoJZnByaW50ZihzdGRlcnIsIF8oIiAgWyAtbXNnbGV2ZWwgWzAtOF0gXVxuIikpOwoJZnByaW50ZihzdGRlcnIsIF8oIiAgWyAtcG93ZXJzYXZlIFtvbnx2c3luY3xoc3luY3xwb3dlcmRvd258b2ZmXSBdXG4iKSk7CglmcHJpbnRmKHN0ZGVyciwgXygiICBbIC1wb3dlcmRvd24gWzAtNjBdIF1cbiIpKTsKCWZwcmludGYoc3RkZXJyLCBfKCIgIFsgLWJsZW5ndGggWzAtMjAwMF0gXVxuIikpOwoJZnByaW50ZihzdGRlcnIsIF8oIiAgWyAtYmZyZXEgZnJlcW51bWJlciBdXG4iKSk7Cn0KCnN0YXRpYyBjaGFyICp0aV9lbnRyeShjb25zdCBjaGFyICpuYW1lKSB7CgkvKiBuYW1lOiBUZXJtaW5mbyBjYXBhYmlsaXR5IHN0cmluZyB0byBsb29rdXAuICovCgovKiBSZXR1cm4gdGhlIHNwZWNpZmllZCB0ZXJtaW5mbyBzdHJpbmcsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBubyBzdWNoIHRlcm1pbmZvCiAqIGNhcGFiaWxpdHkgZXhpc3RzLgogKi8KCgljaGFyICpidWZfcHRyOwoKCWlmICgoYnVmX3B0ciA9IHRpZ2V0c3RyKChjaGFyICopbmFtZSkpID09IChjaGFyICopLTEpCgkJYnVmX3B0ciA9IE5VTEw7CglyZXR1cm4gYnVmX3B0cjsKfQoKc3RhdGljIHZvaWQKcGVyZm9ybV9zZXF1ZW5jZShpbnQgdmN0ZXJtKSB7CgkvKiB2Y3Rlcm06IFNldCBpZiB0ZXJtaW5hbCBpcyBhIHZpcnR1YWwgY29uc29sZS4gKi8KCglpbnQgcmVzdWx0OwovKiBQZXJmb3JtIHRoZSBzZWxlY3RlZCBvcHRpb25zLiAqLwoKCS8qIC1yZXNldC4gKi8KCWlmIChvcHRfcmVzZXQpIHsKCQlwdXRwKHRpX2VudHJ5KCJyczEiKSk7Cgl9CgoJLyogLWluaXRpYWxpemUuICovCglpZiAob3B0X2luaXRpYWxpemUpIHsKCQlwdXRwKHRpX2VudHJ5KCJpczIiKSk7Cgl9CgoJLyogLWN1cnNvciBbb258b2ZmXS4gKi8KCWlmIChvcHRfY3Vyc29yKSB7CgkJaWYgKG9wdF9jdV9vbikKCQkJcHV0cCh0aV9lbnRyeSgiY25vcm0iKSk7CgkJZWxzZQoJCQlwdXRwKHRpX2VudHJ5KCJjaXZpcyIpKTsKCX0KCgkvKiAtbGluZXdyYXAgW29ufG9mZl0uIFZjIG9ubHkgKHZ0MTAyKSAqLwoJaWYgKG9wdF9saW5ld3JhcCAmJiB2Y3Rlcm0pIHsKCQlpZiAob3B0X2xpX29uKQoJCQlwcmludGYoIlwwMzNbPzdoIik7CgkJZWxzZQoJCQlwcmludGYoIlwwMzNbPzdsIik7Cgl9CgoJLyogLXJlcGVhdCBbb258b2ZmXS4gVmMgb25seSAodnQxMDIpICovCglpZiAob3B0X3JlcGVhdCAmJiB2Y3Rlcm0pIHsKCQlpZiAob3B0X3JlcF9vbikKCQkJcHJpbnRmKCJcMDMzWz84aCIpOwoJCWVsc2UKCQkJcHJpbnRmKCJcMDMzWz84bCIpOwoJfQoKCS8qIC1hcHBjdXJzb3JrZXlzIFtvbnxvZmZdLiBWYyBvbmx5ICh2dDEwMikgKi8KCWlmIChvcHRfYXBwY3Vyc29ya2V5cyAmJiB2Y3Rlcm0pIHsKCQlpZiAob3B0X2FwcGNrX29uKQoJCQlwcmludGYoIlwwMzNbPzFoIik7CgkJZWxzZQoJCQlwcmludGYoIlwwMzNbPzFsIik7Cgl9CgojaWYgMAoJLyogLXNub3cgW29ufG9mZl0uICBWYyBvbmx5LiAqLwoJaWYgKG9wdF9zbm93ICYmIHZjdGVybSkgewoJCWlmIChvcHRfc25fb24pCgkJCXByaW50ZigiJXMlcyVzIiwgRENTLCAic25vdy5vbiIsIFNUKTsKCQllbHNlCgkJCXByaW50ZigiJXMlcyVzIiwgRENTLCAic25vdy5vZmYiLCBTVCk7Cgl9CgoJLyogLXNvZnRzY3JvbGwgW29ufG9mZl0uICBWYyBvbmx5LiAqLwoJaWYgKG9wdF9zb2Z0c2Nyb2xsICYmIHZjdGVybSkgewoJCWlmIChvcHRfc29fb24pCgkJCXByaW50ZigiJXMlcyVzIiwgRENTLCAic29mdHNjcm9sbC5vbiIsIFNUKTsKCQllbHNlCgkJCXByaW50ZigiJXMlcyVzIiwgRENTLCAic29mdHNjcm9sbC5vZmYiLCBTVCk7Cgl9CiNlbmRpZgoKCS8qIC1kZWZhdWx0LiAgVmMgc2V0cyBkZWZhdWx0IHJlbmRpdGlvbiwgb3RoZXJ3aXNlIGNsZWFycyBhbGwKCSAqIGF0dHJpYnV0ZXMuCgkgKi8KCWlmIChvcHRfZGVmYXVsdCkgewoJCWlmICh2Y3Rlcm0pCgkJCXByaW50ZigiXDAzM1swbSIpOwoJCWVsc2UKCQkJcHV0cCh0aV9lbnRyeSgic2dyMCIpKTsKCX0KCgkvKiAtZm9yZWdyb3VuZCBibGFja3xyZWR8Z3JlZW58eWVsbG93fGJsdWV8bWFnZW50YXxjeWFufHdoaXRlfGRlZmF1bHQuCgkgKiBWYyBvbmx5IChBTlNJKS4KCSAqLwoJaWYgKG9wdF9mb3JlZ3JvdW5kICYmIHZjdGVybSkgewoJCXByaW50ZigiJXMlcyVjJXMiLCBFU0MsICJbMyIsICcwJyArIG9wdF9mb19jb2xvciwgIm0iKTsKCX0KCgkvKiAtYmFja2dyb3VuZCBibGFja3xyZWR8Z3JlZW58eWVsbG93fGJsdWV8bWFnZW50YXxjeWFufHdoaXRlfGRlZmF1bHQuCgkgKiBWYyBvbmx5IChBTlNJKS4KCSAqLwoJaWYgKG9wdF9iYWNrZ3JvdW5kICYmIHZjdGVybSkgewoJCXByaW50ZigiJXMlcyVjJXMiLCBFU0MsICJbNCIsICcwJyArIG9wdF9iYV9jb2xvciwgIm0iKTsKCX0KCgkvKiAtdWxjb2xvciBibGFja3xyZWR8Z3JlZW58eWVsbG93fGJsdWV8bWFnZW50YXxjeWFufHdoaXRlfGRlZmF1bHQuCgkgKiBWYyBvbmx5LgoJICovCglpZiAob3B0X3VsY29sb3IgJiYgdmN0ZXJtKSB7CgkJcHJpbnRmKCJcMDMzWzE7JWRdIiwgb3B0X3VsX2NvbG9yKTsKCX0KCgkvKiAtaGJjb2xvciBibGFja3xyZWR8Z3JlZW58eWVsbG93fGJsdWV8bWFnZW50YXxjeWFufHdoaXRlfGRlZmF1bHQuCgkgKiBWYyBvbmx5LgoJICovCglpZiAob3B0X2hiY29sb3IgJiYgdmN0ZXJtKSB7CgkJcHJpbnRmKCJcMDMzWzI7JWRdIiwgb3B0X2hiX2NvbG9yKTsKCX0KCgkvKiAtaW52ZXJzZXNjcmVlbiBbb258b2ZmXS4gIFZjIG9ubHkgKHZ0MTAyKS4KCSAqLwoJaWYgKG9wdF9pbnZlcnNlc2NyZWVuKSB7CgkJaWYgKHZjdGVybSkgewoJCQlpZiAob3B0X2ludnNjX29uKQoJCQkJcHJpbnRmKCJcMDMzWz81aCIpOwoJCQllbHNlCgkJCQlwcmludGYoIlwwMzNbPzVsIik7CgkJfQoJfQoKCS8qIC1ib2xkIFtvbnxvZmZdLiAgVmMgYmVoYXZlcyBhcyBleHBlY3RlZCwgb3RoZXJ3aXNlIG9mZiB0dXJucyBvZmYKCSAqIGFsbCBhdHRyaWJ1dGVzLgoJICovCglpZiAob3B0X2JvbGQpIHsKCQlpZiAob3B0X2JvX29uKQoJCQlwdXRwKHRpX2VudHJ5KCJib2xkIikpOwoJCWVsc2UgewoJCQlpZiAodmN0ZXJtKQoJCQkJcHJpbnRmKCIlcyVzIiwgRVNDLCAiWzIybSIpOwoJCQllbHNlCgkJCQlwdXRwKHRpX2VudHJ5KCJzZ3IwIikpOwoJCX0KCX0KCgkvKiAtaGFsZi1icmlnaHQgW29ufG9mZl0uICBWYyBiZWhhdmVzIGFzIGV4cGVjdGVkLCBvdGhlcndpc2Ugb2ZmIHR1cm5zIG9mZgoJICogYWxsIGF0dHJpYnV0ZXMuCgkgKi8KCWlmIChvcHRfaGFsZmJyaWdodCkgewoJCWlmIChvcHRfaGJfb24pCgkJCXB1dHAodGlfZW50cnkoImRpbSIpKTsKCQllbHNlIHsKCQkJaWYgKHZjdGVybSkKCQkJCXByaW50ZigiJXMlcyIsIEVTQywgIlsyMm0iKTsKCQkJZWxzZQoJCQkJcHV0cCh0aV9lbnRyeSgic2dyMCIpKTsKCQl9Cgl9CgoJLyogLWJsaW5rIFtvbnxvZmZdLiAgVmMgYmVoYXZlcyBhcyBleHBlY3RlZCwgb3RoZXJ3aXNlIG9mZiB0dXJucyBvZmYKCSAqIGFsbCBhdHRyaWJ1dGVzLgoJICovCglpZiAob3B0X2JsaW5rKSB7CgkJaWYgKG9wdF9ibF9vbikKCQkJcHV0cCh0aV9lbnRyeSgiYmxpbmsiKSk7CgkJZWxzZSB7CgkJCWlmICh2Y3Rlcm0pCgkJCQlwcmludGYoIiVzJXMiLCBFU0MsICJbMjVtIik7CgkJCWVsc2UKCQkJCXB1dHAodGlfZW50cnkoInNncjAiKSk7CgkJfQoJfQoKCS8qIC1yZXZlcnNlIFtvbnxvZmZdLiAgVmMgYmVoYXZlcyBhcyBleHBlY3RlZCwgb3RoZXJ3aXNlIG9mZiB0dXJucwoJICogb2ZmIGFsbCBhdHRyaWJ1dGVzLgoJICovCglpZiAob3B0X3JldmVyc2UpIHsKCQlpZiAob3B0X3JlX29uKQoJCQlwdXRwKHRpX2VudHJ5KCJyZXYiKSk7CgkJZWxzZSB7CgkJCWlmICh2Y3Rlcm0pCgkJCQlwcmludGYoIiVzJXMiLCBFU0MsICJbMjdtIik7CgkJCWVsc2UKCQkJCXB1dHAodGlfZW50cnkoInNncjAiKSk7CgkJfQoJfQoKCS8qIC11bmRlcmxpbmUgW29ufG9mZl0uICovCglpZiAob3B0X3VuZGVybGluZSkgewoJCWlmIChvcHRfdW5fb24pCgkJCXB1dHAodGlfZW50cnkoInNtdWwiKSk7CgkJZWxzZQoJCQlwdXRwKHRpX2VudHJ5KCJybXVsIikpOwoJfQoKCS8qIC1zdG9yZS4gIFZjIG9ubHkuICovCglpZiAob3B0X3N0b3JlICYmIHZjdGVybSkgewoJCXByaW50ZigiXDAzM1s4XSIpOwoJfQoKCS8qIC1jbGVhciBbYWxsfHJlc3RdLiAqLwoJaWYgKG9wdF9jbGVhcikgewoJCWlmIChvcHRfY2xfYWxsKQoJCQlwdXRwKHRpX2VudHJ5KCJjbGVhciIpKTsKCQllbHNlCgkJCXB1dHAodGlfZW50cnkoImVkIikpOwoJfQoKCS8qIC10YWJzIFZjIG9ubHkuICovCglpZiAob3B0X3RhYnMgJiYgdmN0ZXJtKSB7CgkJaW50IGk7CgoJCWlmIChvcHRfdGJfYXJyYXlbMF0gPT0gLTEpCgkJCXNob3dfdGFicygpOwoJCWVsc2UgewoJCQlmb3IoaT0wOyBvcHRfdGJfYXJyYXlbaV0gPiAwOyBpKyspCgkJCQlwcmludGYoIlwwMzNbJWRHXDAzM0giLCBvcHRfdGJfYXJyYXlbaV0pOwoJCQlwdXRjaGFyKCdccicpOwoJCX0KCX0KCgkvKiAtY2xydGFicyBWYyBvbmx5LiAqLwoJaWYgKG9wdF9jbHJ0YWJzICYmIHZjdGVybSkgewoJCWludCBpOwoKCQlpZiAob3B0X3RiX2FycmF5WzBdID09IC0xKQoJCQlwcmludGYoIlwwMzNbM2ciKTsKCQllbHNlCgkJCWZvcihpPTA7IG9wdF90Yl9hcnJheVtpXSA+IDA7IGkrKykKCQkJCXByaW50ZigiXDAzM1slZEdcMDMzW2ciLCBvcHRfdGJfYXJyYXlbaV0pOwoJCXB1dGNoYXIoJ1xyJyk7Cgl9CgoJLyogLXJlZ3RhYnMgVmMgb25seS4gKi8KCWlmIChvcHRfcmVndGFicyAmJiB2Y3Rlcm0pIHsKCQlpbnQgaTsKCgkJcHJpbnRmKCJcMDMzWzNnXHIiKTsKCQlmb3IoaT1vcHRfcnRfbGVuKzE7IGk8PTE2MDsgaSs9b3B0X3J0X2xlbikKCQkJcHJpbnRmKCJcMDMzWyVkQ1wwMzNIIixvcHRfcnRfbGVuKTsKCQlwdXRjaGFyKCdccicpOwoJfQoKCS8qIC1ibGFuayBbMC02MF0uICovCglpZiAob3B0X2JsYW5rICYmIHZjdGVybSkgewoJCWlmIChvcHRfYmxfbWluID49IDApCgkJCXByaW50ZigiXDAzM1s5OyVkXSIsIG9wdF9ibF9taW4pOwoJCWVsc2UgaWYgKG9wdF9ibF9taW4gPT0gQkxBTktTQ1JFRU4pIHsKCQkJY2hhciBpb2N0bGFyZyA9IFRJT0NMX0JMQU5LU0NSRUVOOwoJCQlpZiAoaW9jdGwoMCxUSU9DTElOVVgsJmlvY3RsYXJnKSkKCQkJCWZwcmludGYoc3RkZXJyLF8oImNhbm5vdCBmb3JjZSBibGFua1xuIikpOwoJCX0gZWxzZSBpZiAob3B0X2JsX21pbiA9PSBVTkJMQU5LU0NSRUVOKSB7CgkJCWNoYXIgaW9jdGxhcmcgPSBUSU9DTF9VTkJMQU5LU0NSRUVOOwoJCQlpZiAoaW9jdGwoMCxUSU9DTElOVVgsJmlvY3RsYXJnKSkKCQkJCWZwcmludGYoc3RkZXJyLF8oImNhbm5vdCBmb3JjZSB1bmJsYW5rXG4iKSk7CgkJfSBlbHNlIGlmIChvcHRfYmxfbWluID09IEJMQU5LRURTQ1JFRU4pIHsKCQkJY2hhciBpb2N0bGFyZyA9IFRJT0NMX0JMQU5LRURTQ1JFRU47CgkJCWludCByZXQ7CgkJCXJldCA9IGlvY3RsKDAsVElPQ0xJTlVYLCZpb2N0bGFyZyk7CgkJCWlmIChyZXQgPCAwKQoJCQkJZnByaW50ZihzdGRlcnIsXygiY2Fubm90IGdldCBibGFuayBzdGF0dXNcbiIpKTsKCQkJZWxzZQoJCQkJcHJpbnRmKCIlZFxuIixyZXQpOwoJCX0KCX0KCgkvKiAtcG93ZXJzYXZlIFtvbnx2c3luY3xoc3luY3xwb3dlcmRvd258b2ZmXSAoY29uc29sZSkgKi8KCWlmIChvcHRfcG93ZXJzYXZlKSB7CgkJY2hhciBpb2N0bGFyZ1syXTsKCQlpb2N0bGFyZ1swXSA9IFRJT0NMX1NFVFZFU0FCTEFOSzsKCQlpb2N0bGFyZ1sxXSA9IG9wdF9wc19tb2RlOwoJCWlmIChpb2N0bCgwLFRJT0NMSU5VWCxpb2N0bGFyZykpCgkJCWZwcmludGYoc3RkZXJyLF8oImNhbm5vdCAodW4pc2V0IHBvd2Vyc2F2ZSBtb2RlXG4iKSk7Cgl9CgoJLyogLXBvd2VyZG93biBbMC02MF0uICovCglpZiAob3B0X3Bvd2VyZG93bikgewoJCXByaW50ZigiXDAzM1sxNDslZF0iLCBvcHRfcGRfbWluKTsKCX0KCiNpZiAwCgkvKiAtc3RhbmRvdXQgW251bV0uICovCglpZiAob3B0X3N0YW5kb3V0KQoJCS8qIG5vdGhpbmcgKi87CiNlbmRpZgoKCS8qIC1zbmFwIFsxLU5SX0NPTlNdLiAqLwoJaWYgKG9wdF9zbmFwIHx8IG9wdF9hcHBlbmQpIHsKCQlGSUxFICpGOwoKCQlGID0gZm9wZW4ob3B0X3NuX25hbWUsIG9wdF9zbmFwID8gInciIDogImEiKTsKCQlpZiAoIUYpIHsKCQkJcGVycm9yKG9wdF9zbl9uYW1lKTsKCQkJZnByaW50ZihzdGRlcnIsKCJzZXR0ZXJtOiBjYW4gbm90IG9wZW4gZHVtcCBmaWxlICVzIGZvciBvdXRwdXRcbiIpLAoJCQkJb3B0X3NuX25hbWUpOyAKCQkJZXhpdCgtMSk7CgkJfQoJCXNjcmVlbmR1bXAob3B0X3NuX251bSwgRik7CgkJZmNsb3NlKEYpOwoJfQoKCS8qIC1tc2cgW29ufG9mZl0uICovCglpZiAob3B0X21zZyAmJiB2Y3Rlcm0pIHsKCQlpZiAob3B0X21zZ19vbikKCQkJLyogNyAtLSBFbmFibGUgcHJpbnRrJ3MgdG8gY29uc29sZSAqLwoJCQlyZXN1bHQgPSBrbG9nY3RsKDcsIE5VTEwsIDApOwoJCWVsc2UKCQkJLyogIDYgLS0gRGlzYWJsZSBwcmludGsncyB0byBjb25zb2xlICovCgkJCXJlc3VsdCA9IGtsb2djdGwoNiwgTlVMTCwgMCk7CgoJCWlmIChyZXN1bHQgIT0gMCkKCQkJcHJpbnRmKF8oImtsb2djdGwgZXJyb3I6ICVzXG4iKSwgc3RyZXJyb3IoZXJybm8pKTsKCX0KCgkvKiAtbXNnbGV2ZWwgWzAtOF0gKi8KCWlmIChvcHRfbXNnbGV2ZWwgJiYgdmN0ZXJtKSB7CgkJLyogOCAtLSBTZXQgbGV2ZWwgb2YgbWVzc2FnZXMgcHJpbnRlZCB0byBjb25zb2xlICovCgkJcmVzdWx0ID0ga2xvZ2N0bCg4LCBOVUxMLCBvcHRfbXNnbGV2ZWxfbnVtKTsKCQlpZiAocmVzdWx0ICE9IDApCgkJCXByaW50ZihfKCJrbG9nY3RsIGVycm9yOiAlc1xuIiksIHN0cmVycm9yKGVycm5vKSk7Cgl9CgoJLyogLWJsZW5ndGggWzAtMjAwMF0gKi8KCWlmIChvcHRfYmxlbmd0aCAmJiB2Y3Rlcm0pIHsKCQlwcmludGYoIlwwMzNbMTE7JWRdIiwgb3B0X2JsZW5ndGhfbCk7Cgl9CgoJLyogLWJmcmVxIGZyZXFudW1iZXIgKi8KCWlmIChvcHRfYmZyZXEgJiYgdmN0ZXJtKSB7CgkJcHJpbnRmKCJcMDMzWzEwOyVkXSIsIG9wdF9iZnJlcV9mKTsKCX0KCn0KCnN0YXRpYyB2b2lkCnNjcmVlbmR1bXAoaW50IHZjbnVtLCBGSUxFICpGKSB7CiAgICBjaGFyIGluZmlsZVtNQVhQQVRITEVOXTsKICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyWzRdOwogICAgdW5zaWduZWQgaW50IHJvd3MsIGNvbHM7CiAgICBpbnQgZmQsIGksIGo7CiAgICBjaGFyICppbmJ1ZiwgKm91dGJ1ZiwgKnAsICpxOwoKICAgIHNwcmludGYoaW5maWxlLCAiL2Rldi92Y3NhJWQiLCB2Y251bSk7CiAgICBmZCA9IG9wZW4oaW5maWxlLCBPX1JET05MWSk7CiAgICBpZiAoZmQgPCAwICYmIHZjbnVtID09IDApIHsKCS8qIHZjc2EwIGlzIG9mdGVuIGNhbGxlZCB2Y3NhICovCglzcHJpbnRmKGluZmlsZSwgIi9kZXYvdmNzYSIpOwoJZmQgPSBvcGVuKGluZmlsZSwgT19SRE9OTFkpOwogICAgfQogICAgaWYgKGZkIDwgMCkgewoJLyogdHJ5IGRldmZzIG5hbWUgLSBmb3IgemVybyB2Y251bSBqdXN0IC9kZXYvdmNjL2EgKi8KCS8qIHNvbWUgZ2NjJ3Mgd2FybiBmb3IgJS51IC0gYWRkIDAgKi8KCXNwcmludGYoaW5maWxlLCAiL2Rldi92Y2MvYSUuMHUiLCB2Y251bSk7CglmZCA9IG9wZW4oaW5maWxlLCBPX1JET05MWSk7CiAgICB9CiAgICBpZiAoZmQgPCAwKSB7CglzcHJpbnRmKGluZmlsZSwgIi9kZXYvdmNzYSVkIiwgdmNudW0pOwoJZ290byByZWFkX2Vycm9yOwogICAgfQogICAgaWYgKHJlYWQoZmQsIGhlYWRlciwgNCkgIT0gNCkKCWdvdG8gcmVhZF9lcnJvcjsKICAgIHJvd3MgPSBoZWFkZXJbMF07CiAgICBjb2xzID0gaGVhZGVyWzFdOwogICAgaWYgKHJvd3MgKiBjb2xzID09IDApCiAgICAgICAgZ290byByZWFkX2Vycm9yOwogICAgaW5idWYgPSBtYWxsb2Mocm93cypjb2xzKjIpOwogICAgb3V0YnVmID0gbWFsbG9jKHJvd3MqKGNvbHMrMSkpOwogICAgaWYoIWluYnVmIHx8ICFvdXRidWYpIHsKCWZwdXRzKF8oIk91dCBvZiBtZW1vcnkiKSwgc3RkZXJyKTsKCWdvdG8gZXJyb3I7CiAgICB9CiAgICBpZiAocmVhZChmZCwgaW5idWYsIHJvd3MqY29scyoyKSAhPSByb3dzKmNvbHMqMikKCSAgICBnb3RvIHJlYWRfZXJyb3I7CiAgICBwID0gaW5idWY7CiAgICBxID0gb3V0YnVmOwogICAgZm9yKGk9MDsgaTxyb3dzOyBpKyspIHsKCWZvcihqPTA7IGo8Y29sczsgaisrKSB7CgkgICAgKnErKyA9ICpwOwoJICAgIHAgKz0gMjsKCX0KCXdoaWxlKGotLSA+IDAgJiYgcVstMV0gPT0gJyAnKQoJICBxLS07CgkqcSsrID0gJ1xuJzsKICAgIH0KICAgIGlmIChmd3JpdGUob3V0YnVmLCAxLCBxLW91dGJ1ZiwgRikgIT0gcS1vdXRidWYpIHsKCWZwcmludGYoc3RkZXJyLCBfKCJFcnJvciB3cml0aW5nIHNjcmVlbmR1bXBcbiIpKTsKCWdvdG8gZXJyb3I7CiAgICB9CiAgICBjbG9zZShmZCk7CiAgICByZXR1cm47CgpyZWFkX2Vycm9yOgogICAgZnByaW50ZihzdGRlcnIsIF8oIkNvdWxkbid0IHJlYWQgJXNcbiIpLCBpbmZpbGUpOwplcnJvcjoKICAgIGlmIChmZCA+PSAwKQoJICAgIGNsb3NlKGZkKTsKICAgIGV4aXQoMSk7Cn0KCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewoJaW50IGJhZF9hcmcgPSBGQUxTRTsJCS8qIFNldCBpZiBlcnJvciBpbiBhcmd1bWVudHMuICovCglpbnQgYXJnLCBtb2RpZmllcjsKCWNoYXIgKnRlcm07CQkJLyogVGVybWluYWwgdHlwZS4gKi8KCWludCB2Y3Rlcm07CQkJLyogU2V0IGlmIHRlcm1pbmFsIGlzIGEgdmlydHVhbCBjb25zb2xlLiAqLwoKCXNldGxvY2FsZShMQ19BTEwsICIiKTsKCWJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FMRURJUik7Cgl0ZXh0ZG9tYWluKFBBQ0tBR0UpOwoKCWlmIChhcmdjIDwgMikKCQliYWRfYXJnID0gVFJVRTsKCgkvKiBQYXJzZSBhcmd1bWVudHMuICovCgoJZm9yIChhcmcgPSAxOyBhcmcgPCBhcmdjOykgewoJCWlmICgqYXJndlthcmddID09ICctJykgewoKCQkJLyogUGFyc2UgYSBzaW5nbGUgb3B0aW9uLiAqLwoKCQkJZm9yIChtb2RpZmllciA9IGFyZyArIDE7IG1vZGlmaWVyIDwgYXJnYzsgbW9kaWZpZXIrKykgewoJCQkJaWYgKCphcmd2W21vZGlmaWVyXSA9PSAnLScpIGJyZWFrOwoJCQl9CgkJCXBhcnNlX29wdGlvbihhcmd2W2FyZ10gKyAxLCBtb2RpZmllciAtIGFyZyAtIDEsCgkJCQkgICAgICZhcmd2W2FyZyArIDFdLCAmYmFkX2FyZyk7CgkJCWFyZyA9IG1vZGlmaWVyOwoJCX0gZWxzZSB7CgkJCWJhZF9hcmcgPSBUUlVFOwoJCQlhcmcrKzsKCQl9Cgl9CgoJLyogRGlzcGxheSBzeW50YXggbWVzc2FnZSBpZiBlcnJvciBpbiBhcmd1bWVudHMuICovCgoJaWYgKGJhZF9hcmcpIHsKCQl1c2FnZShhcmd2WzBdKTsKCQlleGl0KDEpOwoJfQoKCS8qIEZpbmQgb3V0IHRlcm1pbmFsIG5hbWUuICovCgoJaWYgKG9wdF90ZXJtKSB7CgkJdGVybSA9IG9wdF90ZV90ZXJtaW5hbF9uYW1lOwoJfSBlbHNlIHsKCQl0ZXJtID0gZ2V0ZW52KCJURVJNIik7CgkJaWYgKHRlcm0gPT0gTlVMTCkgewoJCQlmcHJpbnRmKHN0ZGVyciwgXygiJXM6ICRURVJNIGlzIG5vdCBkZWZpbmVkLlxuIiksCgkJCQlhcmd2WzBdKTsKCQkJZXhpdCgxKTsKCQl9Cgl9CgoJLyogRmluZCB0ZXJtaW5mbyBlbnRyeS4gKi8KCglzZXR1cHRlcm0odGVybSwgMSwgKGludCAqKTApOwoKCS8qIFNlZSBpZiB0aGUgdGVybWluYWwgaXMgYSB2aXJ0dWFsIGNvbnNvbGUgdGVybWluYWwuICovCgoJdmN0ZXJtID0gKCFzdHJuY21wKHRlcm0sICJjb24iLCAzKSB8fCAhc3RybmNtcCh0ZXJtLCAibGludXgiLCA1KSk7CgoJLyogUGVyZm9ybSB0aGUgc2VsZWN0ZWQgb3B0aW9ucy4gKi8KCglwZXJmb3JtX3NlcXVlbmNlKHZjdGVybSk7CgoJcmV0dXJuIDA7Cn0K