Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKi0tLSBTdGFydHVwOiB0aGUgcmVhbCBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Z19tYWluLmMgLS0tKi8KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKgogICBUaGlzIGZpbGUgaXMgcGFydCBvZiBWYWxncmluZCwgYW4gZXh0ZW5zaWJsZSB4ODYgcHJvdGVjdGVkLW1vZGUKICAgZW11bGF0b3IgZm9yIG1vbml0b3JpbmcgcHJvZ3JhbSBleGVjdXRpb24gb24geDg2LVVuaXhlcy4KCiAgIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEp1bGlhbiBTZXdhcmQgCiAgICAgIGpzZXdhcmRAYWNtLm9yZwoKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQogICAwMjExMS0xMzA3LCBVU0EuCgogICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgY29udGFpbmVkIGluIHRoZSBmaWxlIENPUFlJTkcuCiovCgojZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0CgojaW5jbHVkZSAiY29yZS5oIgojaW5jbHVkZSAidW1lLmgiCgojaW5jbHVkZSA8ZGlyZW50Lmg+CiNpbmNsdWRlIDxkbGZjbi5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3lzL21tYW4uaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CiNpbmNsdWRlIDxzeXMvd2FpdC5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojaWZuZGVmIEFUX0RDQUNIRUJTSVpFCiNkZWZpbmUgQVRfRENBQ0hFQlNJWkUJCTE5CiNlbmRpZiAvKiBBVF9EQ0FDSEVCU0laRSAqLwoKI2lmbmRlZiBBVF9JQ0FDSEVCU0laRQojZGVmaW5lIEFUX0lDQUNIRUJTSVpFCQkyMAojZW5kaWYgLyogQVRfSUNBQ0hFQlNJWkUgKi8KCiNpZm5kZWYgQVRfVUNBQ0hFQlNJWkUKI2RlZmluZSBBVF9VQ0FDSEVCU0laRQkJMjEKI2VuZGlmIC8qIEFUX1VDQUNIRUJTSVpFICovCgojaWZuZGVmIEFUX1NZU0lORk8KI2RlZmluZSBBVF9TWVNJTkZPCQkzMgojZW5kaWYgLyogQVRfU1lTSU5GTyAqLwoKI2lmbmRlZiBBVF9TWVNJTkZPX0VIRFIKI2RlZmluZSBBVF9TWVNJTkZPX0VIRFIJCTMzCiNlbmRpZiAvKiBBVF9TWVNJTkZPX0VIRFIgKi8KCiNpZm5kZWYgQVRfU0VDVVJFCiNkZWZpbmUgQVRfU0VDVVJFIDIzICAgLyogc2VjdXJlIG1vZGUgYm9vbGVhbiAqLwojZW5kaWYJLyogQVRfU0VDVVJFICovCgovKiByZWR6b25lIGdhcCBiZXR3ZWVuIGNsaWVudCBhZGRyZXNzIHNwYWNlIGFuZCBzaGFkb3cgKi8KI2RlZmluZSBSRURaT05FX1NJWkUJCSgxICogMTAyNCoxMDI0KQoKLyogc2l6ZSBtdWx0aXBsZSBmb3IgY2xpZW50IGFkZHJlc3Mgc3BhY2UgKi8KI2RlZmluZSBDTElFTlRfU0laRV9NVUxUSVBMRQkoMSAqIDEwMjQqMTAyNCkKCi8qIFByb3BvcnRpb24gb2YgY2xpZW50IHNwYWNlIGZvciBpdHMgaGVhcCAocmVzdCBpcyBmb3IgbW1hcHMgKyBzdGFjaykgKi8KI2RlZmluZSBDTElFTlRfSEVBUF9QUk9QT1JUSU9OICAgMC4zMzMKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKj09PSBHbG9iYWwgZW50aXRpZXMgbm90IHJlZmVyZW5jZWQgZnJvbSBnZW5lcmF0ZWQgY29kZSAgICAgICAgICAgPT09Ki8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgU3RhcnR1cCBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBDbGllbnQgYWRkcmVzcyBzcGFjZSwgbG93ZXN0IHRvIGhpZ2hlc3QgKHNlZSB0b3Agb2YgdW1lLmMpICovCkFkZHIgVkdfKGNsaWVudF9iYXNlKTsgICAgICAgICAgIC8qIGNsaWVudCBhZGRyZXNzIHNwYWNlIGxpbWl0cyAqLwpBZGRyIFZHXyhjbGllbnRfZW5kKTsKQWRkciBWR18oY2xpZW50X21hcGJhc2UpOwpBZGRyIFZHXyhjbGllbnRfdHJhbXBvbGluZV9jb2RlKTsKQWRkciBWR18oY2xzdGtfYmFzZSk7CkFkZHIgVkdfKGNsc3RrX2VuZCk7CgpBZGRyIFZHXyhicmtfYmFzZSk7CSAgICAgICAgIC8qIHN0YXJ0IG9mIGJyayAqLwpBZGRyIFZHXyhicmtfbGltaXQpOwkgICAgICAgICAvKiBjdXJyZW50IGJyayAqLwoKQWRkciBWR18oc2hhZG93X2Jhc2UpOwkgICAgICAgICAvKiB0b29sJ3Mgc2hhZG93IG1lbW9yeSAqLwpBZGRyIFZHXyhzaGFkb3dfZW5kKTsKCkFkZHIgVkdfKHZhbGdyaW5kX2Jhc2UpOwkgLyogdmFsZ3JpbmQncyBhZGRyZXNzIHJhbmdlICovCgovLyBOb3RlIHRoYXQgVkdfKHZhbGdyaW5kX2xhc3QpIG5hbWVzIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIHNlY3Rpb24sIHdoZXJlYXMKLy8gdGhlIFZHXygqX2VuZCkgdmFycyBuYW1lIHRoZSBieXRlIG9uZSBwYXN0IHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24uCkFkZHIgVkdfKHZhbGdyaW5kX2xhc3QpOwoKdmtpX3JsaW1pdCBWR18oY2xpZW50X3JsaW1pdF9kYXRhKTsKdmtpX3JsaW1pdCBWR18oY2xpZW50X3JsaW1pdF9zdGFjayk7CgovKiBUaGlzIGlzIHNldCBlYXJseSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoaXMgQ1BVIGhhcyB0aGUKICAgU1NFL2Z4c2F2ZS9meHJlc3RvciBmZWF0dXJlcy4gICovCkJvb2wgVkdfKGhhdmVfc3Nlc3RhdGUpOwoKLyogc3RhZ2UxIChtYWluKSBleGVjdXRhYmxlICovCnN0YXRpYyBJbnQgdmdleGVjZmQgPSAtMTsKCi8qIGNsaWVudCBleGVjdXRhYmxlICovCkludCAgVkdfKGNsZXhlY2ZkKSA9IC0xOwoKLyogUGF0aCB0byBsaWJyYXJ5IGRpcmVjdG9yeSAqLwpjb25zdCBDaGFyICpWR18obGliZGlyKSA9IFZHX0xJQkRJUjsKCi8qIG91ciBhcmdjL2FyZ3YgKi8Kc3RhdGljIEludCAgdmdfYXJnYzsKc3RhdGljIENoYXIgKip2Z19hcmd2OwoKLyogUElEIG9mIHRoZSBtYWluIHRocmVhZCAqLwpJbnQgVkdfKG1haW5fcGlkKTsKCi8qIFBHUlAgb2YgcHJvY2VzcyAqLwpJbnQgVkdfKG1haW5fcGdycCk7CgovKiBBcHBsaWNhdGlvbi12aXNpYmxlIGZpbGUgZGVzY3JpcHRvciBsaW1pdHMgKi8KSW50IFZHXyhmZF9zb2Z0X2xpbWl0KSA9IC0xOwpJbnQgVkdfKGZkX2hhcmRfbGltaXQpID0gLTE7CgovKiBBcyBkZWR1Y2VkIGZyb20gZXNwX2F0X3N0YXJ0dXAsIHRoZSBjbGllbnQncyBhcmdjLCBhcmd2W10gYW5kCiAgIGVudnBbXSBhcyBleHRyYWN0ZWQgZnJvbSB0aGUgY2xpZW50J3Mgc3RhY2sgYXQgc3RhcnR1cC10aW1lLiAqLwpJbnQgICAgVkdfKGNsaWVudF9hcmdjKTsKQ2hhcioqIFZHXyhjbGllbnRfYXJndik7CkNoYXIqKiBWR18oY2xpZW50X2VudnApOwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFJ1bm5pbmcgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogQ291bnRzIGRvd253YXJkcyBpbiBWR18ocnVuX2lubmVybG9vcCkuICovClVJbnQgVkdfKGRpc3BhdGNoX2N0cik7CgovKiA2NC1iaXQgY291bnRlciBmb3IgdGhlIG51bWJlciBvZiBiYXNpYyBibG9ja3MgZG9uZS4gKi8KVUxvbmcgVkdfKGJic19kb25lKTsKCi8qIFRlbGwgdGhlIGxvZ2dpbmcgbWVjaGFuaXNtIHdoZXRoZXIgd2UgYXJlIGxvZ2dpbmcgdG8gYSBmaWxlCiAgIGRlc2NyaXB0b3Igb3IgYSBzb2NrZXQgZGVzY3JpcHRvci4gKi8KQm9vbCBWR18obG9nZ2luZ190b19maWxlZGVzKSA9IFRydWU7CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qPT09IENvdW50ZXJzLCBmb3IgcHJvZmlsaW5nIHB1cnBvc2VzIG9ubHkgICAgICAgICAgICAgICAgICAgICAgICA9PT0qLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8vIFRoZXNlIG9uZXMgbWFpbnRhaW5lZCBieSB2Z19kaXNwYXRjaC5TClVJbnQgVkdfKGJiX2VuY2hhaW5fY291bnQpID0gMDsgICAgICAgIC8vIE51bWJlciBvZiBjaGFpbiBvcGVyYXRpb25zIGRvbmUKVUludCBWR18oYmJfZGVjaGFpbl9jb3VudCkgPSAwOyAgICAgICAgLy8gTnVtYmVyIG9mIHVuY2hhaW4gb3BlcmF0aW9ucyBkb25lClVJbnQgVkdfKHVuY2hhaW5lZF9qdW1wc19kb25lKSA9IDA7ICAgIC8vIE51bWJlciBvZiB1bmNoYWluZWQganVtcHMgZG9uZQoKLyogQ291bnRzIHBlcnRhaW5pbmcgdG8gaW50ZXJuYWwgc2FuaXR5IGNoZWNraW5nLiAqLwpzdGF0aWMgVUludCBzYW5pdHlfZmFzdF9jb3VudCA9IDA7CnN0YXRpYyBVSW50IHNhbml0eV9zbG93X2NvdW50ID0gMDsKCnN0YXRpYyB2b2lkIHByaW50X2FsbF9zdGF0cyAoIHZvaWQgKQp7CiAgIC8vIFRyYW5zbGF0aW9uIHN0YXRzCiAgIFZHXyhwcmludF90dF90Y19zdGF0cykoKTsKICAgVkdfKG1lc3NhZ2UpKFZnX0RlYnVnTXNnLAogICAgICAgICAgICAgICAgImNoYWluaW5nczogJWQgY2hhaW5pbmdzLCAlZCB1bmNoYWluaW5ncy4iLAogICAgICAgICAgICAgICAgVkdfKGJiX2VuY2hhaW5fY291bnQpLCBWR18oYmJfZGVjaGFpbl9jb3VudCkgKTsKICAgVkdfKG1lc3NhZ2UpKFZnX0RlYnVnTXNnLAogICAgICAiIGRpc3BhdGNoOiAlbGx1IGp1bXBzIChiYiBlbnRyaWVzKTsgb2YgdGhlbSAldSAoJWx1JSUpIHVuY2hhaW5lZC4iLAogICAgICBWR18oYmJzX2RvbmUpLCAKICAgICAgVkdfKHVuY2hhaW5lZF9qdW1wc19kb25lKSwKICAgICAgKChVTG9uZykoMTAwKSAqIChVTG9uZykoVkdfKHVuY2hhaW5lZF9qdW1wc19kb25lKSkpCiAgICAgICAgIC8gKCBWR18oYmJzX2RvbmUpPT0wID8gMSA6IFZHXyhiYnNfZG9uZSkgKQogICApOwoKICAgLy8gU2NoZWR1bGVyIHN0YXRzCiAgIFZHXyhwcmludF9zY2hlZHVsZXJfc3RhdHMpKCk7CgogICAvLyBSZWctYWxsb2Mgc3RhdHMKICAgVkdfKHByaW50X3JlZ19hbGxvY19zdGF0cykoKTsKICAgVkdfKG1lc3NhZ2UpKFZnX0RlYnVnTXNnLCAKICAgICAgICAgICAgICAgICIgICBzYW5pdHk6ICVkIGNoZWFwLCAlZCBleHBlbnNpdmUgY2hlY2tzLiIsCiAgICAgICAgICAgICAgICBzYW5pdHlfZmFzdF9jb3VudCwgc2FuaXR5X3Nsb3dfY291bnQgKTsKCiAgIC8vIEMgY2FsbCBzdGF0cwogICBWR18ocHJpbnRfY2NhbGxfc3RhdHMpKCk7CgogICAvLyBVSW5zdHIgaGlzdG9ncmFtIAogICBpZiAoVkdfKGNsb192ZXJib3NpdHkpID4gMykKICAgICAgVkdfKHByaW50X1VJbnN0cl9oaXN0b2dyYW0pKCk7CgogICAvLyBNZW1vcnkgc3RhdHMKICAgaWYgKFZHXyhjbG9fdmVyYm9zaXR5KSA+IDIpIHsKICAgICAgVkdfKG1lc3NhZ2UpKFZnX0RlYnVnTXNnLCAiIik7CiAgICAgIFZHXyhtZXNzYWdlKShWZ19EZWJ1Z01zZywgCiAgICAgICAgICItLS0tLS0gVmFsZ3JpbmQncyBpbnRlcm5hbCBtZW1vcnkgdXNlIHN0YXRzIGZvbGxvdyAtLS0tLS0iICk7CiAgICAgIFZHXyhzYW5pdHlfY2hlY2tfbWFsbG9jX2FsbCkoKTsKICAgICAgVkdfKHByaW50X2FsbF9hcmVuYV9zdGF0cykoKTsKICAgICAgVkdfKG1lc3NhZ2UpKFZnX0RlYnVnTXNnLCAiIik7CiAgICAgIFZHXyhtZXNzYWdlKShWZ19EZWJ1Z01zZywgCiAgICAgICAgICItLS0tLS0gVmFsZ3JpbmQncyBFeGVDb250ZXh0IG1hbmFnZW1lbnQgc3RhdHMgZm9sbG93IC0tLS0tLSIgKTsKICAgICAgVkdfKHByaW50X0V4ZUNvbnRleHRfc3RhdHMpKCk7CiAgIH0KfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKj09PSBNaXNjZWxsYW5lb3VzIGdsb2JhbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09Ki8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpzdGF0aWMgSW50IHB0cmFjZV9zZXRyZWdzKEludCBwaWQsIFRocmVhZElkIHRpZCkKewogICBpZiAoVkdfKGlzX3J1bm5pbmdfdGhyZWFkKSggdGlkICkpCiAgICAgIHJldHVybiBWR0FfKHB0cmFjZV9zZXRyZWdzX2Zyb21fQkIpKHBpZCk7CiAgIGVsc2UKICAgICAgcmV0dXJuIFZHQV8ocHRyYWNlX3NldHJlZ3NfZnJvbV90c3QpKHBpZCwgJlZHXyh0aHJlYWRzKVt0aWRdLmFyY2gpOwp9CgovKiBTdGFydCBkZWJ1Z2dlciBhbmQgZ2V0IGl0IHRvIGF0dGFjaCB0byB0aGlzIHByb2Nlc3MuICBDYWxsZWQgaWYgdGhlCiAgIHVzZXIgcmVxdWVzdHMgdGhpcyBzZXJ2aWNlIGFmdGVyIGFuIGVycm9yIGhhcyBiZWVuIHNob3duLCBzbyBzaGUgY2FuCiAgIHBva2UgYXJvdW5kIGFuZCBsb29rIGF0IHBhcmFtZXRlcnMsIG1lbW9yeSwgZXRjLiAgWW91IGNhbid0CiAgIG1lYW5pbmdmdWxseSBnZXQgdGhlIGRlYnVnZ2VyIHRvIGNvbnRpbnVlIHRoZSBwcm9ncmFtLCB0aG91Z2g7IHRvCiAgIGNvbnRpbnVlLCBxdWl0IHRoZSBkZWJ1Z2dlci4gICovCnZvaWQgVkdfKHN0YXJ0X2RlYnVnZ2VyKSAoIEludCB0aWQgKQp7CiAgIEludCBwaWQ7CgogICBpZiAoKHBpZCA9IGZvcmsoKSkgPT0gMCkgewogICAgICBwdHJhY2UoUFRSQUNFX1RSQUNFTUUsIDAsIE5VTEwsIE5VTEwpOwogICAgICBWR18oa2tpbGwpKFZHXyhnZXRwaWQpKCksIFZLSV9TSUdTVE9QKTsKCiAgIH0gZWxzZSBpZiAocGlkID4gMCkgewogICAgICBJbnQgc3RhdHVzOwogICAgICBJbnQgcmVzOwoKICAgICAgaWYgKChyZXMgPSBWR18od2FpdHBpZCkocGlkLCAmc3RhdHVzLCAwKSkgPT0gcGlkICYmCiAgICAgICAgICBXSUZTVE9QUEVEKHN0YXR1cykgJiYgV1NUT1BTSUcoc3RhdHVzKSA9PSBTSUdTVE9QICYmCiAgICAgICAgICBwdHJhY2Vfc2V0cmVncyhwaWQsIHRpZCkgPT0gMCAmJgogICAgICAgICAga2lsbChwaWQsIFNJR1NUT1ApID09IDAgJiYKICAgICAgICAgIHB0cmFjZShQVFJBQ0VfREVUQUNILCBwaWQsIE5VTEwsIDApID09IDApIHsKICAgICAgICAgQ2hhciBwaWRidWZbMTVdOwogICAgICAgICBDaGFyIGZpbGVbMzBdOwogICAgICAgICBDaGFyIGJ1ZlsxMDBdOwogICAgICAgICBDaGFyICpidWZwdHI7CiAgICAgICAgIENoYXIgKmNtZHB0cjsKICAgICAgICAgCiAgICAgICAgIFZHXyhzcHJpbnRmKShwaWRidWYsICIlZCIsIHBpZCk7CiAgICAgICAgIFZHXyhzcHJpbnRmKShmaWxlLCAiL3Byb2MvJWQvZmQvJWQiLCBwaWQsIFZHXyhjbGV4ZWNmZCkpOwogCiAgICAgICAgIGJ1ZnB0ciA9IGJ1ZjsKICAgICAgICAgY21kcHRyID0gVkdfKGNsb19kYl9jb21tYW5kKTsKICAgICAgICAgCiAgICAgICAgIHdoaWxlICgqY21kcHRyKSB7CiAgICAgICAgICAgIHN3aXRjaCAoKmNtZHB0cikgewogICAgICAgICAgICAgICBjYXNlICclJzoKICAgICAgICAgICAgICAgICAgc3dpdGNoICgqKytjbWRwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZic6CiAgICAgICAgICAgICAgICAgICAgICAgIFZHXyhtZW1jcHkpKGJ1ZnB0ciwgZmlsZSwgVkdfKHN0cmxlbikoZmlsZSkpOwogICAgICAgICAgICAgICAgICAgICAgICBidWZwdHIgKz0gVkdfKHN0cmxlbikoZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNtZHB0cisrOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgY2FzZSAncCc6CiAgICAgICAgICAgICAgICAgICAgIFZHXyhtZW1jcHkpKGJ1ZnB0ciwgcGlkYnVmLCBWR18oc3RybGVuKShwaWRidWYpKTsKICAgICAgICAgICAgICAgICAgICAgYnVmcHRyICs9IFZHXyhzdHJsZW4pKHBpZGJ1Zik7CiAgICAgICAgICAgICAgICAgICAgIGNtZHB0cisrOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgKmJ1ZnB0cisrID0gKmNtZHB0cisrOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgKmJ1ZnB0cisrID0gKmNtZHB0cisrOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICAqYnVmcHRyKysgPSAnXDAnOwogIAogICAgICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgInN0YXJ0aW5nIGRlYnVnZ2VyIHdpdGggY21kOiAlcyIsIGJ1Zik7CiAgICAgICAgIHJlcyA9IFZHXyhzeXN0ZW0pKGJ1Zik7CiAgICAgICAgIGlmIChyZXMgPT0gMCkgeyAgICAgIAogICAgICAgICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgIiIpOwogICAgICAgICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgCiAgICAgICAgICAgICAgICAgICAgICAgICAiRGVidWdnZXIgaGFzIGRldGFjaGVkLiAgVmFsZ3JpbmQgcmVnYWlucyBjb250cm9sLiAgV2UgY29udGludWUuIik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFZHXyhtZXNzYWdlKShWZ19Vc2VyTXNnLCAiQXBwYXJlbnRseSBmYWlsZWQhIik7CiAgICAgICAgICAgIFZHXyhtZXNzYWdlKShWZ19Vc2VyTXNnLCAiIik7CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgVkdfKGtraWxsKShwaWQsIFZLSV9TSUdLSUxMKTsKICAgICAgVkdfKHdhaXRwaWQpKHBpZCwgJnN0YXR1cywgMCk7CiAgIH0KfQoKCi8qIFByaW50IHNvbWUgaGVscGZ1bC1pc2ggdGV4dCBhYm91dCB1bmltcGxlbWVudGVkIHRoaW5ncywgYW5kIGdpdmUKICAgdXAuICovCnZvaWQgVkdfKHVuaW1wbGVtZW50ZWQpICggQ2hhciogbXNnICkKewogICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgIiIpOwogICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgCiAgICAgICJWYWxncmluZCBkZXRlY3RlZCB0aGF0IHlvdXIgcHJvZ3JhbSByZXF1aXJlcyIpOwogICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgCiAgICAgICJ0aGUgZm9sbG93aW5nIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb25hbGl0eToiKTsKICAgVkdfKG1lc3NhZ2UpKFZnX1VzZXJNc2csICIgICAlcyIsIG1zZyk7CiAgIFZHXyhtZXNzYWdlKShWZ19Vc2VyTXNnLAogICAgICAiVGhpcyBtYXkgYmUgYmVjYXVzZSB0aGUgZnVuY3Rpb25hbGl0eSBpcyBoYXJkIHRvIGltcGxlbWVudCwiKTsKICAgVkdfKG1lc3NhZ2UpKFZnX1VzZXJNc2csCiAgICAgICJvciBiZWNhdXNlIG5vIHJlYXNvbmFibGUgcHJvZ3JhbSB3b3VsZCBiZWhhdmUgdGhpcyB3YXksIik7CiAgIFZHXyhtZXNzYWdlKShWZ19Vc2VyTXNnLAogICAgICAib3IgYmVjYXVzZSBub2JvZHkgaGFzIHlldCBuZWVkZWQgaXQuICBJbiBhbnkgY2FzZSwgbGV0IHVzIGtub3cgYXQiKTsKICAgVkdfKG1lc3NhZ2UpKFZnX1VzZXJNc2csCiAgICAgICIlcyBhbmQvb3IgdHJ5IHRvIHdvcmsgYXJvdW5kIHRoZSBwcm9ibGVtLCBpZiB5b3UgY2FuLiIsIFZHX0JVR1NfVE8pOwogICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywKICAgICAgIiIpOwogICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywKICAgICAgIlZhbGdyaW5kIGhhcyB0byBleGl0IG5vdy4gIFNvcnJ5LiAgQnllISIpOwogICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywKICAgICAgIiIpOwogICBWR18ocHBfc2NoZWRfc3RhdHVzKSgpOwogICBWR18oZXhpdCkoMSk7Cn0KCkFkZHIgVkdfKGdldF9zdGFja19wb2ludGVyKSAoIHZvaWQgKQp7CiAgIHJldHVybiBWR18oYmFzZUJsb2NrKVtWR09GRl9TVEFDS19QVFJdOwp9CgovKiBEZWJ1Z2dpbmcgdGhpbmcgLi4gY2FuIGJlIGNhbGxlZCBmcm9tIGFzc2VtYmx5IHdpdGggT1lOSyBtYWNyby4gKi8Kdm9pZCBWR18ob3luaykgKCBJbnQgbiApCnsKICAgT0lOSyhuKTsKfQoKLyogSW5pdGlhbGl6ZSB0aGUgUElEIGFuZCBQR1JQIG9mIHNjaGVkdWxlciBMV1A7IHRoaXMgaXMgYWxzbyBjYWxsZWQKICAgaW4gYW55IG5ldyBjaGlsZHJlbiBhZnRlciBmb3JrLiAqLwpzdGF0aWMgdm9pZCBuZXdwaWQoVGhyZWFkSWQgdW51c2VkKQp7CiAgIC8qIFBJRCBvZiBzY2hlZHVsZXIgTFdQICovCiAgIFZHXyhtYWluX3BpZCkgID0gVkdfKGdldHBpZCkoKTsKICAgVkdfKG1haW5fcGdycCkgPSBWR18oZ2V0cGdycCkoKTsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qPT09IENoZWNrIHdlIHdlcmUgbGF1bmNoZWQgYnkgc3RhZ2UgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0qLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qIExvb2sgZm9yIG91ciBBVVhWIHRhYmxlICovCmludCBzY2FuX2F1eHYodm9pZCogaW5pdF9zcCkKewogICBjb25zdCBzdHJ1Y3QgdW1lX2F1eHYgKmF1eHYgPSBmaW5kX2F1eHYoKGludCAqKWluaXRfc3ApOwogICBpbnQgcGFkZmlsZSA9IC0xLCBmb3VuZCA9IDA7CgogICBmb3IgKDsgYXV4di0+YV90eXBlICE9IEFUX05VTEw7IGF1eHYrKykKICAgICAgc3dpdGNoKGF1eHYtPmFfdHlwZSkgewogICAgICBjYXNlIEFUX1VNRV9QQURGRDoKCSBwYWRmaWxlID0gYXV4di0+dS5hX3ZhbDsKCSBmb3VuZCB8PSAxOwoJIGJyZWFrOwoKICAgICAgY2FzZSBBVF9VTUVfRVhFQ0ZEOgoJIHZnZXhlY2ZkID0gYXV4di0+dS5hX3ZhbDsKCSBmb3VuZCB8PSAyOwoJIGJyZWFrOwoKICAgICAgY2FzZSBBVF9QSERSOgogICAgICAgICBWR18odmFsZ3JpbmRfYmFzZSkgPSBQR1JPVU5ERE4oYXV4di0+dS5hX3ZhbCk7CiAgICAgICAgIGJyZWFrOwogICAgICB9CgogICBpZiAoIGZvdW5kICE9ICgxfDIpICkgewogICAgICBmcHJpbnRmKHN0ZGVyciwgInZhbGdyaW5kOiBzdGFnZTIgbXVzdCBiZSBsYXVuY2hlZCBieSBzdGFnZTFcbiIpOwogICAgICBleGl0KDEyNyk7CiAgIH0KICAgdmdfYXNzZXJ0KHBhZGZpbGUgPj0gMCk7CiAgIHJldHVybiBwYWRmaWxlOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qPT09IEFkZHJlc3Mgc3BhY2UgZGV0ZXJtaW5hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0qLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCmV4dGVybiBjaGFyIF9zdGFydFtdOwoKc3RhdGljIHZvaWQgbGF5b3V0X3JlbWFpbmluZ19zcGFjZShBZGRyIGFyZ2NfYWRkciwgZmxvYXQgcmF0aW8pCnsKICAgSW50ICAgIGlyZXM7CiAgIHZvaWQqICB2cmVzOwogICBhZGRyX3QgY2xpZW50X3NpemUsIHNoYWRvd19zaXplOwoKICAgLy8gVkdfKHZhbGdyaW5kX2Jhc2UpIHNob3VsZCBoYXZlIGJlZW4gc2V0IGJ5IHNjYW5fYXV4diwgYnV0IGlmIG5vdCwKICAgLy8gdGhpcyBpcyBhIHdvcmthYmxlIGFwcHJveGltYXRpb24KICAgaWYgKFZHXyh2YWxncmluZF9iYXNlKSA9PSAwKSB7CiAgICAgIFZHXyh2YWxncmluZF9iYXNlKSA9IFBHUk9VTkRETigmX3N0YXJ0KTsKICAgfQoKICAgVkdfKHZhbGdyaW5kX2xhc3QpICA9IFJPVU5EVVAoYXJnY19hZGRyLCAweDEwMDAwKSAtIDE7IC8vIHN0YWNrCgogICAvLyBUaGlzIGdpdmVzIHRoZSBjbGllbnQgdGhlIGxhcmdlc3QgcG9zc2libGUgYWRkcmVzcyBzcGFjZSB3aGlsZQogICAvLyB0YWtpbmcgaW50byBhY2NvdW50IHRoZSB0b29sJ3Mgc2hhZG93IG5lZWRzLgogICBjbGllbnRfc2l6ZSAgICAgICAgID0gUk9VTkRETigoVkdfKHZhbGdyaW5kX2Jhc2UpLVJFRFpPTkVfU0laRSkgLyAoMS4rcmF0aW8pLAogICAgICAgICAgICAgICAgICAgICAgICAgQ0xJRU5UX1NJWkVfTVVMVElQTEUpOwogICBWR18oY2xpZW50X2Jhc2UpICAgID0gQ0xJRU5UX0JBU0U7CiAgIFZHXyhjbGllbnRfZW5kKSAgICAgPSBWR18oY2xpZW50X2Jhc2UpICsgY2xpZW50X3NpemU7CiAgIC8qIHdoZXJlICFGSVhFRCBtbWFwIGdvZXMgKi8KICAgVkdfKGNsaWVudF9tYXBiYXNlKSA9IFZHXyhjbGllbnRfYmFzZSkgKwogICAgICAgICBQR1JPVU5ERE4oKGFkZHJfdCkoY2xpZW50X3NpemUgKiBDTElFTlRfSEVBUF9QUk9QT1JUSU9OKSk7CgogICBWR18oc2hhZG93X2Jhc2UpICAgID0gVkdfKGNsaWVudF9lbmQpICsgUkVEWk9ORV9TSVpFOwogICBWR18oc2hhZG93X2VuZCkgICAgID0gVkdfKHZhbGdyaW5kX2Jhc2UpOwogICBzaGFkb3dfc2l6ZSAgICAgICAgID0gVkdfKHNoYWRvd19lbmQpIC0gVkdfKHNoYWRvd19iYXNlKTsKCiNkZWZpbmUgU0VHU0laRShhLGIpICgoVkdfKGIpIC0gVkdfKGEpKS8oMTAyNCoxMDI0KSkKCiAgIGlmICgwKQogICAgICBWR18ocHJpbnRmKSgKICAgICAgICAgImNsaWVudF9iYXNlICAgICAgICAlOHggKCVkTUIpXG4iCiAgICAgICAgICJjbGllbnRfbWFwYmFzZSAgICAgJTh4ICglZE1CKVxuIgogICAgICAgICAiY2xpZW50X2VuZCAgICAgICAgICU4eCAoJWRNQilcbiIKICAgICAgICAgInNoYWRvd19iYXNlICAgICAgICAlOHggKCVkTUIpXG4iCiAgICAgICAgICJzaGFkb3dfZW5kICAgICAgICAgJTh4XG4iCiAgICAgICAgICJ2YWxncmluZF9iYXNlICAgICAgJTh4ICglZE1CKVxuIgogICAgICAgICAidmFsZ3JpbmRfbGFzdCAgICAgICU4eFxuIiwKICAgICAgICAgVkdfKGNsaWVudF9iYXNlKSwgICAgICAgU0VHU0laRShjbGllbnRfYmFzZSwgICAgICAgY2xpZW50X21hcGJhc2UpLAogICAgICAgICBWR18oY2xpZW50X21hcGJhc2UpLCAgICBTRUdTSVpFKGNsaWVudF9tYXBiYXNlLCAgICBjbGllbnRfZW5kKSwKICAgICAgICAgVkdfKGNsaWVudF9lbmQpLCAgICAgICAgU0VHU0laRShjbGllbnRfZW5kLCAgICAgICAgc2hhZG93X2Jhc2UpLAogICAgICAgICBWR18oc2hhZG93X2Jhc2UpLCAgICAgICBTRUdTSVpFKHNoYWRvd19iYXNlLCAgICAgICBzaGFkb3dfZW5kKSwKICAgICAgICAgVkdfKHNoYWRvd19lbmQpLAogICAgICAgICBWR18odmFsZ3JpbmRfYmFzZSksICAgICBTRUdTSVpFKHZhbGdyaW5kX2Jhc2UsICAgICB2YWxncmluZF9sYXN0KSwKICAgICAgICAgVkdfKHZhbGdyaW5kX2xhc3QpCiAgICAgICk7CgojdW5kZWYgU0VHU0laRQoKICAgLy8gQmFuIHJlZHpvbmUKICAgdnJlcyA9IG1tYXAoKHZvaWQgKilWR18oY2xpZW50X2VuZCksIFJFRFpPTkVfU0laRSwgUFJPVF9OT05FLAogICAgICAgICAgICAgICBNQVBfRklYRUR8TUFQX0FOT058TUFQX1BSSVZBVEV8TUFQX05PUkVTRVJWRSwgLTEsIDApOwogICB2Z19hc3NlcnQoKHZvaWQqKS0xICE9IHZyZXMpOwoKICAgLy8gTWFrZSBjbGllbnQgaG9sZQogICBpcmVzID0gbXVubWFwKCh2b2lkKilWR18oY2xpZW50X2Jhc2UpLCBjbGllbnRfc2l6ZSk7CiAgIHZnX2Fzc2VydCgwID09IGlyZXMpOwoKICAgLy8gTWFwIHNoYWRvdyBtZW1vcnkuCiAgIC8vIEluaXRpYWxseSBhbGwgaW5hY2Nlc3NpYmxlLCBpbmNyZW1lbnRhbGx5IGluaXRpYWxpemVkIGFzIGl0IGlzIHVzZWQKICAgaWYgKHNoYWRvd19zaXplICE9IDApIHsKICAgICAgdnJlcyA9IG1tYXAoKGNoYXIgKilWR18oc2hhZG93X2Jhc2UpLCBzaGFkb3dfc2l6ZSwgUFJPVF9OT05FLAogICAgICAgICAgICAgICAgICBNQVBfUFJJVkFURXxNQVBfQU5PTnxNQVBfRklYRUR8TUFQX05PUkVTRVJWRSwgLTEsIDApOwogICAgICBpZiAoKHZvaWQqKS0xID09IHZyZXMpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsIAogICAgICAgICAgInZhbGdyaW5kOiBDb3VsZCBub3QgYWxsb2NhdGUgYWRkcmVzcyBzcGFjZSAoJXAgYnl0ZXMpXG4iCiAgICAgICAgICAidmFsZ3JpbmQ6ICAgZm9yIHNoYWRvdyBtZW1vcnlcbiIKICAgICAgICAgICJ2YWxncmluZDogUG9zc2libGUgY2F1c2VzOlxuIgogICAgICAgICAgInZhbGdyaW5kOiAtIEZvciBzb21lIHN5c3RlbXMgKGVzcGVjaWFsbHkgdW5kZXIgUmVkSGF0IDgpLCBWYWxncmluZFxuIgogICAgICAgICAgInZhbGdyaW5kOiAgIG5lZWRzIGF0IGxlYXN0IDEuNUdCIHN3YXAgc3BhY2UuXG4iCiAgICAgICAgICAidmFsZ3JpbmQ6IC0gT3IsIHlvdXIgdmlydHVhbCBtZW1vcnkgc2l6ZSBtYXkgYmUgbGltaXRlZCAoY2hlY2tcbiIKICAgICAgICAgICJ2YWxncmluZDogICB3aXRoICd1bGltaXQgLXYnKS5cbiIKICAgICAgICAgICJ2YWxncmluZDogLSBPciwgeW91ciBzeXN0ZW0gbWF5IHVzZSBhIGtlcm5lbCB0aGF0IHByb3ZpZGVzIG9ubHkgYVxuIiAKICAgICAgICAgICJ2YWxncmluZDogICB0b28tc21hbGwgKGVnLiAyR0IpIHVzZXIgYWRkcmVzcyBzcGFjZS5cbiIKICAgICAgICAgICwgKHZvaWQqKXNoYWRvd19zaXplCiAgICAgICAgICk7IAogICAgICAgICBleGl0KDEpOwogICAgICB9CiAgIH0KfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qPT09IENvbW1hbmQgbGluZSBzZXR1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0qLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qIE5iOiBtYWxsb2MnZCBtZW1vcnkgbmV2ZXIgZnJlZWQgLS0ga2VwdCB0aHJvdWdob3V0IGxpa2UgYXJndiwgZW52cCAqLwpzdGF0aWMgY2hhciogZ2V0X2ZpbGVfY2xvKGNoYXIqIGRpcikKewojICBkZWZpbmUgRkxFTiA1MTIKICAgSW50IGZkLCBuOwogICBzdHJ1Y3Qgc3RhdCBzMTsKICAgY2hhciogZl9jbG8gPSBOVUxMOwogICBjaGFyIGZpbGVuYW1lW0ZMRU5dOwoKICAgc25wcmludGYoZmlsZW5hbWUsIEZMRU4sICIlcy8udmFsZ3JpbmRyYyIsICggTlVMTCA9PSBkaXIgPyAiIiA6IGRpciApICk7CiAgIGZkID0gVkdfKG9wZW4pKGZpbGVuYW1lLCAwLCBWS0lfU19JUlVTUik7CiAgIGlmICggZmQgPiAwICkgewogICAgICBpZiAoIDAgPT0gZnN0YXQoZmQsICZzMSkgKSB7CiAgICAgICAgIGZfY2xvID0gbWFsbG9jKHMxLnN0X3NpemUrMSk7CiAgICAgICAgIHZnX2Fzc2VydChmX2Nsbyk7CiAgICAgICAgIG4gPSByZWFkKGZkLCBmX2NsbywgczEuc3Rfc2l6ZSk7CiAgICAgICAgIGlmIChuID09IC0xKSBuID0gMDsKICAgICAgICAgZl9jbG9bbl0gPSAnXDAnOwogICAgICB9CiAgICAgIGNsb3NlKGZkKTsKICAgfQogICByZXR1cm4gZl9jbG87CiMgIHVuZGVmIEZMRU4KfQoKI2RlZmluZSBJU1NQQUNFKGNjKSAgICAgICgoY2MpID09ICcgJyB8fCAoY2MpID09ICdcdCcgfHwgKGNjKSA9PSAnXG4nKQoKc3RhdGljIEludCBjb3VudF9hcmdzKGNoYXIqIHMpCnsKICAgSW50IG4gPSAwOwogICBpZiAocykgewogICAgICBjaGFyKiBjcCA9IHM7CiAgICAgIHdoaWxlIChUcnVlKSB7CiAgICAgICAgIC8vIFdlIGhhdmUgYWx0ZXJuYXRpbmcgc2VxdWVuY2VzOiBibGFua3MsIG5vbi1ibGFua3MsIGJsYW5rcy4uLgogICAgICAgICAvLyBjb3VudCB0aGUgbm9uLWJsYW5rcyBzZXF1ZW5jZXMuCiAgICAgICAgIHdoaWxlICggSVNTUEFDRSgqY3ApICkgICAgICAgICBjcCsrOwogICAgICAgICBpZiAgICAoICEqY3AgKSAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIG4rKzsKICAgICAgICAgd2hpbGUgKCAhSVNTUEFDRSgqY3ApICYmICpjcCApIGNwKys7CiAgICAgIH0KICAgfQogICByZXR1cm4gbjsKfQoKLyogYWRkIGFyZ3Mgb3V0IG9mIGVudmlyb25tZW50LCBza2lwcGluZyBtdWx0aXBsZSBzcGFjZXMgYW5kIC0tIGFyZ3MgKi8Kc3RhdGljIGNoYXIqKiBjb3B5X2FyZ3MoIGNoYXIqIHMsIGNoYXIqKiB0byApCnsKICAgaWYgKHMpIHsKICAgICAgY2hhciogY3AgPSBzOwogICAgICB3aGlsZSAoVHJ1ZSkgewogICAgICAgICAvLyBXZSBoYXZlIGFsdGVybmF0aW5nIHNlcXVlbmNlczogYmxhbmtzLCBub24tYmxhbmtzLCBibGFua3MuLi4KICAgICAgICAgLy8gY29weSB0aGUgbm9uLWJsYW5rcyBzZXF1ZW5jZXMsIGFuZCBhZGQgdGVybWluYXRpbmcgJ1wwJwogICAgICAgICB3aGlsZSAoIElTU1BBQ0UoKmNwKSApICAgICAgICAgY3ArKzsKICAgICAgICAgaWYgICAgKCAhKmNwICkgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAqdG8rKyA9IGNwOwogICAgICAgICB3aGlsZSAoICFJU1NQQUNFKCpjcCkgJiYgKmNwICkgY3ArKzsKICAgICAgICAgaWYgKCAqY3AgKSAqY3ArKyA9ICdcMCc7ICAgICAgICAgICAgLy8gdGVybWluYXRlIGlmIG5lY2Vzc2FyeQogICAgICAgICBpZiAoVkdfU1RSRVEodG9bLTFdLCAiLS0iKSkgdG8tLTsgICAvLyB1bmRvIGFueSAnLS0nIGFyZwogICAgICB9CiAgIH0KICAgcmV0dXJuIHRvOwp9CgojdW5kZWYgSVNTUEFDRQoKLy8gQXVnbWVudCBjb21tYW5kIGxpbmUgd2l0aCBhcmd1bWVudHMgZnJvbSBlbnZpcm9ubWVudCBhbmQgLnZhbGdyaW5kcmMKLy8gZmlsZXMuCnN0YXRpYyB2b2lkIGF1Z21lbnRfY29tbWFuZF9saW5lKEludCogdmdfYXJnY19pbm91dCwgY2hhcioqKiB2Z19hcmd2X2lub3V0KQp7CiAgIGludCAgICB2Z19hcmdjMCA9ICp2Z19hcmdjX2lub3V0OwogICBjaGFyKiogdmdfYXJndjAgPSAqdmdfYXJndl9pbm91dDsKCiAgIGNoYXIqICBlbnZfY2xvID0gZ2V0ZW52KFZBTEdSSU5ET1BUUyk7CiAgIGNoYXIqICBmMV9jbG8gID0gZ2V0X2ZpbGVfY2xvKCBnZXRlbnYoIkhPTUUiKSApOwogICBjaGFyKiAgZjJfY2xvICA9IGdldF9maWxlX2NsbygiLiIpOwoKICAgLyogY29weSBhbnkgZXh0cmEgYXJncyBmcm9tIGZpbGUgb3IgZW52aXJvbm1lbnQsIGlmIHByZXNlbnQgKi8KICAgaWYgKCAoZW52X2NsbyAmJiAqZW52X2NsbykgfHwgKGYxX2NsbyAmJiAqZjFfY2xvKSB8fCAoZjJfY2xvICYmICpmMl9jbG8pICkgewogICAgICAvKiAnICcgc2VwYXJhdGVkIGV4dHJhIG9wdGlvbnMgKi8KICAgICAgY2hhciAqKmZyb207CiAgICAgIGNoYXIgKip0bzsKICAgICAgaW50IG9yaWdfYXJnX2NvdW50LCBlbnZfYXJnX2NvdW50LCBmMV9hcmdfY291bnQsIGYyX2FyZ19jb3VudDsKCiAgICAgIGZvciAoIG9yaWdfYXJnX2NvdW50ID0gMDsgdmdfYXJndjBbb3JpZ19hcmdfY291bnRdOyBvcmlnX2FyZ19jb3VudCsrICk7CgogICAgICBlbnZfYXJnX2NvdW50ID0gY291bnRfYXJncyhlbnZfY2xvKTsKICAgICAgZjFfYXJnX2NvdW50ICA9IGNvdW50X2FyZ3MoZjFfY2xvKTsKICAgICAgZjJfYXJnX2NvdW50ICA9IGNvdW50X2FyZ3MoZjJfY2xvKTsKCiAgICAgIGlmICgwKQoJIHByaW50ZigiZXh0cmEtYXJnYz0lZCAlZCAlZFxuIiwKCQllbnZfYXJnX2NvdW50LCBmMV9hcmdfY291bnQsIGYyX2FyZ19jb3VudCk7CgogICAgICAvKiArMjogKzEgZm9yIG51bGwtdGVybWluYXRpb24sICsxIGZvciBhZGRlZCAnLS0nICovCiAgICAgIGZyb20gICAgID0gdmdfYXJndjA7CiAgICAgIHZnX2FyZ3YwID0gbWFsbG9jKCAob3JpZ19hcmdfY291bnQgKyBlbnZfYXJnX2NvdW50ICsgZjFfYXJnX2NvdW50IAogICAgICAgICAgICAgICAgICAgICAgICAgICsgZjJfYXJnX2NvdW50ICsgMikgKiBzaXplb2YoY2hhciAqKikpOwogICAgICB2Z19hc3NlcnQodmdfYXJndjApOwogICAgICB0byAgICAgID0gdmdfYXJndjA7CgogICAgICAvKiBjb3B5IGFyZ3ZbMF0gKi8KICAgICAgKnRvKysgPSAqZnJvbSsrOwoKICAgICAgLyogQ29weSBleHRyYSBhcmdzIGZyb20gZW52IHZhciBhbmQgZmlsZSwgaW4gdGhlIG9yZGVyOiB+Ly52YWxncmluZHJjLAogICAgICAgKiAkVkFMR1JJTkRfT1BUUywgLi8udmFsZ3JpbmRyYyAtLSBtb3JlIGxvY2FsIG9wdGlvbnMgYXJlIHB1dCBsYXRlcgogICAgICAgKiB0byBvdmVycmlkZSBsZXNzIGxvY2FsIG9uZXMuICovCiAgICAgIHRvID0gY29weV9hcmdzKGYxX2NsbywgIHRvKTsKICAgICAgdG8gPSBjb3B5X2FyZ3MoZW52X2NsbywgdG8pOwogICAgICB0byA9IGNvcHlfYXJncyhmMl9jbG8sICB0byk7CgogICAgICAvKiBjb3B5IG9yaWdpbmFsIGFyZ3VtZW50cywgc3RvcHBpbmcgYXQgY29tbWFuZCBvciAtLSAqLwogICAgICB3aGlsZSAoKmZyb20pIHsKCSBpZiAoKipmcm9tICE9ICctJykKCSAgICBicmVhazsKCSBpZiAoVkdfU1RSRVEoKmZyb20sICItLSIpKSB7CgkgICAgZnJvbSsrOwkJLyogc2tpcCAtLSAqLwoJICAgIGJyZWFrOwoJIH0KCSAqdG8rKyA9ICpmcm9tKys7CiAgICAgIH0KCiAgICAgIC8qIGFkZCAtLSAqLwogICAgICAqdG8rKyA9ICItLSI7CgogICAgICB2Z19hcmdjMCA9IHRvIC0gdmdfYXJndjA7CgogICAgICAvKiBjb3B5IHJlc3Qgb2Ygb3JpZ2luYWwgY29tbWFuZCBsaW5lLCB0aGVuIE5VTEwgKi8KICAgICAgd2hpbGUgKCpmcm9tKSAqdG8rKyA9ICpmcm9tKys7CiAgICAgICp0byA9IE5VTEw7CiAgIH0KCiAgICp2Z19hcmdjX2lub3V0ID0gdmdfYXJnYzA7CiAgICp2Z19hcmd2X2lub3V0ID0gdmdfYXJndjA7Cn0KCiNkZWZpbmUgVkdfQ0xPX1NFUCAgICdcMDEnCgpzdGF0aWMgdm9pZCBnZXRfY29tbWFuZF9saW5lKCBpbnQgYXJnYywgY2hhcioqIGFyZ3YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCogdmdfYXJnY19vdXQsIENoYXIqKiogdmdfYXJndl9vdXQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKioqIGNsX2FyZ3Zfb3V0ICkKewogICBpbnQgICAgdmdfYXJnYzA7CiAgIGNoYXIqKiB2Z19hcmd2MDsKICAgY2hhcioqIGNsX2FyZ3Y7CiAgIGNoYXIqICBlbnZfY2xvID0gZ2V0ZW52KFZBTEdSSU5EQ0xPKTsKCiAgIGlmIChlbnZfY2xvICE9IE5VTEwgJiYgKmVudl9jbG8gIT0gJ1wwJykgewogICAgICBjaGFyICpjcDsKICAgICAgY2hhciAqKmNwcDsKCiAgICAgIC8qIE9LLCBWQUxHUklORENMTyBpcyBzZXQsIHdoaWNoIG1lYW5zIHdlIG11c3QgYmUgYSBjaGlsZCBvZiBhbm90aGVyCiAgICAgICAgIFZhbGdyaW5kIHByb2Nlc3MgdXNpbmcgLS10cmFjZS1jaGlsZHJlbiwgc28gd2UncmUgZ2V0dGluZyBhbGwgb3VyCiAgICAgICAgIGFyZ3VtZW50cyBmcm9tIFZBTEdSSU5EQ0xPLCBhbmQgdGhlIGVudGlyZSBjb21tYW5kIGxpbmUgYmVsb25ncyB0bwogICAgICAgICB0aGUgY2xpZW50IChpbmNsdWRpbmcgYXJndlswXSkgKi8KICAgICAgdmdfYXJnYzAgPSAxOwkJLyogYXJndlswXSAqLwogICAgICBmb3IgKGNwID0gZW52X2NsbzsgKmNwOyBjcCsrKQoJIGlmICgqY3AgPT0gVkdfQ0xPX1NFUCkKCSAgICB2Z19hcmdjMCsrOwoKICAgICAgdmdfYXJndjAgPSBtYWxsb2Moc2l6ZW9mKGNoYXIgKiopICogKHZnX2FyZ2MwICsgMSkpOwogICAgICB2Z19hc3NlcnQodmdfYXJndjApOwoKICAgICAgY3BwID0gdmdfYXJndjA7CgogICAgICAqY3BwKysgPSAidmFsZ3JpbmQiOwkvKiBub21pbmFsIGFyZ3ZbMF0gKi8KICAgICAgKmNwcCsrID0gZW52X2NsbzsKCiAgICAgIC8vIFJlcGxhY2UgdGhlIFZHX0NMT19TRVAgYXJncyBzZXBhcmF0b3Igd2l0aCAnXDAnCiAgICAgIGZvciAoY3AgPSBlbnZfY2xvOyAqY3A7IGNwKyspIHsKCSBpZiAoKmNwID09IFZHX0NMT19TRVApIHsKCSAgICAqY3ArKyA9ICdcMCc7CS8qIGNob3AgaXQgdXAgaW4gcGxhY2UgKi8KCSAgICAqY3BwKysgPSBjcDsKCSB9CiAgICAgIH0KICAgICAgKmNwcCA9IE5VTEw7CiAgICAgIGNsX2FyZ3YgPSBhcmd2OwoKICAgfSBlbHNlIHsKICAgICAgLyogQ291bnQgdGhlIGFyZ3VtZW50cyBvbiB0aGUgY29tbWFuZCBsaW5lLiAqLwogICAgICB2Z19hcmd2MCA9IGFyZ3Y7CgogICAgICBmb3IgKHZnX2FyZ2MwID0gMTsgdmdfYXJnYzAgPCBhcmdjOyB2Z19hcmdjMCsrKSB7CgkgaWYgKGFyZ3ZbdmdfYXJnYzBdWzBdICE9ICctJykgLyogZXhlIG5hbWUgKi8KCSAgICBicmVhazsKCSBpZiAoVkdfU1RSRVEoYXJndlt2Z19hcmdjMF0sICItLSIpKSB7IC8qIGR1bW15IGFyZyAqLwoJICAgIHZnX2FyZ2MwKys7CgkgICAgYnJlYWs7CgkgfQogICAgICB9CiAgICAgIGNsX2FyZ3YgPSAmYXJndlt2Z19hcmdjMF07CgogICAgICAvKiBHZXQgZXh0cmEgYXJncyBmcm9tIFZBTEdSSU5EX09QVFMgYW5kIC52YWxncmluZHJjIGZpbGVzLgogICAgICAgICBOb3RlIHdlIGRvbid0IGRvIHRoaXMgaWYgZ2V0dGluZyBhcmdzIGZyb20gVkFMR1JJTkRDTE8sIGFzIAogICAgICAgICB0aG9zZSBleHRyYSBhcmdzIHdpbGwgYWxyZWFkeSBiZSBwcmVzZW50IGluIFZBTEdSSU5EQ0xPLiAqLwogICAgICBhdWdtZW50X2NvbW1hbmRfbGluZSgmdmdfYXJnYzAsICZ2Z19hcmd2MCk7CiAgIH0KCiAgIGlmICgwKSB7CiAgICAgIEludCBpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgdmdfYXJnYzA7IGkrKykKICAgICAgICAgcHJpbnRmKCJ2Z19hcmd2MFslZF09XCIlc1wiXG4iLCBpLCB2Z19hcmd2MFtpXSk7CiAgIH0KCiAgICp2Z19hcmdjX291dCA9ICAgICAgICAgdmdfYXJnYzA7CiAgICp2Z19hcmd2X291dCA9IChDaGFyKiopdmdfYXJndjA7CiAgICpjbF9hcmd2X291dCA9ICAgICAgICAgY2xfYXJndjsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKj09PSBFbnZpcm9ubWVudCBhbmQgc3RhY2sgc2V0dXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09Ki8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKiBTY2FuIGEgY29sb24tc2VwYXJhdGVkIGxpc3QsIGFuZCBjYWxsIGEgZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50LgogICBUaGUgc3RyaW5nIG11c3QgYmUgbXV0YWJsZSwgYmVjYXVzZSB3ZSBpbnNlcnQgYSB0ZW1wb3JhcnkgJ1wwJywgYnV0CiAgIHRoZSBzdHJpbmcgd2lsbCBlbmQgdXAgdW5tb2RpZmllZC4gICgqZnVuYykgc2hvdWxkIHJldHVybiBUcnVlIGlmIGl0CiAgIGRvZXNuJ3QgbmVlZCB0byBzZWUgYW55IG1vcmUuCgogICBUaGlzIHJvdXRpbmUgd2lsbCByZXR1cm4gVHJ1ZSBpZiAoKmZ1bmMpIHJldHVybnMgVHJ1ZSBhbmQgRmFsc2UgaWYKICAgaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBsaXN0IHdpdGhvdXQgdGhhdCBoYXBwZW5pbmcuCiovCnN0YXRpYyBCb29sIHNjYW5fY29sc2VwKGNoYXIgKmNvbHNlcCwgQm9vbCAoKmZ1bmMpKGNvbnN0IGNoYXIgKikpCnsKICAgY2hhciAqY3AsICplbnRyeTsKICAgaW50IGVuZDsKCiAgIGlmIChjb2xzZXAgPT0gTlVMTCB8fAogICAgICAgKmNvbHNlcCA9PSAnXDAnKQogICAgICByZXR1cm4gRmFsc2U7CgogICBlbnRyeSA9IGNwID0gY29sc2VwOwoKICAgZG8gewogICAgICBlbmQgPSAoKmNwID09ICdcMCcpOwoKICAgICAgaWYgKCpjcCA9PSAnOicgfHwgKmNwID09ICdcMCcpIHsKCSBjaGFyIHNhdmUgPSAqY3A7CgoJICpjcCA9ICdcMCc7CgkgaWYgKCgqZnVuYykoZW50cnkpKSB7CiAgICAgICAgICAgICpjcCA9IHNhdmU7CgkgICAgcmV0dXJuIFRydWU7CiAgICAgICAgIH0KCSAqY3AgPSBzYXZlOwoJIGVudHJ5ID0gY3ArMTsKICAgICAgfQogICAgICBjcCsrOwogICB9IHdoaWxlKCFlbmQpOwoKICAgcmV0dXJuIEZhbHNlOwp9CgpzdGF0aWMgQm9vbCBjb250YWlucyhjb25zdCBjaGFyICpwKSB7CiAgIGlmIChWR19TVFJFUShwLCBWR18obGliZGlyKSkpIHsKICAgICAgcmV0dXJuIFRydWU7CiAgIH0KICAgcmV0dXJuIEZhbHNlOwp9CgovKiBQcmVwYXJlIHRoZSBjbGllbnQncyBlbnZpcm9ubWVudC4gIFRoaXMgaXMgYmFzaWNhbGx5IGEgY29weSBvZiBvdXIKICAgZW52aXJvbm1lbnQsIGV4Y2VwdDoKICAgMS4gTERfTElCUkFSWV9QQVRIPSRWQUxHUklORExJQjokTERfTElCUkFSWV9QQVRICiAgIDIuIExEX1BSRUxPQUQ9JFZBTEdSSU5ETElCL3ZnX2luamVjdC5zbzooJFZBTEdSSU5ETElCL3ZncHJlbG9hZF9UT09MLnNvOik/JExEX1BSRUxPQUQKCiAgIElmIGFueSBvZiB0aGVzZSBpcyBtaXNzaW5nLCB0aGVuIGl0IGlzIGFkZGVkLgoKICAgWXVtbXkuICBTdHJpbmcgaGFja2luZyBpbiBDLgoKICAgSWYgdGhpcyBuZWVkcyB0byBoYW5kbGUgYW55IG1vcmUgdmFyaWFibGVzIGl0IHNob3VsZCBiZSBoYWNrZWQKICAgaW50byBzb21ldGhpbmcgdGFibGUgZHJpdmVuLgogKi8Kc3RhdGljIGNoYXIgKipmaXhfZW52aXJvbm1lbnQoY2hhciAqKm9yaWdlbnYsIGNvbnN0IGNoYXIgKnByZWxvYWQpCnsKICAgc3RhdGljIGNvbnN0IGNoYXIgaW5qZWN0X3NvW10gICAgICAgICAgPSAidmdfaW5qZWN0LnNvIjsKICAgc3RhdGljIGNvbnN0IGNoYXIgbGRfbGlicmFyeV9wYXRoW10gICAgPSAiTERfTElCUkFSWV9QQVRIPSI7CiAgIHN0YXRpYyBjb25zdCBjaGFyIGxkX3ByZWxvYWRbXSAgICAgICAgID0gIkxEX1BSRUxPQUQ9IjsKICAgc3RhdGljIGNvbnN0IGNoYXIgdmFsZ3JpbmRfY2xvW10gICAgICAgPSBWQUxHUklORENMTyAiPSI7CiAgIHN0YXRpYyBjb25zdCBpbnQgIGxkX2xpYnJhcnlfcGF0aF9sZW4gID0gc2l6ZW9mKGxkX2xpYnJhcnlfcGF0aCktMTsKICAgc3RhdGljIGNvbnN0IGludCAgbGRfcHJlbG9hZF9sZW4gICAgICAgPSBzaXplb2YobGRfcHJlbG9hZCktMTsKICAgc3RhdGljIGNvbnN0IGludCAgdmFsZ3JpbmRfY2xvX2xlbiAgICAgPSBzaXplb2YodmFsZ3JpbmRfY2xvKS0xOwogICBpbnQgbGRfcHJlbG9hZF9kb25lICAgICAgID0gMDsKICAgaW50IGxkX2xpYnJhcnlfcGF0aF9kb25lICA9IDA7CiAgIGNoYXIgKmluamVjdF9wYXRoOwogICBpbnQgICBpbmplY3RfcGF0aF9sZW47CiAgIGludCB2Z2xpYmxlbiA9IHN0cmxlbihWR18obGliZGlyKSk7CiAgIGNoYXIgKipjcHA7CiAgIGNoYXIgKipyZXQ7CiAgIGludCBlbnZjOwogICBjb25zdCBpbnQgcHJlbG9hZGxlbiA9IChwcmVsb2FkID09IE5VTEwpID8gMCA6IHN0cmxlbihwcmVsb2FkKTsKCiAgIC8qIEZpbmQgdGhlIHZnX2luamVjdC5zbzsgYWxzbyBtYWtlIHJvb20gZm9yIHRoZSB0b29sIHByZWxvYWQKICAgICAgbGlicmFyeSAqLwogICBpbmplY3RfcGF0aF9sZW4gPSBzaXplb2YoaW5qZWN0X3NvKSArIHZnbGlibGVuICsgcHJlbG9hZGxlbiArIDE2OwogICBpbmplY3RfcGF0aCA9IG1hbGxvYyhpbmplY3RfcGF0aF9sZW4pOwogICB2Z19hc3NlcnQoaW5qZWN0X3BhdGgpOwoKICAgaWYgKHByZWxvYWQpCiAgICAgIHNucHJpbnRmKGluamVjdF9wYXRoLCBpbmplY3RfcGF0aF9sZW4sICIlcy8lczolcyIsIAoJICAgICAgIFZHXyhsaWJkaXIpLCBpbmplY3Rfc28sIHByZWxvYWQpOwogICBlbHNlCiAgICAgIHNucHJpbnRmKGluamVjdF9wYXRoLCBpbmplY3RfcGF0aF9sZW4sICIlcy8lcyIsIAoJICAgICAgIFZHXyhsaWJkaXIpLCBpbmplY3Rfc28pOwogICAKICAgLyogQ291bnQgdGhlIG9yaWdpbmFsIHNpemUgb2YgdGhlIGVudiAqLwogICBlbnZjID0gMDsJCQkvKiB0cmFpbGluZyBOVUxMICovCiAgIGZvciAoY3BwID0gb3JpZ2VudjsgY3BwICYmICpjcHA7IGNwcCsrKQogICAgICBlbnZjKys7CgogICAvKiBBbGxvY2F0ZSBhIG5ldyBzcGFjZSAqLwogICByZXQgPSBtYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiAoZW52YyszKzEpKTsgLyogMyBuZXcgZW50cmllcyArIE5VTEwgKi8KICAgdmdfYXNzZXJ0KHJldCk7CgogICAvKiBjb3B5IGl0IG92ZXIgKi8KICAgZm9yIChjcHAgPSByZXQ7ICpvcmlnZW52OyApCiAgICAgICpjcHArKyA9ICpvcmlnZW52Kys7CiAgICpjcHAgPSBOVUxMOwogICAKICAgdmdfYXNzZXJ0KGVudmMgPT0gKGNwcCAtIHJldCkpOwoKICAgLyogV2FsayBvdmVyIHRoZSBuZXcgZW52aXJvbm1lbnQsIG1hc2hpbmcgYXMgd2UgZ28gKi8KICAgZm9yIChjcHAgPSByZXQ7IGNwcCAmJiAqY3BwOyBjcHArKykgewogICAgICBpZiAobWVtY21wKCpjcHAsIGxkX2xpYnJhcnlfcGF0aCwgbGRfbGlicmFyeV9wYXRoX2xlbikgPT0gMCkgewoJIC8qIElmIHRoZSBMRF9MSUJSQVJZX1BBVEggYWxyZWFkeSBjb250YWlucyBsaWJkaXIsIHRoZW4gZG9uJ3QKCSAgICBib3RoZXIgYWRkaW5nIGl0IGFnYWluLCBldmVuIGlmIGl0IGlzbid0IHRoZSBmaXJzdCAoaXQKCSAgICBzZWVtcyB0aGF0IHRoZSBKYXZhIHJ1bnRpbWUgd2lsbCBrZWVwIHJlZXhlY2luZyBpdHNlbGYKCSAgICB1bmxlc3MgaXRzIHBhdGhzIGFyZSBhdCB0aGUgZnJvbnQgb2YgTERfTElCUkFSWV9QQVRIKSAqLwogICAgICAgICBpZiAoIXNjYW5fY29sc2VwKCpjcHAgKyBsZF9saWJyYXJ5X3BhdGhfbGVuLCBjb250YWlucykpIHsKCSAgICBpbnQgbGVuID0gc3RybGVuKCpjcHApICsgdmdsaWJsZW4qMiArIDE2OwoJICAgIGNoYXIgKmNwID0gbWFsbG9jKGxlbik7CiAgICAgICAgICAgIHZnX2Fzc2VydChjcCk7CgoJICAgIHNucHJpbnRmKGNwLCBsZW4sICIlcyVzOiVzIiwKCQkgICAgIGxkX2xpYnJhcnlfcGF0aCwgVkdfKGxpYmRpciksCgkJICAgICAoKmNwcCkrbGRfbGlicmFyeV9wYXRoX2xlbik7CgoJICAgICpjcHAgPSBjcDsKCSB9CgoJIGxkX2xpYnJhcnlfcGF0aF9kb25lID0gMTsKICAgICAgfSBlbHNlIGlmIChtZW1jbXAoKmNwcCwgbGRfcHJlbG9hZCwgbGRfcHJlbG9hZF9sZW4pID09IDApIHsKCSBpbnQgbGVuID0gc3RybGVuKCpjcHApICsgaW5qZWN0X3BhdGhfbGVuOwoJIGNoYXIgKmNwID0gbWFsbG9jKGxlbik7CiAgICAgICAgIHZnX2Fzc2VydChjcCk7CgoJIHNucHJpbnRmKGNwLCBsZW4sICIlcyVzOiVzIiwKCQkgIGxkX3ByZWxvYWQsIGluamVjdF9wYXRoLCAoKmNwcCkrbGRfcHJlbG9hZF9sZW4pOwoKCSAqY3BwID0gY3A7CgkgCgkgbGRfcHJlbG9hZF9kb25lID0gMTsKICAgICAgfSBlbHNlIGlmIChtZW1jbXAoKmNwcCwgdmFsZ3JpbmRfY2xvLCB2YWxncmluZF9jbG9fbGVuKSA9PSAwKSB7CgkgKmNwcCA9ICIiOwogICAgICB9CiAgIH0KCiAgIC8qIEFkZCB0aGUgbWlzc2luZyBiaXRzICovCgogICBpZiAoIWxkX2xpYnJhcnlfcGF0aF9kb25lKSB7CiAgICAgIGludCBsZW4gPSBsZF9saWJyYXJ5X3BhdGhfbGVuICsgdmdsaWJsZW4qMiArIDE2OwogICAgICBjaGFyICpjcCA9IG1hbGxvYyhsZW4pOwogICAgICB2Z19hc3NlcnQoY3ApOwoKICAgICAgc25wcmludGYoY3AsIGxlbiwgIiVzJXMiLCBsZF9saWJyYXJ5X3BhdGgsIFZHXyhsaWJkaXIpKTsKCiAgICAgIHJldFtlbnZjKytdID0gY3A7CiAgIH0KCiAgIGlmICghbGRfcHJlbG9hZF9kb25lKSB7CiAgICAgIGludCBsZW4gPSBsZF9wcmVsb2FkX2xlbiArIGluamVjdF9wYXRoX2xlbjsKICAgICAgY2hhciAqY3AgPSBtYWxsb2MobGVuKTsKICAgICAgdmdfYXNzZXJ0KGNwKTsKICAgICAgCiAgICAgIHNucHJpbnRmKGNwLCBsZW4sICIlcyVzIiwKCSAgICAgICBsZF9wcmVsb2FkLCBpbmplY3RfcGF0aCk7CiAgICAgIAogICAgICByZXRbZW52YysrXSA9IGNwOwogICB9CgogICByZXRbZW52Y10gPSBOVUxMOwoKICAgcmV0dXJuIHJldDsKfQoKZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwkJLyogb3VyIGVudmlyb25tZW50ICovCi8vI2luY2x1ZGUgPGVycm9yLmg+CgovKiBBZGQgYSBzdHJpbmcgb250byB0aGUgc3RyaW5nIHRhYmxlLCBhbmQgcmV0dXJuIGl0cyBhZGRyZXNzICovCnN0YXRpYyBjaGFyICpjb3B5X3N0cihjaGFyICoqdGFiLCBjb25zdCBjaGFyICpzdHIpCnsKICAgY2hhciAqY3AgPSAqdGFiOwogICBjaGFyICpvcmlnID0gY3A7CgogICB3aGlsZSgqc3RyKQogICAgICAqY3ArKyA9ICpzdHIrKzsKICAgKmNwKysgPSAnXDAnOwoKICAgaWYgKDApCiAgICAgIHByaW50ZigiY29waWVkICVwIFwiJXNcIiBsZW4gJWRcbiIsIG9yaWcsIG9yaWcsIGNwLW9yaWcpOwoKICAgKnRhYiA9IGNwOwoKICAgcmV0dXJuIG9yaWc7Cn0KCi8qIAogICBUaGlzIHNldHMgdXAgdGhlIGNsaWVudCdzIGluaXRpYWwgc3RhY2ssIGNvbnRhaW5pbmcgdGhlIGFyZ3MsCiAgIGVudmlyb25tZW50IGFuZCBhdXggdmVjdG9yLgoKICAgVGhlIGZvcm1hdCBvZiB0aGUgc3RhY2sgaXM6CgogICBoaWdoZXIgYWRkcmVzcyArLS0tLS0tLS0tLS0tLS0tLS0rCgkJICB8IFRyYW1wb2xpbmUgY29kZSB8CgkJICArLS0tLS0tLS0tLS0tLS0tLS0rCiAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwKCQkgIDogc3RyaW5nIHRhYmxlICAgIDoKCQkgIHwgICAgICAgICAgICAgICAgIHwKCQkgICstLS0tLS0tLS0tLS0tLS0tLSsKCQkgIHwgQVRfTlVMTCAgICAgICAgIHwKCQkgIC0gICAgICAgICAgICAgICAgIC0KCQkgIHwgYXV4diAgICAgICAgICAgIHwKCQkgICstLS0tLS0tLS0tLS0tLS0tLSsKCQkgIHwgIE5VTEwgICAgICAgICAgIHwKCQkgIC0gICAgICAgICAgICAgICAgIC0KCQkgIHwgZW52cCAgICAgICAgICAgIHwKCQkgICstLS0tLS0tLS0tLS0tLS0tLSsKCQkgIHwgIE5VTEwgICAgICAgICAgIHwKCQkgIC0gICAgICAgICAgICAgICAgIC0KCQkgIHwgYXJndiAgICAgICAgICAgIHwKCQkgICstLS0tLS0tLS0tLS0tLS0tLSsKCQkgIHwgYXJnYyAgICAgICAgICAgIHwKICAgbG93ZXIgYWRkcmVzcyAgKy0tLS0tLS0tLS0tLS0tLS0tKyA8LSBlc3AKICAgICAgICAgICAgICAgICAgfCB1bmRlZmluZWQgICAgICAgfAoJCSAgOiAgICAgICAgICAgICAgICAgOgogKi8Kc3RhdGljIEFkZHIgc2V0dXBfY2xpZW50X3N0YWNrKHZvaWQqIGluaXRfc3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqb3JpZ19hcmd2LCBjaGFyICoqb3JpZ19lbnZwLCAKCQkJICAgICAgIGNvbnN0IHN0cnVjdCBleGVpbmZvICppbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludCoqIGNsaWVudF9hdXh2KQp7CiAgIHZvaWQqIHJlczsKICAgY2hhciAqKmNwcDsKICAgY2hhciAqc3RydGFiOwkJLyogc3RyaW5nIHRhYmxlICovCiAgIGNoYXIgKnN0cmluZ2Jhc2U7CiAgIGFkZHJfdCAqcHRyOwogICBzdHJ1Y3QgdW1lX2F1eHYgKmF1eHY7CiAgIGNvbnN0IHN0cnVjdCB1bWVfYXV4diAqb3JpZ19hdXh2OwogICBjb25zdCBzdHJ1Y3QgdW1lX2F1eHYgKmNhdXh2OwogICB1bnNpZ25lZCBzdHJpbmdzaXplOwkJLyogdG90YWwgc2l6ZSBvZiBzdHJpbmdzIGluIGJ5dGVzICovCiAgIHVuc2lnbmVkIGF1eHNpemU7CQkvKiB0b3RhbCBzaXplIG9mIGF1eHYgaW4gYnl0ZXMgKi8KICAgaW50IGFyZ2M7CQkJLyogdG90YWwgYXJnYyAqLwogICBpbnQgZW52YzsJCQkvKiB0b3RhbCBudW1iZXIgb2YgZW52IHZhcnMgKi8KICAgdW5zaWduZWQgc3RhY2tzaXplOwkJLyogdG90YWwgY2xpZW50IHN0YWNrIHNpemUgKi8KICAgYWRkcl90IGNsX2VzcDsJCS8qIGNsaWVudCBzdGFjayBiYXNlIChpbml0aWFsIGVzcCkgKi8KCiAgIC8qIHVzZSBvdXIgb3duIGF1eHYgYXMgYSBwcm90b3R5cGUgKi8KICAgb3JpZ19hdXh2ID0gZmluZF9hdXh2KGluaXRfc3ApOwoKICAgLyogPT09PT09PT09PT09PT09PT09PT0gY29tcHV0ZSBzaXplcyA9PT09PT09PT09PT09PT09PT09PSAqLwoKICAgLyogZmlyc3Qgb2YgYWxsLCB3b3JrIG91dCBob3cgYmlnIHRoZSBjbGllbnQgc3RhY2sgd2lsbCBiZSAqLwogICBzdHJpbmdzaXplID0gMDsKCiAgIC8qIHBhc3RlIG9uIHRoZSBleHRyYSBhcmdzIGlmIHRoZSBsb2FkZXIgbmVlZHMgdGhlbSAoaWUsIHRoZSAjISAKICAgICAgaW50ZXJwcmV0ZXIgYW5kIGl0cyBhcmd1bWVudCkgKi8KICAgYXJnYyA9IDA7CiAgIGlmIChpbmZvLT5pbnRlcnBfbmFtZSAhPSBOVUxMKSB7CiAgICAgIGFyZ2MrKzsKICAgICAgc3RyaW5nc2l6ZSArPSBzdHJsZW4oaW5mby0+aW50ZXJwX25hbWUpICsgMTsKICAgfQogICBpZiAoaW5mby0+aW50ZXJwX2FyZ3MgIT0gTlVMTCkgewogICAgICBhcmdjKys7CiAgICAgIHN0cmluZ3NpemUgKz0gc3RybGVuKGluZm8tPmludGVycF9hcmdzKSArIDE7CiAgIH0KCiAgIC8qIG5vdyBzY2FuIHRoZSBhcmdzIHdlJ3JlIGdpdmVuLi4uICovCiAgIGZvciAoY3BwID0gb3JpZ19hcmd2OyAqY3BwOyBjcHArKykgewogICAgICBhcmdjKys7CiAgICAgIHN0cmluZ3NpemUgKz0gc3RybGVuKCpjcHApICsgMTsKICAgfQogICAKICAgLyogLi4uYW5kIHRoZSBlbnZpcm9ubWVudCAqLwogICBlbnZjID0gMDsKICAgZm9yIChjcHAgPSBvcmlnX2VudnA7IGNwcCAmJiAqY3BwOyBjcHArKykgewogICAgICBlbnZjKys7CiAgICAgIHN0cmluZ3NpemUgKz0gc3RybGVuKCpjcHApICsgMTsKICAgfQoKICAgLyogbm93LCBob3cgYmlnIGlzIHRoZSBhdXh2PyAqLwogICBhdXhzaXplID0gc2l6ZW9mKCphdXh2KTsJLyogdGhlcmUncyBhbHdheXMgYXQgbGVhc3Qgb25lIGVudHJ5OiBBVF9OVUxMICovCiAgIGZvciAoY2F1eHYgPSBvcmlnX2F1eHY7IGNhdXh2LT5hX3R5cGUgIT0gQVRfTlVMTDsgY2F1eHYrKykgewogICAgICBpZiAoY2F1eHYtPmFfdHlwZSA9PSBBVF9QTEFURk9STSkKCSBzdHJpbmdzaXplICs9IHN0cmxlbihjYXV4di0+dS5hX3B0cikgKyAxOwogICAgICBhdXhzaXplICs9IHNpemVvZigqY2F1eHYpOwogICB9CgogICAvKiBPSywgbm93IHdlIGtub3cgaG93IGJpZyB0aGUgY2xpZW50IHN0YWNrIGlzICovCiAgIHN0YWNrc2l6ZSA9CiAgICAgIHNpemVvZihpbnQpICsJCQkvKiBhcmdjICovCiAgICAgIHNpemVvZihjaGFyICoqKSphcmdjICsJCS8qIGFyZ3YgKi8KICAgICAgc2l6ZW9mKGNoYXIgKiopICsJCQkvKiB0ZXJtaW5hbCBOVUxMICovCiAgICAgIHNpemVvZihjaGFyICoqKSplbnZjICsJCS8qIGVudnAgKi8KICAgICAgc2l6ZW9mKGNoYXIgKiopICsJCQkvKiB0ZXJtaW5hbCBOVUxMICovCiAgICAgIGF1eHNpemUgKwkJCQkvKiBhdXh2ICovCiAgICAgIFJPVU5EVVAoc3RyaW5nc2l6ZSwgc2l6ZW9mKGludCkpICsvKiBzdHJpbmdzIChhbGlnbmVkKSAqLwogICAgICBWS0lfQllURVNfUEVSX1BBR0U7CQkvKiBwYWdlIGZvciB0cmFtcG9saW5lIGNvZGUgKi8KCiAgIC8vIGRlY2lkZSB3aGVyZSBzdGFjayBnb2VzIQogICBWR18oY2xzdGtfZW5kKSA9IFZHXyhjbGllbnRfZW5kKTsKCiAgIFZHXyhjbGllbnRfdHJhbXBvbGluZV9jb2RlKSA9IFZHXyhjbHN0a19lbmQpIC0gVktJX0JZVEVTX1BFUl9QQUdFOwoKICAgLyogY2xfZXNwIGlzIHRoZSBjbGllbnQncyBzdGFjayBwb2ludGVyICovCiAgIGNsX2VzcCA9IFZHXyhjbHN0a19lbmQpIC0gc3RhY2tzaXplOwogICBjbF9lc3AgPSBST1VOREROKGNsX2VzcCwgMTYpOyAvKiBtYWtlIHN0YWNrIDE2IGJ5dGUgYWxpZ25lZCAqLwoKICAgLyogYmFzZSBvZiB0aGUgc3RyaW5nIHRhYmxlIChhbGlnbmVkKSAqLwogICBzdHJpbmdiYXNlID0gc3RydGFiID0gKGNoYXIgKikoVkdfKGNsaWVudF90cmFtcG9saW5lX2NvZGUpIC0gUk9VTkRVUChzdHJpbmdzaXplLCBzaXplb2YoaW50KSkpOwoKICAgVkdfKGNsc3RrX2Jhc2UpID0gUEdST1VOREROKGNsX2VzcCk7CgogICBpZiAoMCkKICAgICAgcHJpbnRmKCJzdHJpbmdzaXplPSVkIGF1eHNpemU9JWQgc3RhY2tzaXplPSVkXG4iCiAgICAgICAgICAgICAiY2xzdGtfYmFzZSAlcFxuIgogICAgICAgICAgICAgImNsc3RrX2VuZCAgJXBcbiIsCgkgICAgIHN0cmluZ3NpemUsIGF1eHNpemUsIHN0YWNrc2l6ZSwKICAgICAgICAgICAgICh2b2lkKilWR18oY2xzdGtfYmFzZSksICh2b2lkKilWR18oY2xzdGtfZW5kKSk7CgoKICAgLyogPT09PT09PT09PT09PT09PT09PT0gYWxsb2NhdGUgc3BhY2UgPT09PT09PT09PT09PT09PT09PT0gKi8KCiAgIC8qIGFsbG9jYXRlIGEgc3RhY2sgLSBtbWFwIGVub3VnaCBzcGFjZSBmb3IgdGhlIHN0YWNrICovCiAgIHJlcyA9IG1tYXAoKHZvaWQgKilQR1JPVU5ERE4oY2xfZXNwKSwgVkdfKGNsc3RrX2VuZCkgLSBQR1JPVU5ERE4oY2xfZXNwKSwKCSAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsIAoJICAgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTiB8IE1BUF9GSVhFRCwgLTEsIDApOwogICB2Z19hc3NlcnQoKHZvaWQqKS0xICE9IHJlcyk7IAoKICAgLyogPT09PT09PT09PT09PT09PT09PT0gY29weSBjbGllbnQgc3RhY2sgPT09PT09PT09PT09PT09PT09PT0gKi8KCiAgIHB0ciA9IChhZGRyX3QgKiljbF9lc3A7CgogICAvKiAtLS0gYXJnYyAtLS0gKi8KICAgKnB0cisrID0gYXJnYzsJCS8qIGNsaWVudCBhcmdjICovCgogICAvKiAtLS0gYXJndiAtLS0gKi8KICAgaWYgKGluZm8tPmludGVycF9uYW1lKSB7CiAgICAgICpwdHIrKyA9IChhZGRyX3QpY29weV9zdHIoJnN0cnRhYiwgaW5mby0+aW50ZXJwX25hbWUpOwogICAgICBmcmVlKGluZm8tPmludGVycF9uYW1lKTsKICAgfQogICBpZiAoaW5mby0+aW50ZXJwX2FyZ3MpIHsKICAgICAgKnB0cisrID0gKGFkZHJfdCljb3B5X3N0cigmc3RydGFiLCBpbmZvLT5pbnRlcnBfYXJncyk7CiAgICAgIGZyZWUoaW5mby0+aW50ZXJwX2FyZ3MpOwogICB9CiAgIGZvciAoY3BwID0gb3JpZ19hcmd2OyAqY3BwOyBwdHIrKywgY3BwKyspIHsKICAgICAgKnB0ciA9IChhZGRyX3QpY29weV9zdHIoJnN0cnRhYiwgKmNwcCk7CiAgIH0KICAgKnB0cisrID0gMDsKCiAgIC8qIC0tLSBlbnZwIC0tLSAqLwogICBWR18oY2xpZW50X2VudnApID0gKENoYXIgKiopcHRyOwogICBmb3IgKGNwcCA9IG9yaWdfZW52cDsgY3BwICYmICpjcHA7IHB0cisrLCBjcHArKykKICAgICAgKnB0ciA9IChhZGRyX3QpY29weV9zdHIoJnN0cnRhYiwgKmNwcCk7CiAgICpwdHIrKyA9IDA7CgogICAvKiAtLS0gYXV4diAtLS0gKi8KICAgYXV4diA9IChzdHJ1Y3QgdW1lX2F1eHYgKilwdHI7CiAgICpjbGllbnRfYXV4diA9IChVSW50ICopYXV4djsKCiAgIGZvciAoOyBvcmlnX2F1eHYtPmFfdHlwZSAhPSBBVF9OVUxMOyBhdXh2KyssIG9yaWdfYXV4disrKSB7CiAgICAgIC8qIGNvcHkgdGhlIGVudHJ5Li4uICovCiAgICAgICphdXh2ID0gKm9yaWdfYXV4djsKCiAgICAgIC8qIC4uLmFuZCBmaXggdXAgdGhlIGNvcHkgKi8KICAgICAgc3dpdGNoKGF1eHYtPmFfdHlwZSkgewogICAgICBjYXNlIEFUX1BIRFI6CgkgaWYgKGluZm8tPnBoZHIgPT0gMCkKCSAgICBhdXh2LT5hX3R5cGUgPSBBVF9JR05PUkU7CgkgZWxzZQoJICAgIGF1eHYtPnUuYV92YWwgPSBpbmZvLT5waGRyOwoJIGJyZWFrOwoKICAgICAgY2FzZSBBVF9QSE5VTToKCSBpZiAoaW5mby0+cGhkciA9PSAwKQoJICAgIGF1eHYtPmFfdHlwZSA9IEFUX0lHTk9SRTsKCSBlbHNlCgkgICAgYXV4di0+dS5hX3ZhbCA9IGluZm8tPnBobnVtOwoJIGJyZWFrOwoKICAgICAgY2FzZSBBVF9CQVNFOgoJIGlmIChpbmZvLT5pbnRlcnBfYmFzZSA9PSAwKQoJICAgIGF1eHYtPmFfdHlwZSA9IEFUX0lHTk9SRTsKCSBlbHNlCgkgICAgYXV4di0+dS5hX3ZhbCA9IGluZm8tPmludGVycF9iYXNlOwoJIGJyZWFrOwoKICAgICAgY2FzZSBBVF9QTEFURk9STToJCS8qIHBvaW50cyB0byBhIHBsYXRmb3JtIGRlc2NyaXB0aW9uIHN0cmluZyAqLwoJIGF1eHYtPnUuYV9wdHIgPSBjb3B5X3N0cigmc3RydGFiLCBvcmlnX2F1eHYtPnUuYV9wdHIpOwoJIGJyZWFrOwoKICAgICAgY2FzZSBBVF9FTlRSWToKCSBhdXh2LT51LmFfdmFsID0gaW5mby0+ZW50cnk7CgkgYnJlYWs7CgogICAgICBjYXNlIEFUX0lHTk9SRToKICAgICAgY2FzZSBBVF9FWEVDRkQ6CiAgICAgIGNhc2UgQVRfUEhFTlQ6CiAgICAgIGNhc2UgQVRfUEFHRVNaOgogICAgICBjYXNlIEFUX0ZMQUdTOgogICAgICBjYXNlIEFUX05PVEVMRjoKICAgICAgY2FzZSBBVF9VSUQ6CiAgICAgIGNhc2UgQVRfRVVJRDoKICAgICAgY2FzZSBBVF9HSUQ6CiAgICAgIGNhc2UgQVRfRUdJRDoKICAgICAgY2FzZSBBVF9DTEtUQ0s6CiAgICAgIGNhc2UgQVRfSFdDQVA6CiAgICAgIGNhc2UgQVRfRlBVQ1c6CiAgICAgIGNhc2UgQVRfRENBQ0hFQlNJWkU6CiAgICAgIGNhc2UgQVRfSUNBQ0hFQlNJWkU6CiAgICAgIGNhc2UgQVRfVUNBQ0hFQlNJWkU6CgkgLyogQWxsIHRoZXNlIGFyZSBwb2ludGVybGVzcywgc28gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZwoJICAgIGFib3V0IHRoZW0uICovCgkgYnJlYWs7CgogICAgICBjYXNlIEFUX1NFQ1VSRToKCSAvKiBJZiB0aGlzIGlzIDEsIHRoZW4gaXQgbWVhbnMgdGhhdCB0aGlzIHByb2dyYW0gaXMgcnVubmluZwoJICAgIHN1aWQsIGFuZCB0aGVyZWZvcmUgdGhlIGR5bmFtaWMgbGlua2VyIHNob3VsZCBiZSBjYXJlZnVsCgkgICAgYWJvdXQgTERfUFJFTE9BRCwgZXRjLiAgSG93ZXZlciwgc2luY2Ugc3RhZ2UxICh0aGUgdGhpbmcKCSAgICB0aGUga2VybmVsIGFjdHVhbGx5IGV4ZWN2ZSdzKSBzaG91bGQgbmV2ZXIgYmUgU1VJRCwgYW5kIHdlCgkgICAgbmVlZCBMRF9QUkVMT0FEL0xEX0xJQlJBUllfUEFUSCB0byB3b3JrIGZvciB0aGUgY2xpZW50LCB3ZQoJICAgIHNldCBBVF9TRUNVUkUgdG8gMC4gKi8KCSBhdXh2LT51LmFfdmFsID0gMDsKCSBicmVhazsKCiAgICAgIGNhc2UgQVRfU1lTSU5GTzoKCSAvKiBMZWF2ZSB0aGlzIHVubW9sZXN0ZWQgZm9yIG5vdywgYnV0IHdlJ2xsIHVwZGF0ZSBpdCBsYXRlcgoJICAgIHdoZW4gd2Ugc2V0IHVwIHRoZSBjbGllbnQgdHJhbXBvbGluZSBjb2RlIHBhZ2UgKi8KCSBicmVhazsKCiAgICAgIGNhc2UgQVRfU1lTSU5GT19FSERSOgoJIC8qIFRyYXNoIHRoaXMsIGJlY2F1c2Ugd2UgZG9uJ3QgcmVwcm9kdWNlIGl0ICovCgkgYXV4di0+YV90eXBlID0gQVRfSUdOT1JFOwoJIGJyZWFrOwoKICAgICAgZGVmYXVsdDoKCSAvKiBzdG9tcCBvdXQgYW55dGhpbmcgd2UgZG9uJ3Qga25vdyBhYm91dCAqLwoJIGlmICgwKQoJICAgIHByaW50Zigic3RvbXBpbmcgYXV4diBlbnRyeSAlZFxuIiwgYXV4di0+YV90eXBlKTsKCSBhdXh2LT5hX3R5cGUgPSBBVF9JR05PUkU7CgkgYnJlYWs7CgkgCiAgICAgIH0KICAgfQogICAqYXV4diA9ICpvcmlnX2F1eHY7CiAgIHZnX2Fzc2VydChhdXh2LT5hX3R5cGUgPT0gQVRfTlVMTCk7CgogICAvKiAtLS0gdHJhbXBvbGluZSBwYWdlIC0tLSAqLwogICBWR18obWVtY3B5KSggKHZvaWQgKilWR18oY2xpZW50X3RyYW1wb2xpbmVfY29kZSksCiAgICAgICAgICAgICAgICAmVkdfKHRyYW1wb2xpbmVfY29kZV9zdGFydCksIFZHXyh0cmFtcG9saW5lX2NvZGVfbGVuZ3RoKSApOwoKICAgdmdfYXNzZXJ0KChzdHJ0YWItc3RyaW5nYmFzZSkgPT0gc3RyaW5nc2l6ZSk7CgogICAvKiBXZSBrbm93IHRoZSBpbml0aWFsIEVTUCBpcyBwb2ludGluZyBhdCBhcmdjL2FyZ3YgKi8KICAgVkdfKGNsaWVudF9hcmdjKSA9ICooSW50KiljbF9lc3A7CiAgIFZHXyhjbGllbnRfYXJndikgPSAoQ2hhcioqKShjbF9lc3AgKyBzaXplb2YoSW50KSk7CgogICByZXR1cm4gY2xfZXNwOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyo9PT0gRmluZCBleGVjdXRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKc3RhdGljIGNvbnN0IGNoYXIqIGV4ZWN1dGFibGVfbmFtZTsKCnN0YXRpYyBCb29sIG1hdGNoX2V4ZWN1dGFibGUoY29uc3QgY2hhciAqZW50cnkpIHsKICAgY2hhciBidWZbc3RybGVuKGVudHJ5KSArIHN0cmxlbihleGVjdXRhYmxlX25hbWUpICsgMl07CgogICAvKiBlbXB0eSBQQVRIIGVsZW1lbnQgbWVhbnMgLiAqLwogICBpZiAoKmVudHJ5ID09ICdcMCcpCiAgICAgIGVudHJ5ID0gIi4iOwoKICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzLyVzIiwgZW50cnksIGV4ZWN1dGFibGVfbmFtZSk7CiAgIAogICBpZiAoYWNjZXNzKGJ1ZiwgUl9PS3xYX09LKSA9PSAwKSB7CiAgICAgIGV4ZWN1dGFibGVfbmFtZSA9IHN0cmR1cChidWYpOwogICAgICB2Z19hc3NlcnQoTlVMTCAhPSBleGVjdXRhYmxlX25hbWUpOwogICAgICByZXR1cm4gVHJ1ZTsKICAgfQogICByZXR1cm4gRmFsc2U7Cn0KCnN0YXRpYyBjb25zdCBjaGFyKiBmaW5kX2V4ZWN1dGFibGUoY29uc3QgY2hhciogZXhlYykKewogICB2Z19hc3NlcnQoTlVMTCAhPSBleGVjKTsKICAgZXhlY3V0YWJsZV9uYW1lID0gZXhlYzsKICAgaWYgKHN0cmNocihleGVjdXRhYmxlX25hbWUsICcvJykgPT0gTlVMTCkgewogICAgICAvKiBubyAnLycgLSB3ZSBuZWVkIHRvIHNlYXJjaCB0aGUgcGF0aCAqLwogICAgICBjaGFyICpwYXRoID0gZ2V0ZW52KCJQQVRIIik7CiAgICAgIHNjYW5fY29sc2VwKHBhdGgsIG1hdGNoX2V4ZWN1dGFibGUpOwogICB9CiAgIHJldHVybiBleGVjdXRhYmxlX25hbWU7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyo9PT0gTG9hZGluZyB0b29scyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKc3RhdGljIHZvaWQgbGlzdF90b29scyh2b2lkKQp7CiAgIERJUiAqZGlyID0gb3BlbmRpcihWR18obGliZGlyKSk7CiAgIHN0cnVjdCBkaXJlbnQgKmRlOwogICBpbnQgZmlyc3QgPSAxOwoKICAgaWYgKGRpciA9PSBOVUxMKSB7CiAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3Qgb3BlbiAlczogJXMgKGluc3RhbGxhdGlvbiBwcm9ibGVtPylcbiIsCiAgICAgICAgICAgICAgVkdfKGxpYmRpciksIHN0cmVycm9yKGVycm5vKSk7CiAgICAgIHJldHVybjsKICAgfQoKICAgd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgewogICAgICBpbnQgbGVuID0gc3RybGVuKGRlLT5kX25hbWUpOwoKICAgICAgLyogbG9vayBmb3Igdmdza2luX1RPT0wuc28gbmFtZXMgKi8KICAgICAgaWYgKGxlbiA+ICg3KzErMykgJiYgICAvKiAidmdza2luXyIgKyBhdCBsZWFzdCAxLWNoYXIgdG9vbG5hbWUgKyAiLnNvIiAqLwogICAgICAgICBzdHJuY21wKGRlLT5kX25hbWUsICJ2Z3NraW5fIiwgNykgPT0gMCAmJgogICAgICAgICBWR19TVFJFUShkZS0+ZF9uYW1lICsgbGVuIC0gMywgIi5zbyIpKSB7CiAgICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkF2YWlsYWJsZSB0b29sczpcbiIpOwogICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgIH0KICAgICAgICAgZGUtPmRfbmFtZVtsZW4tM10gPSAnXDAnOwogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlx0JXNcbiIsIGRlLT5kX25hbWUrNyk7CiAgICAgIH0KICAgfQoKICAgY2xvc2VkaXIoZGlyKTsKCiAgIGlmIChmaXJzdCkKICAgICAgZnByaW50ZihzdGRlcnIsICJObyB0b29scyBhdmFpbGFibGUgaW4gXCIlc1wiIChpbnN0YWxsYXRpb24gcHJvYmxlbT8pXG4iLAogICAgICAgICAgICAgVkdfKGxpYmRpcikpOwp9CgoKLyogRmluZCBhbmQgbG9hZCBhIHRvb2wsIGFuZCBjaGVjayBpdCBsb29rcyBvay4gIEFsc28gbG9va3MgdG8gc2VlIGlmIHRoZXJlJ3MgCiAqIGEgbWF0Y2hpbmcgdmdwcmVsb2FkXyouc28gZmlsZSwgYW5kIHJldHVybnMgaXRzIG5hbWUgaW4gKnByZWxvYWRwYXRoLiAqLwpzdGF0aWMgdm9pZCBsb2FkX3Rvb2woIGNvbnN0IGNoYXIgKnRvb2xuYW1lLCB2b2lkKiogaGFuZGxlX291dCwKICAgICAgICAgICAgICAgICAgICAgICBUb29sSW5mbyoqIHRvb2xpbmZvX291dCwgY2hhciAqKnByZWxvYWRwYXRoX291dCApCnsKICAgQm9vbCAgICAgIG9rOwogICBpbnQgICAgICAgbGVuID0gc3RybGVuKFZHXyhsaWJkaXIpKSArIHN0cmxlbih0b29sbmFtZSkqMiArIDE2OwogICBjaGFyICAgICAgYnVmW2xlbl07CiAgIHZvaWQqICAgICBoYW5kbGU7CiAgIFRvb2xJbmZvKiB0b29saW5mbzsKICAgY2hhciogICAgIHByZWxvYWRwYXRoID0gTlVMTDsKICAgSW50KiAgICAgIHZnX21hbGxvY19yZWR6b25lcDsKCiAgIC8vIFhYWDogYWxsb3dpbmcgZnVsbCBwYXRocyBmb3IgLS10b29sIG9wdGlvbiAtLSBkb2VzIGl0IG1ha2Ugc2Vuc2U/CiAgIC8vIERvZXNuJ3QgYWxsb3cgZm9yIHZncHJlbG9hZF88dG9vbD4uc28uCgogICBpZiAoc3RyY2hyKHRvb2xuYW1lLCAnLycpICE9IDApIHsKICAgICAgLyogdG9vbG5hbWUgY29udGFpbnMgJy8nLCBhbmQgc28gbXVzdCBiZSBhIHBhdGhuYW1lICovCiAgICAgIGhhbmRsZSA9IGRsb3Blbih0b29sbmFtZSwgUlRMRF9OT1cpOwogICB9IGVsc2UgewogICAgICAvKiBqdXN0IHRyeSBpbiB0aGUgbGliZGlyICovCiAgICAgIHNucHJpbnRmKGJ1ZiwgbGVuLCAiJXMvdmdza2luXyVzLnNvIiwgVkdfKGxpYmRpciksIHRvb2xuYW1lKTsKICAgICAgaGFuZGxlID0gZGxvcGVuKGJ1ZiwgUlRMRF9OT1cpOwoKICAgICAgaWYgKGhhbmRsZSAhPSBOVUxMKSB7Cgkgc25wcmludGYoYnVmLCBsZW4sICIlcy92Z3ByZWxvYWRfJXMuc28iLCBWR18obGliZGlyKSwgdG9vbG5hbWUpOwoJIGlmIChhY2Nlc3MoYnVmLCBSX09LKSA9PSAwKSB7CgkgICAgcHJlbG9hZHBhdGggPSBzdHJkdXAoYnVmKTsKICAgICAgICAgICAgdmdfYXNzZXJ0KE5VTEwgIT0gcHJlbG9hZHBhdGgpOwogICAgICAgICB9CiAgICAgIH0KICAgfQoKICAgb2sgPSAoTlVMTCAhPSBoYW5kbGUpOwogICBpZiAoIW9rKSB7CiAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3Qgb3BlbiB0b29sIFwiJXNcIjogJXNcbiIsIHRvb2xuYW1lLCBkbGVycm9yKCkpOwogICAgICBnb3RvIGJhZF9sb2FkOwogICB9CgogICB0b29saW5mbyA9IGRsc3ltKGhhbmRsZSwgInZnU2tpbl90b29sX2luZm8iKTsKICAgb2sgPSAoTlVMTCAhPSB0b29saW5mbyk7CiAgIGlmICghb2spIHsKICAgICAgZnByaW50ZihzdGRlcnIsICJUb29sIFwiJXNcIiBkb2Vzbid0IGRlZmluZSBTS18odG9vbF9pbmZvKSAtICIKICAgICAgICAgICAgICAgICAgICAgICJhZGQgVkdfREVURVJNSU5FX0lOVEVSRkFDRV9WRVJTSU9OP1xuIiwgdG9vbG5hbWUpOwogICAgICBnb3RvIGJhZF9sb2FkOwogICB9CgogICBvayA9ICh0b29saW5mby0+c2l6ZW9mX1Rvb2xJbmZvID09IHNpemVvZigqdG9vbGluZm8pICYmCiAgICAgdG9vbGluZm8tPmludGVyZmFjZV9tYWpvcl92ZXJzaW9uID09IFZHX0NPUkVfSU5URVJGQUNFX01BSk9SX1ZFUlNJT04gJiYKICAgICB0b29saW5mby0+c2tfcHJlX2Nsb19pbml0ICE9IE5VTEwpOwogICBpZiAoIW9rKSB7IAogICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOlxuIgogICAgICAgICAgICAgICIgIFRvb2wgYW5kIGNvcmUgaW50ZXJmYWNlIHZlcnNpb25zIGRvIG5vdCBtYXRjaC5cbiIKICAgICAgICAgICAgICAiICBJbnRlcmZhY2UgdmVyc2lvbiB1c2VkIGJ5IGNvcmUgaXM6ICVkLiVkIChzaXplICVkKVxuIgogICAgICAgICAgICAgICIgIEludGVyZmFjZSB2ZXJzaW9uIHVzZWQgYnkgdG9vbCBpczogJWQuJWQgKHNpemUgJWQpXG4iCiAgICAgICAgICAgICAgIiAgVGhlIG1ham9yIHZlcnNpb24gbnVtYmVycyBtdXN0IG1hdGNoLlxuIiwKICAgICAgICAgICAgICBWR19DT1JFX0lOVEVSRkFDRV9NQUpPUl9WRVJTSU9OLCAKICAgICAgICAgICAgICBWR19DT1JFX0lOVEVSRkFDRV9NSU5PUl9WRVJTSU9OLAogICAgICAgICAgICAgIHNpemVvZigqdG9vbGluZm8pLAogICAgICAgICAgICAgIHRvb2xpbmZvLT5pbnRlcmZhY2VfbWFqb3JfdmVyc2lvbiwKICAgICAgICAgICAgICB0b29saW5mby0+aW50ZXJmYWNlX21pbm9yX3ZlcnNpb24sIAogICAgICAgICAgICAgIHRvb2xpbmZvLT5zaXplb2ZfVG9vbEluZm8pOwogICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgWW91IG5lZWQgdG8gYXQgbGVhc3QgcmVjb21waWxlLCBhbmQgcG9zc2libHkgdXBkYXRlLFxuIik7CiAgICAgIGlmIChWR19DT1JFX0lOVEVSRkFDRV9NQUpPUl9WRVJTSU9OID4gdG9vbGluZm8tPmludGVyZmFjZV9tYWpvcl92ZXJzaW9uKQogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgeW91ciB0b29sIHRvIHdvcmsgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmFsZ3JpbmQuXG4iKTsKICAgICAgZWxzZQogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgeW91ciB2ZXJzaW9uIG9mIFZhbGdyaW5kIHRvIHdvcmsgd2l0aCB0aGlzIHRvb2wuXG4iKTsKICAgICAgZ290byBiYWRfbG9hZDsKICAgfQoKICAgLy8gU2V0IHJlZHpvbmUgc2l6ZSBmb3IgVidzIGFsbG9jYXRvcgogICB2Z19tYWxsb2NfcmVkem9uZXAgPSBkbHN5bShoYW5kbGUsIFNUUihWR18odmdfbWFsbG9jX3JlZHpvbmVfc3pCKSkpOwogICBpZiAoIE5VTEwgIT0gdmdfbWFsbG9jX3JlZHpvbmVwICkgewogICAgICBWR18odmdfbWFsbG9jX3JlZHpvbmVfc3pCKSA9ICp2Z19tYWxsb2NfcmVkem9uZXA7CiAgIH0KCiAgIHZnX2Fzc2VydChOVUxMICE9IGhhbmRsZSAmJiBOVUxMICE9IHRvb2xpbmZvKTsKICAgKmhhbmRsZV9vdXQgICAgICA9IGhhbmRsZTsKICAgKnRvb2xpbmZvX291dCAgICA9IHRvb2xpbmZvOwogICAqcHJlbG9hZHBhdGhfb3V0ID0gcHJlbG9hZHBhdGg7CiAgIHJldHVybjsKCgogYmFkX2xvYWQ6CiAgIGlmIChoYW5kbGUgIT0gTlVMTCkKICAgICAgZGxjbG9zZShoYW5kbGUpOwoKICAgZnByaW50ZihzdGRlcnIsICJ2YWxncmluZDogY291bGRuJ3QgbG9hZCB0b29sXG4iKTsKICAgbGlzdF90b29scygpOwogICBleGl0KDEyNyk7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyo9PT0gQ29tbWFuZCBsaW5lIGVycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKc3RhdGljIHZvaWQgYWJvcnRfbXNnICggdm9pZCApCnsKICAgVkdfKGNsb19sb2dfdG8pID0gVmdMb2dUb19GZDsKICAgVkdfKGNsb19sb2dfZmQpID0gMjsgLyogc3RkZXJyICovCn0KCnZvaWQgVkdfKGJhZF9vcHRpb24pICggQ2hhciogb3B0ICkKewogICBhYm9ydF9tc2coKTsKICAgVkdfKHByaW50ZikoInZhbGdyaW5kOiBCYWQgb3B0aW9uIGAlcyc7IGFib3J0aW5nLlxuIiwgb3B0KTsKICAgVkdfKHByaW50ZikoInZhbGdyaW5kOiBVc2UgLS1oZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIik7CiAgIFZHXyhleGl0KSgxKTsKfQoKc3RhdGljIHZvaWQgbWlzc2luZ190b29sX29wdGlvbiAoIHZvaWQgICkKewogICBhYm9ydF9tc2coKTsKICAgVkdfKHByaW50ZikoInZhbGdyaW5kOiBNaXNzaW5nIC0tdG9vbCBvcHRpb25cbiIpOwogICBsaXN0X3Rvb2xzKCk7CiAgIFZHXyhwcmludGYpKCJ2YWxncmluZDogVXNlIC0taGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIpOwogICBWR18oZXhpdCkoMSk7Cn0KCnN0YXRpYyB2b2lkIG1pc3NpbmdfcHJvZyAoIHZvaWQgICkKewogICBhYm9ydF9tc2coKTsKICAgVkdfKHByaW50ZikoInZhbGdyaW5kOiBubyBwcm9ncmFtIHNwZWNpZmllZFxuIik7CiAgIFZHXyhwcmludGYpKCJ2YWxncmluZDogVXNlIC0taGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIpOwogICBWR18oZXhpdCkoMSk7Cn0KCnN0YXRpYyB2b2lkIGNvbmZpZ19lcnJvciAoIENoYXIqIG1zZyApCnsKICAgYWJvcnRfbXNnKCk7CiAgIFZHXyhwcmludGYpKCJ2YWxncmluZDogU3RhcnR1cCBvciBjb25maWd1cmF0aW9uIGVycm9yOlxuICAgJXNcbiIsIG1zZyk7CiAgIFZHXyhwcmludGYpKCJ2YWxncmluZDogVW5hYmxlIHRvIHN0YXJ0IHVwIHByb3Blcmx5LiAgR2l2aW5nIHVwLlxuIik7CiAgIFZHXyhleGl0KSgxKTsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKj09PSBMb2FkaW5nIHRoZSBjbGllbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09Ki8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpzdGF0aWMgdm9pZCBsb2FkX2NsaWVudChjaGFyKiBjbF9hcmd2W10sIGNvbnN0IGNoYXIqIGV4ZWMsIEludCBuZWVkX2hlbHAsCiAgICAgICAgICAgICAgICAgLypvdXQqL3N0cnVjdCBleGVpbmZvKiBpbmZvLCAvKm91dCovQWRkciogY2xpZW50X2VpcCkKewogICAvLyBJZiB0aGV5IGRpZG4ndCBzcGVjaWZ5IGFuIGV4ZWN1dGFibGUgd2l0aCAtLWV4ZWMsIGFuZCBkaWRuJ3Qgc3BlY2lmeSAKICAgLy8gLS1oZWxwLCB0aGVuIHVzZSBjbGllbnQgYXJndlswXSAoc2VhcmNoaW5nICRQQVRIIGlmIG5lY2Vzc2FyeSkuCiAgIGlmIChOVUxMID09IGV4ZWMgJiYgIW5lZWRfaGVscCkgewogICAgICBpZiAoY2xfYXJndlswXSA9PSBOVUxMIHx8IAogICAgICAgICAgKCBOVUxMID09IChleGVjID0gZmluZF9leGVjdXRhYmxlKGNsX2FyZ3ZbMF0pKSApICkKICAgICAgewogICAgICAgICBtaXNzaW5nX3Byb2coKTsKICAgICAgfQogICB9CgogICBpbmZvLT5tYXBfYmFzZSA9IFZHXyhjbGllbnRfbWFwYmFzZSk7CiAgIGluZm8tPmV4ZV9iYXNlID0gVkdfKGNsaWVudF9iYXNlKTsKICAgaW5mby0+ZXhlX2VuZCAgPSBWR18oY2xpZW50X2VuZCk7CiAgIGluZm8tPmFyZ3YgICAgID0gY2xfYXJndjsKCiAgIGlmIChuZWVkX2hlbHApIHsKICAgICAgVkdfKGNsZXhlY2ZkKSA9IC0xOwogICAgICAvLyBTZXQgdGhlIG1pbmltYWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gJ2luZm8nIHRvIGNvbnRpbnVlLgogICAgICBpbmZvLT5pbnRlcnBfbmFtZSA9IE5VTEw7CiAgICAgIGluZm8tPmludGVycF9hcmdzID0gTlVMTDsKICAgfSBlbHNlIHsKICAgICAgSW50IHJldDsKICAgICAgVkdfKGNsZXhlY2ZkKSA9IFZHXyhvcGVuKShleGVjLCBWS0lfT19SRE9OTFksIFZLSV9TX0lSVVNSKTsKICAgICAgcmV0ID0gZG9fZXhlYyhleGVjLCBpbmZvKTsKICAgICAgaWYgKHJldCAhPSAwKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidmFsZ3JpbmQ6IGRvX2V4ZWMoJXMpIGZhaWxlZDogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBleGVjLCBzdHJlcnJvcihyZXQpKTsKICAgICAgICAgZXhpdCgxMjcpOwogICAgICB9CiAgIH0KCiAgIC8qIENvcHkgbmVjZXNzYXJ5IGJpdHMgb2YgJ2luZm8nIHRoYXQgd2VyZSBmaWxsZWQgaW4gKi8KICAgKmNsaWVudF9laXAgPSBpbmZvLT5pbml0X2VpcDsKICAgVkdfKGJya19iYXNlKSA9IFZHXyhicmtfbGltaXQpID0gaW5mby0+YnJrYmFzZTsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qPT09IEFkZHJlc3Mgc3BhY2UgdW5wYWRkaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0qLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnR5cGVkZWYgc3RydWN0IHsKICAgY2hhciogICAgICAgIGtpbGxwYWRfc3RhcnQ7CiAgIGNoYXIqICAgICAgICBraWxscGFkX2VuZDsKICAgc3RydWN0IHN0YXQqIGtpbGxwYWRfcGFkc3RhdDsKfSBraWxscGFkX2V4dHJhOwoKc3RhdGljIGludCBraWxscGFkKGNoYXIgKnNlZ3N0YXJ0LCBjaGFyICpzZWdlbmQsIGNvbnN0IGNoYXIgKnBlcm0sIG9mZl90IG9mZiwgCiAgICAgICAgICAgICAgICAgICBpbnQgbWFqLCBpbnQgbWluLCBpbnQgaW5vLCB2b2lkKiBleCkKewogICBraWxscGFkX2V4dHJhKiBleHRyYSA9IGV4OwogICB2b2lkICpiLCAqZTsKICAgaW50IHJlczsKCiAgIHZnX2Fzc2VydChOVUxMICE9IGV4dHJhLT5raWxscGFkX3BhZHN0YXQpOwoKICAgaWYgKGV4dHJhLT5raWxscGFkX3BhZHN0YXQtPnN0X2RldiAhPSBtYWtlZGV2KG1haiwgbWluKSB8fCAKICAgICAgIGV4dHJhLT5raWxscGFkX3BhZHN0YXQtPnN0X2lubyAhPSBpbm8pCiAgICAgIHJldHVybiAxOwogICAKICAgaWYgKHNlZ2VuZCA8PSBleHRyYS0+a2lsbHBhZF9zdGFydCB8fCBzZWdzdGFydCA+PSBleHRyYS0+a2lsbHBhZF9lbmQpCiAgICAgIHJldHVybiAxOwogICAKICAgaWYgKHNlZ3N0YXJ0IDw9IGV4dHJhLT5raWxscGFkX3N0YXJ0KQogICAgICBiID0gZXh0cmEtPmtpbGxwYWRfc3RhcnQ7CiAgIGVsc2UKICAgICAgYiA9IHNlZ3N0YXJ0OwogICAKICAgaWYgKHNlZ2VuZCA+PSBleHRyYS0+a2lsbHBhZF9lbmQpCiAgICAgIGUgPSBleHRyYS0+a2lsbHBhZF9lbmQ7CiAgIGVsc2UKICAgICAgZSA9IHNlZ2VuZDsKICAgCiAgIHJlcyA9IG11bm1hcChiLCAoY2hhciAqKWUtKGNoYXIgKiliKTsKICAgdmdfYXNzZXJ0KDAgPT0gcmVzKTsKICAgCiAgIHJldHVybiAxOwp9CgovLyBSZW1vdmUgcGFkZGluZyBvZiAncGFkZmlsZScgZnJvbSBhIHJhbmdlIG9mIGFkZHJlc3Mgc3BhY2UuCnZvaWQgYXNfdW5wYWQodm9pZCAqc3RhcnQsIHZvaWQgKmVuZCwgaW50IHBhZGZpbGUpCnsKICAgc3RhdGljIHN0cnVjdCBzdGF0IHBhZHN0YXQ7CiAgIGtpbGxwYWRfZXh0cmEgZXh0cmE7CiAgIGludCByZXM7CgogICB2Z19hc3NlcnQocGFkZmlsZSA+IDApOwogICAKICAgcmVzID0gZnN0YXQocGFkZmlsZSwgJnBhZHN0YXQpOwogICB2Z19hc3NlcnQoMCA9PSByZXMpOwogICBleHRyYS5raWxscGFkX3BhZHN0YXQgPSAmcGFkc3RhdDsKICAgZXh0cmEua2lsbHBhZF9zdGFydCAgID0gc3RhcnQ7CiAgIGV4dHJhLmtpbGxwYWRfZW5kICAgICA9IGVuZDsKICAgZm9yZWFjaF9tYXAoa2lsbHBhZCwgJmV4dHJhKTsKfQoKdm9pZCBhc19jbG9zZXBhZGZpbGUoaW50IHBhZGZpbGUpCnsKICAgaW50IHJlcyA9IGNsb3NlKHBhZGZpbGUpOwogICB2Z19hc3NlcnQoMCA9PSByZXMpOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qPT09IENvbW1hbmQtbGluZTogdmFyaWFibGVzLCBwcm9jZXNzaW5nLCBldGMgICAgICAgICAgICAgICAgICAgICA9PT0qLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qIERlZmluZSwgYW5kIHNldCBkZWZhdWx0cy4gKi8KQm9vbCAgIFZHXyhjbG9fZXJyb3JfbGltaXQpICAgID0gVHJ1ZTsKQm9vbCAgIFZHXyhjbG9fZGJfYXR0YWNoKSAgICAgID0gRmFsc2U7CkNoYXIqICBWR18oY2xvX2RiX2NvbW1hbmQpICAgICA9IFZHX0NMT19ERUZBVUxUX0RCQ09NTUFORDsKQm9vbCAgIFZHXyhjbG9fZ2VuX3N1cHByZXNzaW9ucykgPSBGYWxzZTsKSW50ICAgIFZHXyhjbG9fc2FuaXR5X2xldmVsKSAgID0gMTsKSW50ICAgIFZHXyhjbG9fdmVyYm9zaXR5KSAgICAgID0gMTsKQm9vbCAgIFZHXyhjbG9fZGVtYW5nbGUpICAgICAgID0gVHJ1ZTsKQm9vbCAgIFZHXyhjbG9fdHJhY2VfY2hpbGRyZW4pID0gRmFsc2U7CgovKiBTZWUgYmlnIGNvbW1lbnQgaW4gY29yZS5oIGZvciBtZWFuaW5nIG9mIHRoZXNlIHRocmVlLgogICBmZCBpcyBpbml0aWFsbHkgc3Rkb3V0LCBmb3IgLS1oZWxwLCBidXQgZ2V0cyBtb3ZlZCB0byBzdGRlcnIgYnkgZGVmYXVsdAogICBpbW1lZGlhdGVseSBhZnRlcndhcmRzLiAqLwpWZ0xvZ1RvIFZHXyhjbG9fbG9nX3RvKSAgICAgICAgPSBWZ0xvZ1RvX0ZkOwpJbnQgICAgIFZHXyhjbG9fbG9nX2ZkKSAgICAgICAgPSAxOwpDaGFyKiAgIFZHXyhjbG9fbG9nX25hbWUpICAgICAgPSBOVUxMOwoKQm9vbCAgIFZHXyhjbG9fdGltZV9zdGFtcCkgICAgID0gRmFsc2U7CgpJbnQgICAgVkdfKGNsb19pbnB1dF9mZCkgICAgICAgPSAwOyAvKiBzdGRpbiAqLwpJbnQgICAgVkdfKGNsb19uX3N1cHByZXNzaW9ucykgPSAwOwpDaGFyKiAgVkdfKGNsb19zdXBwcmVzc2lvbnMpW1ZHX0NMT19NQVhfU0ZJTEVTXTsKQm9vbCAgIFZHXyhjbG9fcHJvZmlsZSkgICAgICAgID0gRmFsc2U7CkJvb2wgICBWR18oY2xvX3NpbmdsZV9zdGVwKSAgICA9IEZhbHNlOwpCb29sICAgVkdfKGNsb19vcHRpbWlzZSkgICAgICAgPSBUcnVlOwpVQ2hhciAgVkdfKGNsb190cmFjZV9jb2RlZ2VuKSAgPSAwOyAvLyAwMDAwMDAwMGIKQm9vbCAgIFZHXyhjbG9fdHJhY2Vfc3lzY2FsbHMpID0gRmFsc2U7CkJvb2wgICBWR18oY2xvX3RyYWNlX3NpZ25hbHMpICA9IEZhbHNlOwpCb29sICAgVkdfKGNsb190cmFjZV9zeW10YWIpICAgPSBGYWxzZTsKQm9vbCAgIFZHXyhjbG9fdHJhY2Vfc2NoZWQpICAgID0gRmFsc2U7CkludCAgICBWR18oY2xvX3RyYWNlX3B0aHJlYWRfbGV2ZWwpID0gMDsKSW50ICAgIFZHXyhjbG9fZHVtcF9lcnJvcikgICAgID0gMDsKSW50ICAgIFZHXyhjbG9fYmFja3RyYWNlX3NpemUpID0gNDsKQ2hhciogIFZHXyhjbG9fd2VpcmRfaGFja3MpICAgID0gTlVMTDsKQm9vbCAgIFZHXyhjbG9fcnVuX2xpYmNfZnJlZXJlcykgPSBUcnVlOwpCb29sICAgVkdfKGNsb190cmFja19mZHMpICAgICAgPSBGYWxzZTsKQm9vbCAgIFZHXyhjbG9fY2hhaW5fYmIpICAgICAgID0gVHJ1ZTsKQm9vbCAgIFZHXyhjbG9fc2hvd19iZWxvd19tYWluKSA9IEZhbHNlOwpCb29sICAgVkdfKGNsb19wb2ludGVyY2hlY2spICAgPSBUcnVlOwpCb29sICAgVkdfKGNsb19icmFuY2hwcmVkKSAgICAgPSBGYWxzZTsKCnN0YXRpYyBCb29sICAgVkdfKGNsb193YWl0X2Zvcl9nZGIpICAgPSBGYWxzZTsKCi8qIElmIHdlJ3JlIGRvaW5nIHNpZ25hbCByb3V0aW5nLCBwb2xsIGZvciBzaWduYWxzIGV2ZXJ5IDUwbVMgYnkKICAgZGVmYXVsdC4gKi8KSW50ICAgIFZHXyhjbG9fc2lnbmFsX3BvbGx0aW1lKSA9IDUwOwoKLyogVGhlc2UgZmxhZ3MgcmVkdWNlIHRocmVhZCB3YWtldXAgbGF0ZW5jeSBvbiBzeXNjYWxsIGNvbXBsZXRpb24gYW5kCiAgIHNpZ25hbCBkZWxpdmVyeSwgcmVzcGVjdGl2ZWx5LiAgVGhlIGRvd25zaWRlIGlzIHBvc3NpYmxlIHVuZmFpcm5lc3MuICovCkJvb2wgICBWR18oY2xvX2xvd2xhdF9zeXNjYWxscykgPSBGYWxzZTsgLyogbG93LWxhdGVuY3kgc3lzY2FsbHMgKi8KQm9vbCAgIFZHXyhjbG9fbG93bGF0X3NpZ25hbHMpICA9IEZhbHNlOyAvKiBsb3ctbGF0ZW5jeSBzaWduYWxzICovCgoKdm9pZCB1c2FnZSAoIEJvb2wgZGVidWdfaGVscCApCnsKICAgQ2hhciogdXNhZ2UxID0gCiJ1c2FnZTogdmFsZ3JpbmQgLS10b29sPTx0b29sbmFtZT4gW29wdGlvbnNdIHByb2ctYW5kLWFyZ3NcbiIKIlxuIgoiICBjb21tb24gdXNlciBvcHRpb25zIGZvciBhbGwgVmFsZ3JpbmQgdG9vbHMsIHdpdGggZGVmYXVsdHMgaW4gWyBdOlxuIgoiICAgIC0tdG9vbD08bmFtZT4gICAgICAgICAgICAgdXNlIHRoZSBWYWxncmluZCB0b29sIG5hbWVkIDxuYW1lPlxuIgoiICAgIC1oIC0taGVscCAgICAgICAgICAgICAgICAgc2hvdyB0aGlzIG1lc3NhZ2VcbiIKIiAgICAtLWhlbHAtZGVidWcgICAgICAgICAgICAgIHNob3cgdGhpcyBtZXNzYWdlLCBwbHVzIGRlYnVnZ2luZyBvcHRpb25zXG4iCiIgICAgLS12ZXJzaW9uICAgICAgICAgICAgICAgICBzaG93IHZlcnNpb25cbiIKIiAgICAtcSAtLXF1aWV0ICAgICAgICAgICAgICAgIHJ1biBzaWxlbnRseTsgb25seSBwcmludCBlcnJvciBtc2dzXG4iCiIgICAgLXYgLS12ZXJib3NlICAgICAgICAgICAgICBiZSBtb3JlIHZlcmJvc2UsIGluY2wgY291bnRzIG9mIGVycm9yc1xuIgoiICAgIC0tdHJhY2UtY2hpbGRyZW49bm98eWVzICAgVmFsZ3JpbmQtaXNlIGNoaWxkIHByb2Nlc3Nlcz8gW25vXVxuIgoiICAgIC0tdHJhY2stZmRzPW5vfHllcyAgICAgICAgdHJhY2sgb3BlbiBmaWxlIGRlc2NyaXB0b3JzPyBbbm9dXG4iCiIgICAgLS10aW1lLXN0YW1wPW5vfHllcyAgICAgICBhZGQgdGltZXN0YW1wcyB0byBsb2cgbWVzc2FnZXM/IFtub11cbiIKIlxuIgoiICB1bmNvbW1vbiB1c2VyIG9wdGlvbnMgZm9yIGFsbCBWYWxncmluZCB0b29sczpcbiIKIiAgICAtLXJ1bi1saWJjLWZyZWVyZXM9bm98eWVzIGZyZWUgdXAgZ2xpYmMgbWVtb3J5IGF0IGV4aXQ/IFt5ZXNdXG4iCiIgICAgLS13ZWlyZC1oYWNrcz1oYWNrMSxoYWNrMiwuLi4gIHJlY29nbmlzZWQgaGFja3M6IGxheC1pb2N0bHMgW25vbmVdXG4iCiIgICAgLS1zaWduYWwtcG9sbHRpbWU9PHRpbWU+ICBzaWduYWwgcG9sbCBwZXJpb2QgKG1TKSBmb3Igb2xkZXIga2VybmVscyBbNTBdXG4iCiIgICAgLS1sb3dsYXQtc2lnbmFscz1ub3x5ZXMgICBpbXByb3ZlIHRocmVhZCBzaWduYWwgd2FrZS11cCBsYXRlbmN5IFtub11cbiIKIiAgICAtLWxvd2xhdC1zeXNjYWxscz1ub3x5ZXMgIGltcHJvdmUgdGhyZWFkIHN5c2NhbGwgd2FrZS11cCBsYXRlbmN5IFtub11cbiIKIiAgICAtLXBvaW50ZXJjaGVjaz1ub3x5ZXMgICAgIGVuZm9yY2UgY2xpZW50IGFkZHJlc3Mgc3BhY2UgbGltaXRzIFt5ZXNdXG4iCiJcbiIKIiAgdXNlciBvcHRpb25zIGZvciBWYWxncmluZCB0b29scyB0aGF0IHJlcG9ydCBlcnJvcnM6XG4iCiIgICAgLS1sb2ctZmQ9PG51bWJlcj4gICAgICAgICBsb2cgbWVzc2FnZXMgdG8gZmlsZSBkZXNjcmlwdG9yIFsyPXN0ZGVycl1cbiIKIiAgICAtLWxvZy1maWxlPTxmaWxlPiAgICAgICAgIGxvZyBtZXNzYWdlcyB0byA8ZmlsZT4ucGlkPHBpZD5cbiIKIiAgICAtLWxvZy1zb2NrZXQ9aXBhZGRyOnBvcnQgIGxvZyBtZXNzYWdlcyB0byBzb2NrZXQgaXBhZGRyOnBvcnRcbiIKIiAgICAtLWRlbWFuZ2xlPW5vfHllcyAgICAgICAgIGF1dG9tYXRpY2FsbHkgZGVtYW5nbGUgQysrIG5hbWVzPyBbeWVzXVxuIgoiICAgIC0tbnVtLWNhbGxlcnM9PG51bWJlcj4gICAgc2hvdyA8bnVtPiBjYWxsZXJzIGluIHN0YWNrIHRyYWNlcyBbNF1cbiIKIiAgICAtLWVycm9yLWxpbWl0PW5vfHllcyAgICAgIHN0b3Agc2hvd2luZyBuZXcgZXJyb3JzIGlmIHRvbyBtYW55PyBbeWVzXVxuIgoiICAgIC0tc2hvdy1iZWxvdy1tYWluPW5vfHllcyAgY29udGludWUgc3RhY2sgdHJhY2VzIGJlbG93IG1haW4oKSBbbm9dXG4iCiIgICAgLS1zdXBwcmVzc2lvbnM9PGZpbGVuYW1lPiBzdXBwcmVzcyBlcnJvcnMgZGVzY3JpYmVkIGluIDxmaWxlbmFtZT5cbiIKIiAgICAtLWdlbi1zdXBwcmVzc2lvbnM9bm98eWVzIHByaW50IHN1cHByZXNzaW9ucyBmb3IgZXJyb3JzIGRldGVjdGVkIFtub11cbiIKIiAgICAtLWRiLWF0dGFjaD1ub3x5ZXMgICAgICAgIHN0YXJ0IGRlYnVnZ2VyIHdoZW4gZXJyb3JzIGRldGVjdGVkPyBbbm9dXG4iCiIgICAgLS1kYi1jb21tYW5kPTxjb21tYW5kPiAgICBjb21tYW5kIHRvIHN0YXJ0IGRlYnVnZ2VyIFtnZGIgLW53ICUlZiAlJXBdXG4iCiIgICAgLS1pbnB1dC1mZD08bnVtYmVyPiAgICAgICBmaWxlIGRlc2NyaXB0b3IgZm9yIGlucHV0IFswPXN0ZGluXVxuIgoiXG4iOwoKICAgQ2hhciogdXNhZ2UyID0gCiJcbiIKIiAgZGVidWdnaW5nIG9wdGlvbnMgZm9yIGFsbCBWYWxncmluZCB0b29sczpcbiIKIiAgICAtLXNhbml0eS1sZXZlbD08bnVtYmVyPiAgIGxldmVsIG9mIHNhbml0eSBjaGVja2luZyB0byBkbyBbMV1cbiIKIiAgICAtLXNpbmdsZS1zdGVwPW5vfHllcyAgICAgIHRyYW5zbGF0ZSBlYWNoIGluc3RyIHNlcGFyYXRlbHk/IFtub11cbiIKIiAgICAtLW9wdGltaXNlPW5vfHllcyAgICAgICAgIGltcHJvdmUgaW50ZXJtZWRpYXRlIGNvZGU/IFt5ZXNdXG4iCiIgICAgLS1wcm9maWxlPW5vfHllcyAgICAgICAgICBwcm9maWxlPyAodG9vbCBtdXN0IGJlIGJ1aWx0IGZvciBpdCkgW25vXVxuIgoiICAgIC0tY2hhaW4tYmI9bm98eWVzICAgICAgICAgZG8gYmFzaWMtYmxvY2sgY2hhaW5pbmc/IFt5ZXNdXG4iCiIgICAgLS1icmFuY2hwcmVkPXllc3xubyAgICAgICBnZW5lcmF0ZSBicmFuY2ggcHJlZGljdGlvbiBoaW50cyBbbm9dXG4iCiIgICAgLS10cmFjZS1jb2RlZ2VuPTxYWFhYWD4gICBzaG93IGdlbmVyYXRlZCBjb2RlPyAoWCA9IDB8MSkgWzAwMDAwXVxuIgoiICAgIC0tdHJhY2Utc3lzY2FsbHM9bm98eWVzICAgc2hvdyBhbGwgc3lzdGVtIGNhbGxzPyBbbm9dXG4iCiIgICAgLS10cmFjZS1zaWduYWxzPW5vfHllcyAgICBzaG93IHNpZ25hbCBoYW5kbGluZyBkZXRhaWxzPyBbbm9dXG4iCiIgICAgLS10cmFjZS1zeW10YWI9bm98eWVzICAgICBzaG93IHN5bWJvbCB0YWJsZSBkZXRhaWxzPyBbbm9dXG4iCiIgICAgLS10cmFjZS1zY2hlZD1ub3x5ZXMgICAgICBzaG93IHRocmVhZCBzY2hlZHVsZXIgZGV0YWlscz8gW25vXVxuIgoiICAgIC0tdHJhY2UtcHRocmVhZD1ub25lfHNvbWV8YWxsICBzaG93IHB0aHJlYWQgZXZlbnQgZGV0YWlscz8gW25vbmVdXG4iCiIgICAgLS13YWl0LWZvci1nZGI9eWVzfG5vICAgICBwYXVzZSBvbiBzdGFydHVwIHRvIHdhaXQgZm9yIGdkYiBhdHRhY2hcbiIKIlxuIgoiICBkZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgVmFsZ3JpbmQgdG9vbHMgdGhhdCByZXBvcnQgZXJyb3JzXG4iCiIgICAgLS1kdW1wLWVycm9yPTxudW1iZXI+ICAgICBzaG93IHRyYW5zbGF0aW9uIGZvciBiYXNpYyBibG9jayBhc3NvY2lhdGVkXG4iCiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIDxudW1iZXI+J3RoIGVycm9yIGNvbnRleHQgWzA9c2hvdyBub25lXVxuIgoiXG4iOwoKICAgQ2hhciogdXNhZ2UzID0KIlxuIgoiICBFeHRyYSBvcHRpb25zIHJlYWQgZnJvbSB+Ly52YWxncmluZHJjLCAkVkFMR1JJTkRfT1BUUywgLi8udmFsZ3JpbmRyY1xuIgoiXG4iCiIgIFZhbGdyaW5kIGlzIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEp1bGlhbiBTZXdhcmQgZXQgYWwuXG4iCiIgIGFuZCBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi5cbiIKIiAgQnVnIHJlcG9ydHMsIGZlZWRiYWNrLCBhZG1pcmF0aW9uLCBhYnVzZSwgZXRjLCB0bzogJXMuXG4iCiJcbiIKIiAgVG9vbHMgYXJlIGNvcHlyaWdodCBhbmQgbGljZW5zZWQgYnkgdGhlaXIgYXV0aG9ycy4gIFNlZSBlYWNoXG4iCiIgIHRvb2wncyBzdGFydC11cCBtZXNzYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIgoiXG4iOwoKICAgVkdfKHByaW50ZikodXNhZ2UxKTsKICAgaWYgKFZHXyhkZXRhaWxzKS5uYW1lKSB7CiAgICAgIFZHXyhwcmludGYpKCIgIHVzZXIgb3B0aW9ucyBmb3IgJXM6XG4iLCBWR18oZGV0YWlscykubmFtZSk7CiAgICAgIGlmIChWR18obmVlZHMpLmNvbW1hbmRfbGluZV9vcHRpb25zKQoJIFNLXyhwcmludF91c2FnZSkoKTsKICAgICAgZWxzZQoJIFZHXyhwcmludGYpKCIgICAgKG5vbmUpXG4iKTsKICAgfQogICBpZiAoZGVidWdfaGVscCkgewogICAgICBWR18ocHJpbnRmKSh1c2FnZTIpOwoKICAgICAgaWYgKFZHXyhkZXRhaWxzKS5uYW1lKSB7CiAgICAgICAgIFZHXyhwcmludGYpKCIgIGRlYnVnZ2luZyBvcHRpb25zIGZvciAlczpcbiIsIFZHXyhkZXRhaWxzKS5uYW1lKTsKICAgICAgCiAgICAgICAgIGlmIChWR18obmVlZHMpLmNvbW1hbmRfbGluZV9vcHRpb25zKQogICAgICAgICAgICBTS18ocHJpbnRfZGVidWdfdXNhZ2UpKCk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgVkdfKHByaW50ZikoIiAgICAobm9uZSlcbiIpOwogICAgICB9CiAgIH0KICAgVkdfKHByaW50ZikodXNhZ2UzLCBWR19CVUdTX1RPKTsKICAgVkdfKGV4aXQpKDApOwp9CgpzdGF0aWMgdm9pZCBwcmVfcHJvY2Vzc19jbWRfbGluZV9vcHRpb25zCiAgICAgICggSW50KiBuZWVkX2hlbHAsIGNvbnN0IGNoYXIqKiB0b29sLCBjb25zdCBjaGFyKiogZXhlYyApCnsKICAgVUludCBpOwoKICAgLyogcGFyc2UgdGhlIG9wdGlvbnMgd2UgaGF2ZSAob25seSB0aGUgb3B0aW9ucyB3ZSBjYXJlIGFib3V0IG5vdykgKi8KICAgZm9yIChpID0gMTsgaSA8IHZnX2FyZ2M7IGkrKykgewoKICAgICAgaWYgKHN0cmNtcCh2Z19hcmd2W2ldLCAiLS12ZXJzaW9uIikgPT0gMCkgewogICAgICAgICBwcmludGYoInZhbGdyaW5kLSIgVkVSU0lPTiAiXG4iKTsKICAgICAgICAgZXhpdCgwKTsKCiAgICAgIH0gZWxzZSBpZiAoVkdfQ0xPX1NUUkVRKHZnX2FyZ3ZbaV0sICItLWhlbHAiKSB8fAogICAgICAgICAgICAgICAgIFZHX0NMT19TVFJFUSh2Z19hcmd2W2ldLCAiLWgiKSkgewogICAgICAgICAqbmVlZF9oZWxwID0gMTsKCiAgICAgIH0gZWxzZSBpZiAoVkdfQ0xPX1NUUkVRKHZnX2FyZ3ZbaV0sICItLWhlbHAtZGVidWciKSkgewogICAgICAgICAqbmVlZF9oZWxwID0gMjsKCiAgICAgIH0gZWxzZSBpZiAoVkdfQ0xPX1NUUkVRTig3LCB2Z19hcmd2W2ldLCAiLS10b29sPSIpIHx8CgkgICAgICAgICBWR19DTE9fU1RSRVFOKDcsIHZnX2FyZ3ZbaV0sICItLXNraW49IikpIHsKCSAqdG9vbCA9ICZ2Z19hcmd2W2ldWzddOwoJIAogICAgICB9IGVsc2UgaWYgKFZHX0NMT19TVFJFUU4oNywgdmdfYXJndltpXSwgIi0tZXhlYz0iKSkgewoJICpleGVjID0gJnZnX2FyZ3ZbaV1bN107CiAgICAgIH0KICAgfQoKICAgLyogSWYgbm8gdG9vbCBzcGVjaWZpZWQsIGNhbiBhY3QgYXBwcm9wcmlhdGVseSB3aXRob3V0IGxvYWRpbmcgdG9vbCAqLwogICBpZiAoKnRvb2wgPT0gTlVMTCkgewogICAgICBpZiAoMCA9PSAqbmVlZF9oZWxwKSB7CiAgICAgICAgIC8vIG5laXRoZXIgLS10b29sIG5vciAtLWhlbHAvLS1oZWxwLWRlYnVnIHNwZWNpZmllZAogICAgICAgICBtaXNzaW5nX3Rvb2xfb3B0aW9uKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEdpdmUgaGVscCBtZXNzYWdlLCB3aXRob3V0IGFueSB0b29sLXNwZWNpZmljIGhlbHAKICAgICAgICAgdXNhZ2UoLypoZWxwLWRlYnVnPyovMiA9PSAqbmVlZF9oZWxwKTsKICAgICAgfQogICB9Cn0KCnN0YXRpYyB2b2lkIHByb2Nlc3NfY21kX2xpbmVfb3B0aW9ucyggVUludCogY2xpZW50X2F1eHYsIGNvbnN0IGNoYXIqIHRvb2xuYW1lICkKewogICBJbnQgIGksIGV2ZW50dWFsbHlfbG9nX2ZkOwogICBJbnQgKmF1eHA7CiAgIEludCAgdG9vbG5hbWVfbGVuID0gVkdfKHN0cmxlbikodG9vbG5hbWUpOwoKICAgLyogbG9nIHRvIHN0ZGVyciBieSBkZWZhdWx0LCBidXQgdXNhZ2UgbWVzc2FnZSBnb2VzIHRvIHN0ZG91dCAqLwogICBldmVudHVhbGx5X2xvZ19mZCA9IDI7IAoKICAgLyogQ2hlY2sgZm9yIHNhbmUgcGF0aCBpbiAuL2NvbmZpZ3VyZSAtLXByZWZpeD0uLi4gKi8KICAgaWYgKFZHX0xJQkRJUlswXSAhPSAnLycpIAogICAgIGNvbmZpZ19lcnJvcigiUGxlYXNlIHVzZSBhYnNvbHV0ZSBwYXRocyBpbiAiCiAgICAgICAgICAgICAgICAgICIuL2NvbmZpZ3VyZSAtLXByZWZpeD0uLi4gb3IgLS1saWJkaXI9Li4uIik7CgogICBmb3IgKGF1eHAgPSBjbGllbnRfYXV4djsgYXV4cFswXSAhPSBWS0lfQVRfTlVMTDsgYXV4cCArPSAyKSB7CiAgICAgIHN3aXRjaChhdXhwWzBdKSB7CiAgICAgIGNhc2UgVktJX0FUX1NZU0lORk86CgkgYXV4cFsxXSA9IChJbnQpKFZHXyhjbGllbnRfdHJhbXBvbGluZV9jb2RlKSArIFZHXyh0cmFtcF9zeXNjYWxsX29mZnNldCkpOwoJIGJyZWFrOwogICAgICB9CiAgIH0gCgogICBmb3IgKGkgPSAxOyBpIDwgdmdfYXJnYzsgaSsrKSB7CgogICAgICBDaGFyKiBhcmcgPSB2Z19hcmd2W2ldOwogICAgICBDaGFyKiBjb2xvbiA9IGFyZzsKCiAgICAgIC8qIExvb2sgZm9yIGEgY29sb24gaW4gdGhlIHN3aXRjaCBuYW1lICovCiAgICAgIHdoaWxlICgqY29sb24gJiYgKmNvbG9uICE9ICc6JyAmJiAqY29sb24gIT0gJz0nKQogICAgICAgICBjb2xvbisrOwoKICAgICAgLyogTG9vayBmb3IgbWF0Y2hpbmcgIi0tdG9vbG5hbWU6Zm9vIiAqLwogICAgICBpZiAoKmNvbG9uID09ICc6JykgewogICAgICAgICBpZiAoVkdfQ0xPX1NUUkVRTigyLCAgICAgICAgICAgIGFyZywgICAgICAgICAgICAgICAgIi0tIikgJiYgCiAgICAgICAgICAgICBWR19DTE9fU1RSRVFOKHRvb2xuYW1lX2xlbiwgYXJnKzIsICAgICAgICAgICAgICB0b29sbmFtZSkgJiYKICAgICAgICAgICAgIFZHX0NMT19TVFJFUU4oMSwgICAgICAgICAgICBhcmcrMit0b29sbmFtZV9sZW4sICI6IikpCiAgICAgICAgIHsKICAgICAgICAgICAgLy8gcHJlZml4IG1hdGNoZXMsIGNvbnZlcnQgIi0tdG9vbG5hbWU6Zm9vIiB0byAiLS1mb28iCiAgICAgICAgICAgIGlmICgwKQogICAgICAgICAgICAgICBWR18ocHJpbnRmKSgidG9vbC1zcGVjaWZpYyBhcmc6ICVzXG4iLCBhcmcpOwogICAgICAgICAgICBhcmcgKz0gdG9vbG5hbWVfbGVuICsgMTsKICAgICAgICAgICAgYXJnWzBdID0gJy0nOwogICAgICAgICAgICBhcmdbMV0gPSAnLSc7CgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBwcmVmaXggZG9lc24ndCBtYXRjaCwgc2tpcCB0byBuZXh0IGFyZwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICAvKiBJZ25vcmUgdGhlc2Ugb3B0aW9ucyAtIHRoZXkndmUgYWxyZWFkeSBiZWVuIGhhbmRsZWQgKi8KICAgICAgaWYgKFZHX0NMT19TVFJFUU4oNywgYXJnLCAiLS10b29sPSIpIHx8CgkgIFZHX0NMT19TVFJFUU4oNywgYXJnLCAiLS1za2luPSIpKQoJIGNvbnRpbnVlOwogICAgICBpZiAoVkdfQ0xPX1NUUkVRTig3LCBhcmcsICItLWV4ZWM9IikpCgkgY29udGludWU7CgogICAgICBpZiAoICAgICBWR19DTE9fU1RSRVEoYXJnLCAiLS0iKSkKCSBjb250aW51ZTsKCiAgICAgIGVsc2UgaWYgKFZHX0NMT19TVFJFUShhcmcsICItdiIpIHx8CiAgICAgICAgICAgICAgIFZHX0NMT19TVFJFUShhcmcsICItLXZlcmJvc2UiKSkKICAgICAgICAgVkdfKGNsb192ZXJib3NpdHkpKys7CgogICAgICBlbHNlIGlmIChWR19DTE9fU1RSRVEoYXJnLCAiLXEiKSB8fAogICAgICAgICAgICAgICBWR19DTE9fU1RSRVEoYXJnLCAiLS1xdWlldCIpKQogICAgICAgICBWR18oY2xvX3ZlcmJvc2l0eSktLTsKCiAgICAgIGVsc2UgVkdfQk9PTF9DTE8oIi0tYnJhbmNocHJlZCIsICAgICAgIFZHXyhjbG9fYnJhbmNocHJlZCkpCiAgICAgIGVsc2UgVkdfQk9PTF9DTE8oIi0tY2hhaW4tYmIiLCAgICAgICAgIFZHXyhjbG9fY2hhaW5fYmIpKQogICAgICBlbHNlIFZHX0JPT0xfQ0xPKCItLWRiLWF0dGFjaCIsICAgICAgICBWR18oY2xvX2RiX2F0dGFjaCkpCiAgICAgIGVsc2UgVkdfQk9PTF9DTE8oIi0tZGVtYW5nbGUiLCAgICAgICAgIFZHXyhjbG9fZGVtYW5nbGUpKQogICAgICBlbHNlIFZHX0JPT0xfQ0xPKCItLWVycm9yLWxpbWl0IiwgICAgICBWR18oY2xvX2Vycm9yX2xpbWl0KSkKICAgICAgZWxzZSBWR19CT09MX0NMTygiLS1nZW4tc3VwcHJlc3Npb25zIiwgVkdfKGNsb19nZW5fc3VwcHJlc3Npb25zKSkKICAgICAgZWxzZSBWR19CT09MX0NMTygiLS1sb3dsYXQtc2lnbmFscyIsICAgVkdfKGNsb19sb3dsYXRfc2lnbmFscykpCiAgICAgIGVsc2UgVkdfQk9PTF9DTE8oIi0tbG93bGF0LXN5c2NhbGxzIiwgIFZHXyhjbG9fbG93bGF0X3N5c2NhbGxzKSkKICAgICAgZWxzZSBWR19CT09MX0NMTygiLS1vcHRpbWlzZSIsICAgICAgICAgVkdfKGNsb19vcHRpbWlzZSkpCiAgICAgIGVsc2UgVkdfQk9PTF9DTE8oIi0tcG9pbnRlcmNoZWNrIiwgICAgIFZHXyhjbG9fcG9pbnRlcmNoZWNrKSkKICAgICAgZWxzZSBWR19CT09MX0NMTygiLS1wcm9maWxlIiwgICAgICAgICAgVkdfKGNsb19wcm9maWxlKSkKICAgICAgZWxzZSBWR19CT09MX0NMTygiLS1ydW4tbGliYy1mcmVlcmVzIiwgVkdfKGNsb19ydW5fbGliY19mcmVlcmVzKSkKICAgICAgZWxzZSBWR19CT09MX0NMTygiLS1zaG93LWJlbG93LW1haW4iLCAgVkdfKGNsb19zaG93X2JlbG93X21haW4pKQogICAgICBlbHNlIFZHX0JPT0xfQ0xPKCItLXNpbmdsZS1zdGVwIiwgICAgICBWR18oY2xvX3NpbmdsZV9zdGVwKSkKICAgICAgZWxzZSBWR19CT09MX0NMTygiLS10aW1lLXN0YW1wIiwgICAgICAgVkdfKGNsb190aW1lX3N0YW1wKSkKICAgICAgZWxzZSBWR19CT09MX0NMTygiLS10cmFjay1mZHMiLCAgICAgICAgVkdfKGNsb190cmFja19mZHMpKQogICAgICBlbHNlIFZHX0JPT0xfQ0xPKCItLXRyYWNlLWNoaWxkcmVuIiwgICBWR18oY2xvX3RyYWNlX2NoaWxkcmVuKSkKICAgICAgZWxzZSBWR19CT09MX0NMTygiLS10cmFjZS1zY2hlZCIsICAgICAgVkdfKGNsb190cmFjZV9zY2hlZCkpCiAgICAgIGVsc2UgVkdfQk9PTF9DTE8oIi0tdHJhY2Utc2lnbmFscyIsICAgIFZHXyhjbG9fdHJhY2Vfc2lnbmFscykpCiAgICAgIGVsc2UgVkdfQk9PTF9DTE8oIi0tdHJhY2Utc3ltdGFiIiwgICAgIFZHXyhjbG9fdHJhY2Vfc3ltdGFiKSkKICAgICAgZWxzZSBWR19CT09MX0NMTygiLS10cmFjZS1zeXNjYWxscyIsICAgVkdfKGNsb190cmFjZV9zeXNjYWxscykpCiAgICAgIGVsc2UgVkdfQk9PTF9DTE8oIi0td2FpdC1mb3ItZ2RiIiwgICAgIFZHXyhjbG9fd2FpdF9mb3JfZ2RiKSkKCiAgICAgIGVsc2UgVkdfU1RSX0NMTyAoIi0tZGItY29tbWFuZCIsICAgICAgICBWR18oY2xvX2RiX2NvbW1hbmQpKQogICAgICBlbHNlIFZHX1NUUl9DTE8gKCItLXdlaXJkLWhhY2tzIiwgICAgICAgVkdfKGNsb193ZWlyZF9oYWNrcykpCgogICAgICBlbHNlIFZHX05VTV9DTE8gKCItLWR1bXAtZXJyb3IiLCAgICAgICAgVkdfKGNsb19kdW1wX2Vycm9yKSkKICAgICAgZWxzZSBWR19OVU1fQ0xPICgiLS1pbnB1dC1mZCIsICAgICAgICAgIFZHXyhjbG9faW5wdXRfZmQpKQogICAgICBlbHNlIFZHX05VTV9DTE8gKCItLXNhbml0eS1sZXZlbCIsICAgICAgVkdfKGNsb19zYW5pdHlfbGV2ZWwpKQogICAgICBlbHNlIFZHX05VTV9DTE8gKCItLXNpZ25hbK1wb2xsdGltZSIsICAgVkdfKGNsb19zaWduYWxfcG9sbHRpbWUpKQogICAgICBlbHNlIFZHX0JOVU1fQ0xPKCItLW51bS1jYWxsZXJzIiwgICAgICAgVkdfKGNsb19iYWNrdHJhY2Vfc2l6ZSksIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZHX0RFRVBFU1RfQkFDS1RSQUNFKQoKICAgICAgLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCByZXBsYWNlZCBieSAtLWxvZy1mZAogICAgICBlbHNlIGlmIChWR19DTE9fU1RSRVFOKDEzLCBhcmcsICItLWxvZ2ZpbGUtZmQ9IikpIHsKICAgICAgICAgVkdfKGNsb19sb2dfdG8pICAgPSBWZ0xvZ1RvX0ZkOwogICAgICAgICBWR18oY2xvX2xvZ19uYW1lKSA9IE5VTEw7CiAgICAgICAgIGV2ZW50dWFsbHlfbG9nX2ZkID0gKEludClWR18oYXRvbGwpKCZhcmdbMTNdKTsKICAgICAgfQogICAgICBlbHNlIGlmIChWR19DTE9fU1RSRVFOKDksICBhcmcsICItLWxvZy1mZD0iKSkgewogICAgICAgICBWR18oY2xvX2xvZ190bykgICA9IFZnTG9nVG9fRmQ7CiAgICAgICAgIFZHXyhjbG9fbG9nX25hbWUpID0gTlVMTDsKICAgICAgICAgZXZlbnR1YWxseV9sb2dfZmQgPSAoSW50KVZHXyhhdG9sbCkoJmFyZ1s5XSk7CiAgICAgIH0KCiAgICAgIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgcmVwbGFjZWQgYnkgLS1sb2ctZmlsZQogICAgICBlbHNlIGlmIChWR19DTE9fU1RSRVFOKDEwLCBhcmcsICItLWxvZ2ZpbGU9IikpIHsKICAgICAgICAgVkdfKGNsb19sb2dfdG8pICAgPSBWZ0xvZ1RvX0ZpbGU7CiAgICAgICAgIFZHXyhjbG9fbG9nX25hbWUpID0gJmFyZ1sxMF07CiAgICAgIH0KICAgICAgZWxzZSBpZiAoVkdfQ0xPX1NUUkVRTigxMSwgYXJnLCAiLS1sb2ctZmlsZT0iKSkgewogICAgICAgICBWR18oY2xvX2xvZ190bykgICA9IFZnTG9nVG9fRmlsZTsKICAgICAgICAgVkdfKGNsb19sb2dfbmFtZSkgPSAmYXJnWzExXTsKICAgICAgfQoKICAgICAgLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCByZXBsYWNlZCBieSAtLWxvZy1zb2NrZXQKICAgICAgZWxzZSBpZiAoVkdfQ0xPX1NUUkVRTigxMiwgYXJnLCAiLS1sb2dzb2NrZXQ9IikpIHsKICAgICAgICAgVkdfKGNsb19sb2dfdG8pICAgPSBWZ0xvZ1RvX1NvY2tldDsKICAgICAgICAgVkdfKGNsb19sb2dfbmFtZSkgPSAmYXJnWzEyXTsKICAgICAgfQogICAgICBlbHNlIGlmIChWR19DTE9fU1RSRVFOKDEzLCBhcmcsICItLWxvZy1zb2NrZXQ9IikpIHsKICAgICAgICAgVkdfKGNsb19sb2dfdG8pICAgPSBWZ0xvZ1RvX1NvY2tldDsKICAgICAgICAgVkdfKGNsb19sb2dfbmFtZSkgPSAmYXJnWzEzXTsKICAgICAgfQoKICAgICAgZWxzZSBpZiAoVkdfQ0xPX1NUUkVRTigxNSwgYXJnLCAiLS1zdXBwcmVzc2lvbnM9IikpIHsKICAgICAgICAgaWYgKFZHXyhjbG9fbl9zdXBwcmVzc2lvbnMpID49IFZHX0NMT19NQVhfU0ZJTEVTKSB7CiAgICAgICAgICAgIFZHXyhtZXNzYWdlKShWZ19Vc2VyTXNnLCAiVG9vIG1hbnkgc3VwcHJlc3Npb24gZmlsZXMgc3BlY2lmaWVkLiIpOwogICAgICAgICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgCiAgICAgICAgICAgICAgICAgICAgICAgICAiSW5jcmVhc2UgVkdfQ0xPX01BWF9TRklMRVMgYW5kIHJlY29tcGlsZS4iKTsKICAgICAgICAgICAgVkdfKGJhZF9vcHRpb24pKGFyZyk7CiAgICAgICAgIH0KICAgICAgICAgVkdfKGNsb19zdXBwcmVzc2lvbnMpW1ZHXyhjbG9fbl9zdXBwcmVzc2lvbnMpXSA9ICZhcmdbMTVdOwogICAgICAgICBWR18oY2xvX25fc3VwcHJlc3Npb25zKSsrOwogICAgICB9CgogICAgICAvKiAidnd4eXoiIC0tPiAwMDB6eXh3diAoYmluYXJ5KSAqLwogICAgICBlbHNlIGlmIChWR19DTE9fU1RSRVFOKDE2LCBhcmcsICItLXRyYWNlLWNvZGVnZW49IikpIHsKICAgICAgICAgSW50IGo7CiAgICAgICAgIGNoYXIqIG9wdCA9ICYgYXJnWzE2XTsKICAgCiAgICAgICAgIGlmICg1ICE9IFZHXyhzdHJsZW4pKG9wdCkpIHsKICAgICAgICAgICAgVkdfKG1lc3NhZ2UpKFZnX1VzZXJNc2csIAogICAgICAgICAgICAgICAgICAgICAgICAgIi0tdHJhY2UtY29kZWdlbiBhcmd1bWVudCBtdXN0IGhhdmUgNSBkaWdpdHMiKTsKICAgICAgICAgICAgVkdfKGJhZF9vcHRpb24pKGFyZyk7CiAgICAgICAgIH0KICAgICAgICAgZm9yIChqID0gMDsgaiA8IDU7IGorKykgewogICAgICAgICAgICBpZiAgICAgICgnMCcgPT0gb3B0W2pdKSB7IC8qIGRvIG5vdGhpbmcgKi8gfQogICAgICAgICAgICBlbHNlIGlmICgnMScgPT0gb3B0W2pdKSBWR18oY2xvX3RyYWNlX2NvZGVnZW4pIHw9ICgxIDw8IGopOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgVkdfKG1lc3NhZ2UpKFZnX1VzZXJNc2csICItLXRyYWNlLWNvZGVnZW4gYXJndW1lbnQgY2FuIG9ubHkgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRhaW4gMHMgYW5kIDFzIik7CiAgICAgICAgICAgICAgIFZHXyhiYWRfb3B0aW9uKShhcmcpOwogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgZWxzZSBpZiAoVkdfQ0xPX1NUUkVRKGFyZywgIi0tdHJhY2UtcHRocmVhZD1ub25lIikpCiAgICAgICAgIFZHXyhjbG9fdHJhY2VfcHRocmVhZF9sZXZlbCkgPSAwOwogICAgICBlbHNlIGlmIChWR19DTE9fU1RSRVEoYXJnLCAiLS10cmFjZS1wdGhyZWFkPXNvbWUiKSkKICAgICAgICAgVkdfKGNsb190cmFjZV9wdGhyZWFkX2xldmVsKSA9IDE7CiAgICAgIGVsc2UgaWYgKFZHX0NMT19TVFJFUShhcmcsICItLXRyYWNlLXB0aHJlYWQ9YWxsIikpCiAgICAgICAgIFZHXyhjbG9fdHJhY2VfcHRocmVhZF9sZXZlbCkgPSAyOwoKICAgICAgZWxzZSBpZiAoICEgVkdfKG5lZWRzKS5jb21tYW5kX2xpbmVfb3B0aW9ucwogICAgICAgICAgICAgfHwgISBTS18ocHJvY2Vzc19jbWRfbGluZV9vcHRpb24pKGFyZykgKSB7CiAgICAgICAgIFZHXyhiYWRfb3B0aW9uKShhcmcpOwogICAgICB9CiAgIH0KCiAgIC8vIENoZWNrIHZhcmlvdXMgb3B0aW9uIHZhbHVlcwoKICAgaWYgKFZHXyhjbG9fdmVyYm9zaXR5KSA8IDApCiAgICAgIFZHXyhjbG9fdmVyYm9zaXR5KSA9IDA7CgogICBpZiAoVkdfKGNsb19kYl9hdHRhY2gpICYmIFZHXyhjbG9fdHJhY2VfY2hpbGRyZW4pKSB7CiAgICAgIFZHXyhtZXNzYWdlKShWZ19Vc2VyTXNnLCAiIik7CiAgICAgIFZHXyhtZXNzYWdlKShWZ19Vc2VyTXNnLCAKICAgICAgICAgIi0tZGItYXR0YWNoPXllcyBjb25mbGljdHMgd2l0aCAtLXRyYWNlLWNoaWxkcmVuPXllcyIpOwogICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgCiAgICAgICAgICJQbGVhc2UgY2hvb3NlIG9uZSBvciB0aGUgb3RoZXIsIGJ1dCBub3QgYm90aC4iKTsKICAgICAgVkdfKGJhZF9vcHRpb24pKCItLWRiLWF0dGFjaD15ZXMgYW5kIC0tdHJhY2UtY2hpbGRyZW49eWVzIik7CiAgIH0KCiAgIC8qIFNldCB1cCBsb2dnaW5nIG5vdy4gIEFmdGVyIHRoaXMgaXMgZG9uZSwgVkdfKGNsb19sb2dfZmQpCiAgICAgIHNob3VsZCBiZSBjb25uZWN0ZWQgdG8gd2hhdGV2ZXIgc2luayBoYXMgYmVlbiBzZWxlY3RlZCwgYW5kIHdlCiAgICAgIGluZGlzY3JpbWluYXRlbHkgY2h1Y2sgc3R1ZmYgaW50byBpdCB3aXRob3V0IHdvcnJ5aW5nIHdoYXQgdGhlCiAgICAgIG5hdHVyZSBvZiBpdCBpcy4gIE9oIHRoZSB3b25kZXIgb2YgVW5peCBzdHJlYW1zLiAqLwoKICAgLyogU28gZmFyIHdlIHNob3VsZCBiZSBzdGlsbCBhdHRhY2hlZCB0byBzdGRvdXQsIHNvIHdlIGNhbiBzaG93IG9uCiAgICAgIHRoZSB0ZXJtaW5hbCBhbnkgcHJvYmxlbXMgdG8gZG8gd2l0aCBwcm9jZXNzaW5nIGNvbW1hbmQgbGluZQogICAgICBvcHRzLiAqLwogICB2Z19hc3NlcnQoVkdfKGNsb19sb2dfZmQpID09IDEgLyogc3Rkb3V0ICovKTsKICAgdmdfYXNzZXJ0KFZHXyhsb2dnaW5nX3RvX2ZpbGVkZXMpID09IFRydWUpOwoKICAgc3dpdGNoIChWR18oY2xvX2xvZ190bykpIHsKCiAgICAgIGNhc2UgVmdMb2dUb19GZDogCiAgICAgICAgIHZnX2Fzc2VydChWR18oY2xvX2xvZ19uYW1lKSA9PSBOVUxMKTsKICAgICAgICAgVkdfKGNsb19sb2dfZmQpID0gZXZlbnR1YWxseV9sb2dfZmQ7CiAgICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBWZ0xvZ1RvX0ZpbGU6IHsKICAgICAgICAgQ2hhciBsb2dmaWxlbmFtZVsxMDAwXTsKCSBJbnQgc2VxID0gMDsKCSBJbnQgcGlkID0gVkdfKGdldHBpZCkoKTsKCiAgICAgICAgIHZnX2Fzc2VydChWR18oY2xvX2xvZ19uYW1lKSAhPSBOVUxMKTsKICAgICAgICAgdmdfYXNzZXJ0KFZHXyhzdHJsZW4pKFZHXyhjbG9fbG9nX25hbWUpKSA8PSA5MDApOyAvKiBwYXJhbm9pYSAqLwoKCSBmb3IgKDs7KSB7CgkgICAgaWYgKHNlcSA9PSAwKQoJICAgICAgIFZHXyhzcHJpbnRmKShsb2dmaWxlbmFtZSwgIiVzLnBpZCVkIiwKCQkJICAgIFZHXyhjbG9fbG9nX25hbWUpLCBwaWQgKTsKCSAgICBlbHNlCgkgICAgICAgVkdfKHNwcmludGYpKGxvZ2ZpbGVuYW1lLCAiJXMucGlkJWQuJWQiLAoJCQkgICAgVkdfKGNsb19sb2dfbmFtZSksIHBpZCwgc2VxICk7CgkgICAgc2VxKys7CgoJICAgIGV2ZW50dWFsbHlfbG9nX2ZkIAoJICAgICAgID0gVkdfKG9wZW4pKGxvZ2ZpbGVuYW1lLCAKCQkJICAgVktJX09fQ1JFQVR8VktJX09fV1JPTkxZfFZLSV9PX0VYQ0x8VktJX09fVFJVTkMsIAoJCQkgICBWS0lfU19JUlVTUnxWS0lfU19JV1VTUik7CgkgICAgaWYgKGV2ZW50dWFsbHlfbG9nX2ZkID49IDApIHsKCSAgICAgICBWR18oY2xvX2xvZ19mZCkgPSBWR18oc2FmZV9mZCkoZXZlbnR1YWxseV9sb2dfZmQpOwoJICAgICAgIGJyZWFrOwoJICAgIH0gZWxzZSB7CgkgICAgICAgaWYgKGV2ZW50dWFsbHlfbG9nX2ZkICE9IC1WS0lfRUVYSVNUKSB7CgkJICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgCgkJCSAgICAgICAiQ2FuJ3QgY3JlYXRlL29wZW4gbG9nIGZpbGUgYCVzLnBpZCVkJzsgZ2l2aW5nIHVwISIsIAoJCQkgICAgICAgVkdfKGNsb19sb2dfbmFtZSksIHBpZCk7CgkJICBWR18oYmFkX29wdGlvbikoCgkJICAgICAiLS1sb2ctZmlsZT08ZmlsZT4gZGlkbid0IHdvcmsgb3V0IGZvciBzb21lIHJlYXNvbi4iKTsKCQkgIGJyZWFrOwoJICAgICAgIH0KCSAgICB9CgkgfQogICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgY2FzZSBWZ0xvZ1RvX1NvY2tldDogewogICAgICAgICB2Z19hc3NlcnQoVkdfKGNsb19sb2dfbmFtZSkgIT0gTlVMTCk7CiAgICAgICAgIHZnX2Fzc2VydChWR18oc3RybGVuKShWR18oY2xvX2xvZ19uYW1lKSkgPD0gOTAwKTsgLyogcGFyYW5vaWEgKi8KICAgICAgICAgZXZlbnR1YWxseV9sb2dfZmQgPSBWR18oY29ubmVjdF92aWFfc29ja2V0KSggVkdfKGNsb19sb2dfbmFtZSkgKTsKICAgICAgICAgaWYgKGV2ZW50dWFsbHlfbG9nX2ZkID09IC0xKSB7CiAgICAgICAgICAgIFZHXyhtZXNzYWdlKShWZ19Vc2VyTXNnLCAKICAgICAgICAgICAgICAgIkludmFsaWQgLS1sb2ctc29ja2V0PWlwYWRkciBvciAtLWxvZy1zb2NrZXQ9aXBhZGRyOnBvcnQgc3BlYyIpOyAKICAgICAgICAgICAgVkdfKG1lc3NhZ2UpKFZnX1VzZXJNc2csIAogICAgICAgICAgICAgICAib2YgYCVzJzsgZ2l2aW5nIHVwISIsIFZHXyhjbG9fbG9nX25hbWUpICk7CiAgICAgICAgICAgIFZHXyhiYWRfb3B0aW9uKSgKICAgICAgICAgICAgICAgIi0tbG9nLXNvY2tldD0iKTsKCSB9CiAgICAgICAgIGlmIChldmVudHVhbGx5X2xvZ19mZCA9PSAtMikgewogICAgICAgICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgCiAgICAgICAgICAgICAgICJ2YWxncmluZDogZmFpbGVkIHRvIGNvbm5lY3QgdG8gbG9nZ2luZyBzZXJ2ZXIgYCVzJy4iLAogICAgICAgICAgICAgICBWR18oY2xvX2xvZ19uYW1lKSApOyAKICAgICAgICAgICAgVkdfKG1lc3NhZ2UpKFZnX1VzZXJNc2csIAogICAgICAgICAgICAgICAgIkxvZyBtZXNzYWdlcyB3aWxsIHNlbnQgdG8gc3RkZXJyIGluc3RlYWQuIiApOwogICAgICAgICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgCiAgICAgICAgICAgICAgICAiIiApOwogICAgICAgICAgICAvKiBXZSBkb24ndCBjaGFuZ2UgYW55dGhpbmcgaGVyZS4gKi8KCSB9IGVsc2UgewogICAgICAgICAgICB2Z19hc3NlcnQoZXZlbnR1YWxseV9sb2dfZmQgPiAwKTsKICAgICAgICAgICAgVkdfKGNsb19sb2dfZmQpID0gZXZlbnR1YWxseV9sb2dfZmQ7CiAgICAgICAgICAgIFZHXyhsb2dnaW5nX3RvX2ZpbGVkZXMpID0gRmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgIH0KCiAgIC8qIE1vdmUgbG9nX2ZkIGludG8gdGhlIHNhZmUgcmFuZ2UsIHNvIGl0IGRvZXNuJ3QgY29uZmxpY3Qgd2l0aCBhbnkgYXBwIGZkcyAqLwogICBldmVudHVhbGx5X2xvZ19mZCA9IFZHXyhmY250bCkoVkdfKGNsb19sb2dfZmQpLCBWS0lfRl9EVVBGRCwgVkdfKGZkX2hhcmRfbGltaXQpKTsKICAgaWYgKGV2ZW50dWFsbHlfbG9nX2ZkIDwgMCkKICAgICAgVkdfKG1lc3NhZ2UpKFZnX1VzZXJNc2csICJ2YWxncmluZDogZmFpbGVkIHRvIG1vdmUgbG9nZmlsZSBmZCBpbnRvIHNhZmUgcmFuZ2UiKTsKICAgZWxzZSB7CiAgICAgIFZHXyhjbG9fbG9nX2ZkKSA9IGV2ZW50dWFsbHlfbG9nX2ZkOwogICAgICBWR18oZmNudGwpKFZHXyhjbG9fbG9nX2ZkKSwgVktJX0ZfU0VURkQsIFZLSV9GRF9DTE9FWEVDKTsKICAgfQoKICAgLyogT2ssIHRoZSBsb2dnaW5nIHNpbmsgaXMgcnVubmluZyBub3cuICBQcmludCBhIHN1aXRhYmxlIHByZWFtYmxlLgogICAgICBJZiBsb2dnaW5nIHRvIGZpbGUgb3IgYSBzb2NrZXQsIHdyaXRlIGRldGFpbHMgb2YgcGFyZW50IFBJRCBhbmQKICAgICAgY29tbWFuZCBsaW5lIGFyZ3MsIHRvIGhlbHAgcGVvcGxlIHRyeWluZyB0byBpbnRlcnByZXQgdGhlCiAgICAgIHJlc3VsdHMgb2YgYSBydW4gd2hpY2ggZW5jb21wYXNzZXMgbXVsdGlwbGUgcHJvY2Vzc2VzLiAqLwoKICAgaWYgKFZHXyhjbG9fdmVyYm9zaXR5ID4gMCkpIHsKICAgICAgLyogVG9vbCBkZXRhaWxzICovCiAgICAgIFZHXyhtZXNzYWdlKShWZ19Vc2VyTXNnLCAiJXMlcyVzLCAlcyBmb3IgJXMuIiwKICAgICAgICAgICAgICAgICAgIFZHXyhkZXRhaWxzKS5uYW1lLCAKICAgICAgICAgICAgICAgICAgIE5VTEwgPT0gVkdfKGRldGFpbHMpLnZlcnNpb24gPyAgICAgICAgIiIgOiAiLSIsCiAgICAgICAgICAgICAgICAgICBOVUxMID09IFZHXyhkZXRhaWxzKS52ZXJzaW9uIAogICAgICAgICAgICAgICAgICAgICAgPyAoQ2hhciopIiIgOiBWR18oZGV0YWlscykudmVyc2lvbiwKICAgICAgICAgICAgICAgICAgIFZHXyhkZXRhaWxzKS5kZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgIFZHX1BMQVRGT1JNKTsKICAgICAgVkdfKG1lc3NhZ2UpKFZnX1VzZXJNc2csICIlcyIsIFZHXyhkZXRhaWxzKS5jb3B5cmlnaHRfYXV0aG9yKTsKCiAgICAgIC8qIENvcmUgZGV0YWlscyAqLwogICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywKICAgICAgICAgIlVzaW5nIHZhbGdyaW5kLSVzLCBhIHByb2dyYW0gc3VwZXJ2aXNpb24gZnJhbWV3b3JrIGZvciAlcy4iLAogICAgICAgICBWRVJTSU9OLCBWR19QTEFURk9STSk7CiAgICAgIFZHXyhtZXNzYWdlKShWZ19Vc2VyTXNnLCAKICAgICAgICAgIkNvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBhbmQgR05VIEdQTCdkLCBieSBKdWxpYW4gU2V3YXJkIGV0IGFsLiIpOwogICB9CgogICBpZiAoVkdfKGNsb192ZXJib3NpdHkpID4gMCAmJiBWR18oY2xvX2xvZ190bykgIT0gVmdMb2dUb19GZCkgewogICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgIiIpOwogICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgCiAgICAgICAgICJNeSBQSUQgPSAlZCwgcGFyZW50IFBJRCA9ICVkLiAgUHJvZyBhbmQgYXJncyBhcmU6IiwKICAgICAgICAgVkdfKGdldHBpZCkoKSwgVkdfKGdldHBwaWQpKCkgKTsKICAgICAgZm9yIChpID0gMDsgaSA8IFZHXyhjbGllbnRfYXJnYyk7IGkrKykgCiAgICAgICAgIFZHXyhtZXNzYWdlKShWZ19Vc2VyTXNnLCAiICAgJXMiLCBWR18oY2xpZW50X2FyZ3YpW2ldKTsKICAgfQoKICAgaWYgKFZHXyhjbG9fdmVyYm9zaXR5KSA+IDEpIHsKICAgICAgSW50IGZkOwogICAgICBpZiAoVkdfKGNsb19sb2dfdG8pICE9IFZnTG9nVG9fRmQpCiAgICAgICAgIFZHXyhtZXNzYWdlKShWZ19Vc2VyTXNnLCAiIik7CiAgICAgIFZHXyhtZXNzYWdlKShWZ19Vc2VyTXNnLCAiVmFsZ3JpbmQgbGlicmFyeSBkaXJlY3Rvcnk6ICVzIiwgVkdfKGxpYmRpcikpOwogICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgIkNvbW1hbmQgbGluZSIpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgVkdfKGNsaWVudF9hcmdjKTsgaSsrKQogICAgICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgIiAgICVzIiwgVkdfKGNsaWVudF9hcmd2KVtpXSk7CgogICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgIlN0YXJ0dXAsIHdpdGggZmxhZ3M6Iik7CiAgICAgIGZvciAoaSA9IDE7IGkgPCB2Z19hcmdjOyBpKyspIHsKICAgICAgICAgVkdfKG1lc3NhZ2UpKFZnX1VzZXJNc2csICIgICAlcyIsIHZnX2FyZ3ZbaV0pOwogICAgICB9CgogICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgIkNvbnRlbnRzIG9mIC9wcm9jL3ZlcnNpb246Iik7CiAgICAgIGZkID0gVkdfKG9wZW4pICggIi9wcm9jL3ZlcnNpb24iLCBWS0lfT19SRE9OTFksIDAgKTsKICAgICAgaWYgKGZkIDwgMCkgewogICAgICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgIiAgY2FuJ3Qgb3BlbiAvcHJvYy92ZXJzaW9uIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgICNkZWZpbmUgQlVGX0xFTiAgICAyNTYKICAgICAgICAgQ2hhciB2ZXJzaW9uX2J1ZltCVUZfTEVOXTsKICAgICAgICAgSW50IG4gPSBWR18ocmVhZCkgKCBmZCwgdmVyc2lvbl9idWYsIEJVRl9MRU4gKTsKICAgICAgICAgdmdfYXNzZXJ0KG4gPD0gMjU2KTsKICAgICAgICAgaWYgKG4gPiAwKSB7CiAgICAgICAgICAgIHZlcnNpb25fYnVmW24tMV0gPSAnXDAnOwogICAgICAgICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgIiAgJXMiLCB2ZXJzaW9uX2J1Zik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFZHXyhtZXNzYWdlKShWZ19Vc2VyTXNnLCAiICAoZW1wdHk/KSIpOwogICAgICAgICB9CiAgICAgICAgIFZHXyhjbG9zZSkoZmQpOwogICAgICAgICAjdW5kZWYgQlVGX0xFTgogICAgICB9CiAgIH0KCiAgIGlmIChWR18oY2xvX25fc3VwcHJlc3Npb25zKSA8IFZHX0NMT19NQVhfU0ZJTEVTLTEgJiYKICAgICAgIChWR18obmVlZHMpLmNvcmVfZXJyb3JzIHx8IFZHXyhuZWVkcykuc2tpbl9lcnJvcnMpKSB7CiAgICAgIC8qIElmIHRoZXJlIGFyZSBubyBzdXBwcmVzc2lvbiBmaWxlcyBzcGVjaWZpZWQgYW5kIHRoZSB0b29sCgkgbmVlZHMgb25lLCBsb2FkIHRoZSBkZWZhdWx0ICovCiAgICAgIHN0YXRpYyBjb25zdCBDaGFyIGRlZmF1bHRfc3VwcFtdID0gImRlZmF1bHQuc3VwcCI7CiAgICAgIEludCBsZW4gPSBWR18oc3RybGVuKShWR18obGliZGlyKSkgKyAxICsgc2l6ZW9mKGRlZmF1bHRfc3VwcCk7CiAgICAgIENoYXIgKmJ1ZiA9IFZHXyhhcmVuYV9tYWxsb2MpKFZHX0FSX0NPUkUsIGxlbik7CiAgICAgIFZHXyhzcHJpbnRmKShidWYsICIlcy8lcyIsIFZHXyhsaWJkaXIpLCBkZWZhdWx0X3N1cHApOwogICAgICBWR18oY2xvX3N1cHByZXNzaW9ucylbVkdfKGNsb19uX3N1cHByZXNzaW9ucyldID0gYnVmOwogICAgICBWR18oY2xvX25fc3VwcHJlc3Npb25zKSsrOwogICB9CgogICBpZiAoVkdfKGNsb19nZW5fc3VwcHJlc3Npb25zKSAmJiAKICAgICAgICFWR18obmVlZHMpLmNvcmVfZXJyb3JzICYmICFWR18obmVlZHMpLnNraW5fZXJyb3JzKSB7CiAgICAgIFZHXyhtZXNzYWdlKShWZ19Vc2VyTXNnLCAKICAgICAgICAgICAgICAgICAgICJDYW4ndCB1c2UgLS1nZW4tc3VwcHJlc3Npb25zPXllcyB3aXRoIHRoaXMgdG9vbCwiKTsKICAgICAgVkdfKG1lc3NhZ2UpKFZnX1VzZXJNc2csIAogICAgICAgICAgICAgICAgICAgImFzIGl0IGRvZXNuJ3QgZ2VuZXJhdGUgZXJyb3JzLiIpOwogICAgICBWR18oYmFkX29wdGlvbikoIi0tZ2VuLXN1cHByZXNzaW9ucz15ZXMiKTsKICAgfQp9CgovLyBCdWlsZCB0aGUgc3RyaW5nIGZvciBWQUxHUklORENMTy4KQ2hhciogVkdfKGJ1aWxkX2NoaWxkX1ZBTEdSSU5EQ0xPKSggQ2hhciogZXhlbmFtZSApCnsKICAgLyogSWYgd2UncmUgdHJhY2luZyB0aGUgY2hpbGRyZW4sIHRoZW4gd2UgbmVlZCB0byBzdGFydCBpdAogICAgICB3aXRoIG91ciBzdGFydGVyK2FyZ3VtZW50cywgd2hpY2ggYXJlIGNvcGllZCBpbnRvIFZBTEdSSU5EQ0xPLAogICAgICBleGNlcHQgdGhlIC0tZXhlYz0gb3B0aW9uIGlzIGNoYW5nZWQgaWYgcHJlc2VudC4KICAgKi8KICAgSW50IGk7CiAgIENoYXIgKmV4ZWM7CiAgIENoYXIgKmNwOwogICBDaGFyICpvcHR2YXI7CiAgIEludCAgb3B0bGVuLCBleGVjbGVuOwoKICAgLy8gQWxsIHRoZXNlIGFsbG9jYXRlZCBibG9ja3MgYXJlIG5vdCBmcmVlIC0gYmVjYXVzZSB3ZSdyZSBlaXRoZXIKICAgLy8gZ29pbmcgdG8gZXhlYywgb3IgcGFuaWMgd2hlbiB3ZSBmYWlsLgoKICAgLy8gQ3JlYXRlIC0tZXhlYz0gb3B0aW9uOiAiLS1leGVjPTxleGVuYW1lPiIKICAgZXhlYyA9IFZHXyhhcmVuYV9tYWxsb2MpKFZHX0FSX0NPUkUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVkdfKHN0cmxlbikoIGV4ZW5hbWUgKSArIDcvKi0tZXhlYz0qLyArIDEvKlwwKi8pOwogICB2Z19hc3NlcnQoTlVMTCAhPSBleGVjKTsKICAgVkdfKHNwcmludGYpKGV4ZWMsICItLWV4ZWM9JXMiLCBleGVuYW1lKTsKCiAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciBvcHR2YXIgKG1heSBvdmVyZXN0aW1hdGUgYnkgY291bnRpbmcgLS1leGVjIHR3aWNlLAogICAvLyBubyBtYXR0ZXIpCiAgIG9wdGxlbiA9IDE7CiAgIGZvciAoaSA9IDA7IGkgPCB2Z19hcmdjOyBpKyspCiAgICAgIG9wdGxlbiArPSBWR18oc3RybGVuKSh2Z19hcmd2W2ldKSArIDE7CiAgIG9wdGxlbiArPSBWR18oc3RybGVuKShleGVjKSsxOwogICBvcHR2YXIgPSBWR18oYXJlbmFfbWFsbG9jKShWR19BUl9DT1JFLCBvcHRsZW4pOwoKICAgLy8gQ29weSBhbGwgdmFsZ3JpbmQgYXJncyBleGNlcHQgdGhlIG9sZCAtLWV4ZWMgKGlmIHByZXNlbnQpCiAgIC8vIFZHX0NMT19TRVAgaXMgdGhlIHNlcGFyYXRvci4KICAgY3AgPSBvcHR2YXI7CiAgIGZvciAoaSA9IDE7IGkgPCB2Z19hcmdjOyBpKyspIHsKICAgICAgQ2hhciAqYXJnID0gdmdfYXJndltpXTsKICAgICAgCiAgICAgIGlmIChWR18obWVtY21wKShhcmcsICItLWV4ZWM9IiwgNykgPT0gMCkgewogICAgICAgICAvLyBkb24ndCBjb3B5IGV4aXN0aW5nIC0tZXhlYz0gYXJnCiAgICAgIH0gZWxzZSBpZiAoVkdfKHN0cmNtcCkoYXJnLCAiLS0iKSA9PSAwKSB7CiAgICAgICAgIC8vIHN0b3AgYXQgIi0tIgogICAgICAgICBicmVhazsKICAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gY29weSBub24gIi0tZXhlYyIgYXJnCiAgICAgICAgIEludCBsZW4gPSBWR18oc3RybGVuKShhcmcpOwogICAgICAgICBWR18obWVtY3B5KShjcCwgYXJnLCBsZW4pOwogICAgICAgICBjcCArPSBsZW47CiAgICAgICAgICpjcCsrID0gVkdfQ0xPX1NFUDsKICAgICAgfQogICB9CiAgIC8vIEFkZCB0aGUgbmV3IC0tZXhlYz0gb3B0aW9uCiAgIGV4ZWNsZW4gPSBWR18oc3RybGVuKShleGVjKTsKICAgVkdfKG1lbWNweSkoY3AsIGV4ZWMsIGV4ZWNsZW4pOwogICBjcCArPSBleGVjbGVuOwogICAqY3ArKyA9IFZHX0NMT19TRVA7CgogICAqY3AgPSAnXDAnOwoKICAgcmV0dXJuIG9wdHZhcjsKfQoKLy8gQnVpbGQgIi9wcm9jL3NlbGYvZmQvPGV4ZWNmZD4iLgpDaGFyKiBWR18oYnVpbGRfY2hpbGRfZXhlbmFtZSkoIHZvaWQgKQp7CiAgIENoYXIqIGV4ZW5hbWUgPSBWR18oYXJlbmFfbWFsbG9jKShWR19BUl9DT1JFLCA2NCk7CiAgIHZnX2Fzc2VydChOVUxMICE9IGV4ZW5hbWUpOwogICBWR18oc3ByaW50ZikoZXhlbmFtZSwgIi9wcm9jL3NlbGYvZmQvJWQiLCB2Z2V4ZWNmZCk7CiAgIHJldHVybiBleGVuYW1lOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qPT09IEZpbGUgZGVzY3JpcHRvciBzZXR1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0qLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnN0YXRpYyB2b2lkIHNldHVwX2ZpbGVfZGVzY3JpcHRvcnModm9pZCkKewogICBzdHJ1Y3QgdmtpX3JsaW1pdCBybDsKCiAgIC8qIEdldCB0aGUgY3VycmVudCBmaWxlIGRlc2NyaXB0b3IgbGltaXRzLiAqLwogICBpZiAoVkdfKGdldHJsaW1pdCkoVktJX1JMSU1JVF9OT0ZJTEUsICZybCkgPCAwKSB7CiAgICAgIHJsLnJsaW1fY3VyID0gMTAyNDsKICAgICAgcmwucmxpbV9tYXggPSAxMDI0OwogICB9CgogICAvKiBXb3JrIG91dCB3aGVyZSB0byBtb3ZlIHRoZSBzb2Z0IGxpbWl0IHRvLiAqLwogICBpZiAocmwucmxpbV9jdXIgKyBWR19OX1JFU0VSVkVEX0ZEUyA8PSBybC5ybGltX21heCkgewogICAgICBybC5ybGltX2N1ciA9IHJsLnJsaW1fY3VyICsgVkdfTl9SRVNFUlZFRF9GRFM7CiAgIH0gZWxzZSB7CiAgICAgIHJsLnJsaW1fY3VyID0gcmwucmxpbV9tYXg7CiAgIH0KCiAgIC8qIFJlc2VydmUgc29tZSBmaWxlIGRlc2NyaXB0b3JzIGZvciBvdXIgdXNlLiAqLwogICBWR18oZmRfc29mdF9saW1pdCkgPSBybC5ybGltX2N1ciAtIFZHX05fUkVTRVJWRURfRkRTOwogICBWR18oZmRfaGFyZF9saW1pdCkgPSBybC5ybGltX2N1ciAtIFZHX05fUkVTRVJWRURfRkRTOwoKICAgLyogVXBkYXRlIHRoZSBzb2Z0IGxpbWl0LiAqLwogICBWR18oc2V0cmxpbWl0KShWS0lfUkxJTUlUX05PRklMRSwgJnJsKTsKCiAgIGlmICh2Z2V4ZWNmZCAhPSAtMSkKICAgICAgdmdleGVjZmQgPSBWR18oc2FmZV9mZCkoIHZnZXhlY2ZkICk7CiAgIGlmIChWR18oY2xleGVjZmQpICE9IC0xKQogICAgICBWR18oY2xleGVjZmQpID0gVkdfKHNhZmVfZmQpKCBWR18oY2xleGVjZmQpICk7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyo9PT0gYmFzZUJsb2NrOiBkZWZpbml0aW9uICsgc2V0dXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKSW50IFZHT0ZGXyhoZWxwZXJfdW5kZWZpbmVkX2luc3RydWN0aW9uKSA9IElOVkFMSURfT0ZGU0VUOwoKLyogTUFYX05PTkNPTVBBQ1RfSEVMUEVSUyBjYW4gYmUgaW5jcmVhc2VkIGVhc2lseS4gIElmIE1BWF9DT01QQUNUX0hFTFBFUlMgaXMKICogaW5jcmVhc2VkIHRvbyBtdWNoLCB0aGV5IHdvbid0IHJlYWxseSBiZSBjb21wYWN0IGFueSBtb3JlLi4uICovCiNkZWZpbmUgIE1BWF9DT01QQUNUX0hFTFBFUlMgICAgIDgKI2RlZmluZSAgTUFYX05PTkNPTVBBQ1RfSEVMUEVSUyAgNTAgCgovKiBGb3Igc3RvcmluZyB0b29sLXNwZWNpZmljIGhlbHBlcnMsIGRldGVybWluZWQgYXQgcnVudGltZS4gIFRoZSBhZGRyIAogKiBhbmQgb2Zmc2V0IGFycmF5cyB0b2dldGhlciBmb3JtIGEgKGFkZHIsIG9mZnNldCkgbWFwIHRoYXQgYWxsb3dzIGEgCiAqIGhlbHBlcidzIGJhc2VCbG9jayBvZmZzZXQgdG8gYmUgY29tcHV0ZWQgZnJvbSBpdHMgYWRkcmVzcy4gIEl0J3MgZG9uZSAKICogbGlrZSB0aGlzIHNvIENDQUxMcyBjYW4gdXNlIHRoZSBmdW5jdGlvbiBhZGRyZXNzIHJhdGhlciB0aGFuIGhhdmluZyB0bwogKiBtdWNrIGFyb3VuZCB3aXRoIG9mZnNldHMuICovCnN0YXRpYyBVSW50IFZHXyhuX2NvbXBhY3RfaGVscGVycykgICAgPSAwOwpzdGF0aWMgVUludCBWR18obl9ub25jb21wYWN0X2hlbHBlcnMpID0gMDsKc3RhdGljIEFkZHIgVkdfKGNvbXBhY3RfaGVscGVyX2FkZHJzKSAgW01BWF9DT01QQUNUX0hFTFBFUlNdOwpzdGF0aWMgSW50ICBWR18oY29tcGFjdF9oZWxwZXJfb2Zmc2V0cylbTUFYX0NPTVBBQ1RfSEVMUEVSU107CnN0YXRpYyBBZGRyIFZHXyhub25jb21wYWN0X2hlbHBlcl9hZGRycykgIFtNQVhfTk9OQ09NUEFDVF9IRUxQRVJTXTsKc3RhdGljIEludCAgVkdfKG5vbmNvbXBhY3RfaGVscGVyX29mZnNldHMpW01BWF9OT05DT01QQUNUX0hFTFBFUlNdOwoKLyogVGhpcyBpcyB0aGUgYWN0dWFsIGRlZm4gb2YgYmFzZWJsb2NrLiAqLwpVSW50IFZHXyhiYXNlQmxvY2spW1ZHX0JBU0VCTE9DS19XT1JEU107CgovKiBXb3Jkcy4gKi8Kc3RhdGljIEludCBiYUJfb2ZmID0gMDsKCgovKiBSZXR1cm5zIHRoZSBvZmZzZXQsIGluIHdvcmRzLiAqLwpJbnQgVkdfKGFsbG9jX0JhQikgKCBJbnQgd29yZHMgKQp7CiAgIEludCBvZmYgPSBiYUJfb2ZmOwogICBiYUJfb2ZmICs9IHdvcmRzOwogICBpZiAoYmFCX29mZiA+PSBWR19CQVNFQkxPQ0tfV09SRFMpCiAgICAgIFZHXyhjb3JlX3BhbmljKSggIlZHXyhhbGxvY19CYUIpOiBiYXNlQmxvY2sgaXMgdG9vIHNtYWxsIik7CgogICByZXR1cm4gb2ZmOyAgIAp9CgovKiBBbGlnbiBvZmZzZXQsIGluICpieXRlcyogKi8Kdm9pZCBWR18oYWxpZ25fQmFCKSAoIFVJbnQgYWxpZ24gKQp7CiAgIHZnX2Fzc2VydCgyID09IGFsaWduIHx8IDQgPT0gYWxpZ24gfHwgOCA9PSBhbGlnbiB8fCAxNiA9PSBhbGlnbik7CiAgIGJhQl9vZmYgKz0gIChhbGlnbi0xKTsKICAgYmFCX29mZiAmPSB+KGFsaWduLTEpOwp9CgovKiBBbGxvY2F0ZSAxIHdvcmQgaW4gYmFzZUJsb2NrIGFuZCBzZXQgaXQgdG8gdGhlIGdpdmVuIHZhbHVlLiAqLwpJbnQgVkdfKGFsbG9jX0JhQl8xX3NldCkgKCBBZGRyIGEgKQp7CiAgIEludCBvZmYgPSBWR18oYWxsb2NfQmFCKSgxKTsKICAgVkdfKGJhc2VCbG9jaylbb2ZmXSA9IChVSW50KWE7CiAgIHJldHVybiBvZmY7Cn0KCi8qIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGluIGNvbXBhY3RfaGVscGVyX2FkZHJzOyAgY29tcGFjdF9oZWxwZXJfb2Zmc2V0cyBpcwogICBmaWxsZWQgaW4gbGF0ZXIuICovCnZvaWQgVkdfKHJlZ2lzdGVyX2NvbXBhY3RfaGVscGVyKShBZGRyIGEpCnsKICAgaWYgKE1BWF9DT01QQUNUX0hFTFBFUlMgPD0gVkdfKG5fY29tcGFjdF9oZWxwZXJzKSkgewogICAgICBWR18ocHJpbnRmKSgiQ2FuIG9ubHkgcmVnaXN0ZXIgJWQgY29tcGFjdCBoZWxwZXJzXG4iLCAKICAgICAgICAgICAgICAgICAgTUFYX0NPTVBBQ1RfSEVMUEVSUyk7CiAgICAgIFZHXyhjb3JlX3BhbmljKSgiVG9vIG1hbnkgY29tcGFjdCBoZWxwZXJzIHJlZ2lzdGVyZWQiKTsKICAgfQogICBWR18oY29tcGFjdF9oZWxwZXJfYWRkcnMpW1ZHXyhuX2NvbXBhY3RfaGVscGVycyldID0gYTsKICAgVkdfKG5fY29tcGFjdF9oZWxwZXJzKSsrOwp9CgovKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiBpbiBub25jb21wYWN0X2hlbHBlcl9hZGRyczsgIG5vbmNvbXBhY3RfaGVscGVyX29mZnNldHMKICogaXMgZmlsbGVkIGluIGxhdGVyLgogKi8Kdm9pZCBWR18ocmVnaXN0ZXJfbm9uY29tcGFjdF9oZWxwZXIpKEFkZHIgYSkKewogICBpZiAoTUFYX05PTkNPTVBBQ1RfSEVMUEVSUyA8PSBWR18obl9ub25jb21wYWN0X2hlbHBlcnMpKSB7CiAgICAgIFZHXyhwcmludGYpKCJDYW4gb25seSByZWdpc3RlciAlZCBub24tY29tcGFjdCBoZWxwZXJzXG4iLCAKICAgICAgICAgICAgICAgICAgTUFYX05PTkNPTVBBQ1RfSEVMUEVSUyk7CiAgICAgIFZHXyhwcmludGYpKCJUcnkgaW5jcmVhc2luZyBNQVhfTk9OX0NPTVBBQ1RfSEVMUEVSU1xuIik7CiAgICAgIFZHXyhjb3JlX3BhbmljKSgiVG9vIG1hbnkgbm9uLWNvbXBhY3QgaGVscGVycyByZWdpc3RlcmVkIik7CiAgIH0KICAgVkdfKG5vbmNvbXBhY3RfaGVscGVyX2FkZHJzKVtWR18obl9ub25jb21wYWN0X2hlbHBlcnMpXSA9IGE7CiAgIFZHXyhuX25vbmNvbXBhY3RfaGVscGVycykrKzsKfQoKLyogQWxsb2NhdGUgb2Zmc2V0cyBpbiBiYXNlQmxvY2sgZm9yIHRoZSB0b29sIGhlbHBlcnMgKi8Kc3RhdGljIAp2b2lkIGFzc2lnbl9oZWxwZXJzX2luX2Jhc2VCbG9jayhVSW50IG4sIEludCBvZmZzZXRzW10sIEFkZHIgYWRkcnNbXSkKewogICBVSW50IGk7CiAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIAogICAgICBvZmZzZXRzW2ldID0gVkdfKGFsbG9jX0JhQl8xX3NldCkoIGFkZHJzW2ldICk7Cn0KCkJvb2wgVkdfKG5lZWRfdG9faGFuZGxlX2VzcF9hc3NpZ25tZW50KSh2b2lkKQp7CiAgIHJldHVybiAoIFZHXyhkZWZpbmVkX25ld19tZW1fc3RhY2tfNCkoKSAgfHwKICAgICAgICAgICAgVkdfKGRlZmluZWRfZGllX21lbV9zdGFja180KSgpICB8fAogICAgICAgICAgICBWR18oZGVmaW5lZF9uZXdfbWVtX3N0YWNrXzgpKCkgIHx8CiAgICAgICAgICAgIFZHXyhkZWZpbmVkX2RpZV9tZW1fc3RhY2tfOCkoKSAgfHwKICAgICAgICAgICAgVkdfKGRlZmluZWRfbmV3X21lbV9zdGFja18xMikoKSB8fAogICAgICAgICAgICBWR18oZGVmaW5lZF9kaWVfbWVtX3N0YWNrXzEyKSgpIHx8CiAgICAgICAgICAgIFZHXyhkZWZpbmVkX25ld19tZW1fc3RhY2tfMTYpKCkgfHwKICAgICAgICAgICAgVkdfKGRlZmluZWRfZGllX21lbV9zdGFja18xNikoKSB8fAogICAgICAgICAgICBWR18oZGVmaW5lZF9uZXdfbWVtX3N0YWNrXzMyKSgpIHx8CiAgICAgICAgICAgIFZHXyhkZWZpbmVkX2RpZV9tZW1fc3RhY2tfMzIpKCkgfHwKICAgICAgICAgICAgVkdfKGRlZmluZWRfbmV3X21lbV9zdGFjaykoKSAgICB8fAogICAgICAgICAgICBWR18oZGVmaW5lZF9kaWVfbWVtX3N0YWNrKSgpCiAgICAgICAgICApOwp9CgovLyBUaGUgbG93L2hpZ2ggc3BsaXQgaXMgZm9yIHg4Niwgc28gdGhhdCB0aGUgbW9yZSBjb21tb24gaGVscGVycyBjYW4gYmUKLy8gaW4gdGhlIGZpcnN0IDEyOCBieXRlcyBvZiB0aGUgc3RhcnQsIHdoaWNoIGFsbG93cyB0aGUgdXNlIG9mIGEgbW9yZQovLyBjb21wYWN0IGFkZHJlc3NpbmcgbW9kZS4Kc3RhdGljIHZvaWQgaW5pdF9iYXNlQmxvY2sgKCBBZGRyIGNsaWVudF9laXAsIEFkZHIgZXNwX2F0X3N0YXJ0dXAgKQp7CiAgIFZHQV8oaW5pdF9sb3dfYmFzZUJsb2NrKShjbGllbnRfZWlwLCBlc3BfYXRfc3RhcnR1cCk7CgogICAvKiBBbGxvY2F0ZSBzbG90cyBmb3IgY29tcGFjdCBoZWxwZXJzICovCiAgIGFzc2lnbl9oZWxwZXJzX2luX2Jhc2VCbG9jayhWR18obl9jb21wYWN0X2hlbHBlcnMpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZHXyhjb21wYWN0X2hlbHBlcl9vZmZzZXRzKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWR18oY29tcGFjdF9oZWxwZXJfYWRkcnMpKTsKCiAgIFZHQV8oaW5pdF9oaWdoX2Jhc2VCbG9jaykoY2xpZW50X2VpcCwgZXNwX2F0X3N0YXJ0dXApOwoKI2RlZmluZSBSRUcoa2luZCwgc2l6ZSkgXAogICBpZiAoVkdfKGRlZmluZWRfIyNraW5kIyNfbWVtX3N0YWNrIyNzaXplKSgpKSBcCiAgICAgIFZHXyhyZWdpc3Rlcl9ub25jb21wYWN0X2hlbHBlcikoICAgICAgICAgICBcCiAgICAgICAgICAoQWRkcikgVkdfKHRvb2xfaW50ZXJmYWNlKS50cmFja18jI2tpbmQjI19tZW1fc3RhY2sjI3NpemUgKTsKICAgUkVHKG5ldywgXzgpOwogICBSRUcobmV3LCBfMTIpOwogICBSRUcobmV3LCBfMTYpOwogICBSRUcobmV3LCBfMzIpOwogICBSRUcobmV3LCApOwogICBSRUcoZGllLCBfOCk7CiAgIFJFRyhkaWUsIF8xMik7CiAgIFJFRyhkaWUsIF8xNik7CiAgIFJFRyhkaWUsIF8zMik7CiAgIFJFRyhkaWUsICk7CiN1bmRlZiBSRUcKCiAgIGlmIChWR18obmVlZF90b19oYW5kbGVfZXNwX2Fzc2lnbm1lbnQpKCkpCiAgICAgIFZHXyhyZWdpc3Rlcl9ub25jb21wYWN0X2hlbHBlcikoKEFkZHIpIFZHXyh1bmtub3duX2VzcF91cGRhdGUpKTsKCiAgIFZHT0ZGXyhoZWxwZXJfdW5kZWZpbmVkX2luc3RydWN0aW9uKQogICAgICA9IFZHXyhhbGxvY19CYUJfMV9zZXQpKCAoQWRkcikgJiBWR18oaGVscGVyX3VuZGVmaW5lZF9pbnN0cnVjdGlvbikpOwoKICAgLyogQWxsb2NhdGUgc2xvdHMgZm9yIG5vbmNvbXBhY3QgaGVscGVycyAqLwogICBhc3NpZ25faGVscGVyc19pbl9iYXNlQmxvY2soVkdfKG5fbm9uY29tcGFjdF9oZWxwZXJzKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWR18obm9uY29tcGFjdF9oZWxwZXJfb2Zmc2V0cyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkdfKG5vbmNvbXBhY3RfaGVscGVyX2FkZHJzKSk7Cn0KCi8vIEZpbmRzIHRoZSBiYXNlQmxvY2sgb2Zmc2V0IG9mIGEgdG9vbC1zcGVjaWZpZWQgaGVscGVyLgovLyBTZWFyY2hlcyB0aHJvdWdoIGNvbXBhY3RzIGZpcnN0LCB0aGVuIG5vbi1jb21wYWN0cy4KSW50IFZHXyhoZWxwZXJfb2Zmc2V0KShBZGRyIGEpCnsKICAgVUludCBpOwogICBDaGFyIGJ1ZlsxMDBdOwoKICAgZm9yIChpID0gMDsgaSA8IFZHXyhuX2NvbXBhY3RfaGVscGVycyk7IGkrKykKICAgICAgaWYgKFZHXyhjb21wYWN0X2hlbHBlcl9hZGRycylbaV0gPT0gYSkKICAgICAgICAgcmV0dXJuIFZHXyhjb21wYWN0X2hlbHBlcl9vZmZzZXRzKVtpXTsKICAgZm9yIChpID0gMDsgaSA8IFZHXyhuX25vbmNvbXBhY3RfaGVscGVycyk7IGkrKykKICAgICAgaWYgKFZHXyhub25jb21wYWN0X2hlbHBlcl9hZGRycylbaV0gPT0gYSkKICAgICAgICAgcmV0dXJuIFZHXyhub25jb21wYWN0X2hlbHBlcl9vZmZzZXRzKVtpXTsKCiAgIC8qIFNob3VsZG4ndCBnZXQgaGVyZSAqLwogICBWR18oZ2V0X2ZubmFtZSkgICAoIGEsIGJ1ZiwgMTAwICk7CgogICBWR18ocHJpbnRmKSgKICAgICAgIlxuQ291bGRuJ3QgZmluZCBvZmZzZXQgb2YgaGVscGVyIGZyb20gaXRzIGFkZHJlc3MgKCVwOiAlcykuXG4iCiAgICAgICJBIGhlbHBlciBmdW5jdGlvbiBwcm9iYWJseSB1c2VkIGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQ/XG5cbiIsIGEsIGJ1Zik7CgogICBWR18ocHJpbnRmKSgiICAgICAgY29tcGFjdCBoZWxwZXJzOiAiKTsKICAgZm9yIChpID0gMDsgaSA8IFZHXyhuX2NvbXBhY3RfaGVscGVycyk7IGkrKykKICAgICAgVkdfKHByaW50ZikoIiVwICIsIFZHXyhjb21wYWN0X2hlbHBlcl9hZGRycylbaV0pOwoKICAgVkdfKHByaW50ZikoIlxuICBub24tY29tcGFjdCBoZWxwZXJzOiAiKTsKICAgZm9yIChpID0gMDsgaSA8IFZHXyhuX25vbmNvbXBhY3RfaGVscGVycyk7IGkrKykKICAgICAgVkdfKHByaW50ZikoIiVwICIsIFZHXyhub25jb21wYWN0X2hlbHBlcl9hZGRycylbaV0pOwoKICAgVkdfKHByaW50ZikoIlxuIik7CiAgIFZHXyhza2luX3BhbmljKSgiVW5mb3VuZCBoZWxwZXIiKTsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKj09PSAgSW5pdGlhbGlzZSBwcm9ncmFtIGRhdGEvdGV4dCwgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgPT09Ki8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpzdGF0aWMgdm9pZCBidWlsZF92YWxncmluZF9tYXBfY2FsbGJhY2sgCiAgICAgICggQWRkciBzdGFydCwgVUludCBzaXplLCBDaGFyIHJyLCBDaGFyIHd3LCBDaGFyIHh4LCAKICAgICAgICBVSW50IGRldiwgVUludCBpbm8sIFVMb25nIGZvZmZzZXQsIGNvbnN0IFVDaGFyKiBmaWxlbmFtZSApCnsKICAgVUludCBwcm90ICA9IDA7CiAgIFVJbnQgZmxhZ3MgPSBTRl9NTUFQfFNGX05PU1lNUzsKICAgQm9vbCBpc19zdGFja19zZWdtZW50OwoKICAgaXNfc3RhY2tfc2VnbWVudCA9IAogICAgICAoc3RhcnQgPT0gVkdfKGNsc3RrX2Jhc2UpICYmIChzdGFydCtzaXplKSA9PSBWR18oY2xzdGtfZW5kKSk7CgogICAvKiBPbmx5IHJlY29yZCB2YWxncmluZCBtYXBwaW5ncyBmb3Igbm93LCB3aXRob3V0IGxvYWRpbmcgYW55CiAgICAgIHN5bWJvbHMuICBUaGlzIGlzIHNvIHdlIGtub3cgd2hlcmUgdGhlIGZyZWUgc3BhY2UgaXMgYmVmb3JlIHdlCiAgICAgIHN0YXJ0IGFsbG9jYXRpbmcgbW9yZSBtZW1vcnkgKG5vdGU6IGhlYXAgaXMgT0ssIGl0J3MganVzdCBtbWFwCiAgICAgIHdoaWNoIGlzIHRoZSBwcm9ibGVtIGhlcmUpLiAqLwogICBpZiAoc3RhcnQgPj0gVkdfKHZhbGdyaW5kX2Jhc2UpICYmIChzdGFydCtzaXplLTEpIDw9IFZHXyh2YWxncmluZF9sYXN0KSkgewogICAgICBmbGFncyB8PSBTRl9WQUxHUklORDsKICAgICAgVkdfKG1hcF9maWxlX3NlZ21lbnQpKHN0YXJ0LCBzaXplLCBwcm90LCBmbGFncywgZGV2LCBpbm8sIGZvZmZzZXQsIGZpbGVuYW1lKTsKICAgfQp9CgovLyBHbG9iYWwgdmFyIHVzZWQgdG8gcGFzcyBsb2NhbCBkYXRhIHRvIGNhbGxiYWNrCkFkZHIgZXNwX2F0X3N0YXJ0dXBfX19nbG9iYWxfYXJnID0gMDsKCnN0YXRpYyB2b2lkIGJ1aWxkX3NlZ21lbnRfbWFwX2NhbGxiYWNrIAogICAgICAoIEFkZHIgc3RhcnQsIFVJbnQgc2l6ZSwgQ2hhciByciwgQ2hhciB3dywgQ2hhciB4eCwKICAgICAgICBVSW50IGRldiwgVUludCBpbm8sIFVMb25nIGZvZmZzZXQsIGNvbnN0IFVDaGFyKiBmaWxlbmFtZSApCnsKICAgVUludCBwcm90ID0gMDsKICAgVUludCBmbGFnczsKICAgQm9vbCBpc19zdGFja19zZWdtZW50OwogICBBZGRyIHJfZXNwOwoKICAgaXNfc3RhY2tfc2VnbWVudCAKICAgICAgPSAoc3RhcnQgPT0gVkdfKGNsc3RrX2Jhc2UpICYmIChzdGFydCtzaXplKSA9PSBWR18oY2xzdGtfZW5kKSk7CgogICBpZiAocnIgPT0gJ3InKSBwcm90IHw9IFZLSV9QUk9UX1JFQUQ7CiAgIGlmICh3dyA9PSAndycpIHByb3QgfD0gVktJX1BST1RfV1JJVEU7CiAgIGlmICh4eCA9PSAneCcpIHByb3QgfD0gVktJX1BST1RfRVhFQzsKCiAgIGlmIChpc19zdGFja19zZWdtZW50KQogICAgICBmbGFncyA9IFNGX1NUQUNLIHwgU0ZfR1JPV0RPV047CiAgIGVsc2UKICAgICAgZmxhZ3MgPSBTRl9FWEVDfFNGX01NQVA7CgogICBpZiAoZmlsZW5hbWUgIT0gTlVMTCkKICAgICAgZmxhZ3MgfD0gU0ZfRklMRTsKCiAgIGlmIChzdGFydCA+PSBWR18odmFsZ3JpbmRfYmFzZSkgJiYgKHN0YXJ0K3NpemUtMSkgPD0gVkdfKHZhbGdyaW5kX2xhc3QpKQogICAgICBmbGFncyB8PSBTRl9WQUxHUklORDsKCiAgIFZHXyhtYXBfZmlsZV9zZWdtZW50KShzdGFydCwgc2l6ZSwgcHJvdCwgZmxhZ3MsIGRldiwgaW5vLCBmb2Zmc2V0LCBmaWxlbmFtZSk7CgogICBpZiAoVkdfKGlzX2NsaWVudF9hZGRyKShzdGFydCkgJiYgVkdfKGlzX2NsaWVudF9hZGRyKShzdGFydCtzaXplLTEpKQogICAgICBWR19UUkFDSyggbmV3X21lbV9zdGFydHVwLCBzdGFydCwgc2l6ZSwgcnI9PSdyJywgd3c9PSd3JywgeHg9PSd4JyApOwoKICAgLyogSWYgdGhpcyBpcyB0aGUgc3RhY2sgc2VnbWVudCBtYXJrIGFsbCBiZWxvdyAlZXNwIGFzIG5vYWNjZXNzLiAqLwogICByX2VzcCA9IGVzcF9hdF9zdGFydHVwX19fZ2xvYmFsX2FyZzsKICAgdmdfYXNzZXJ0KDAgIT0gcl9lc3ApOwogICBpZiAoaXNfc3RhY2tfc2VnbWVudCkgewogICAgICBpZiAoMCkKICAgICAgICAgVkdfKG1lc3NhZ2UpKFZnX0RlYnVnTXNnLCAiaW52YWxpZGF0aW5nIHN0YWNrIGFyZWE6ICV4IC4uICV4IiwKICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LHJfZXNwKTsKICAgICAgVkdfVFJBQ0soIGRpZV9tZW1fc3RhY2ssIHN0YXJ0LCByX2VzcC1zdGFydCApOwogICB9Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyo9PT0gU2FuaXR5IGNoZWNrIG1hY2hpbmVyeSAocGVybWFuZW50bHkgZW5nYWdlZCkgICAgICAgICAgICAgICAgID09PSovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyogQSBmYXN0IHNhbml0eSBjaGVjayAtLSBzdWl0YWJsZSBmb3IgY2FsbGluZyBjaXJjYSBvbmNlIHBlcgogICBtaWxsaXNlY29uZC4gKi8KCnZvaWQgVkdfKHNhbml0eV9jaGVja19nZW5lcmFsKSAoIEJvb2wgZm9yY2VfZXhwZW5zaXZlICkKewogICBWR1BfUFVTSENDKFZncENvcmVDaGVhcFNhbml0eSk7CgogICBpZiAoVkdfKGNsb19zYW5pdHlfbGV2ZWwpIDwgMSkgcmV0dXJuOwoKICAgLyogLS0tIEZpcnN0IGRvIGFsbCB0aGUgdGVzdHMgdGhhdCB3ZSBjYW4gZG8gcXVpY2tseS4gLS0tKi8KCiAgIHNhbml0eV9mYXN0X2NvdW50Kys7CgogICAvKiBDaGVjayBzdHVmZiBwZXJ0YWluaW5nIHRvIHRoZSBtZW1vcnkgY2hlY2sgc3lzdGVtLiAqLwoKICAgLyogQ2hlY2sgdGhhdCBub2JvZHkgaGFzIHNwdXJpb3VzbHkgY2xhaW1lZCB0aGF0IHRoZSBmaXJzdCBvcgogICAgICBsYXN0IDE2IHBhZ2VzIG9mIG1lbW9yeSBoYXZlIGJlY29tZSBhY2Nlc3NpYmxlIFsuLi5dICovCiAgIGlmIChWR18obmVlZHMpLnNhbml0eV9jaGVja3MpIHsKICAgICAgVkdQX1BVU0hDQyhWZ3BTa2luQ2hlYXBTYW5pdHkpOwogICAgICB2Z19hc3NlcnQoU0tfKGNoZWFwX3Nhbml0eV9jaGVjaykoKSk7CiAgICAgIFZHUF9QT1BDQyhWZ3BTa2luQ2hlYXBTYW5pdHkpOwogICB9CgogICAvKiAtLS0gTm93IHNvbWUgbW9yZSBleHBlbnNpdmUgY2hlY2tzLiAtLS0qLwoKICAgLyogT25jZSBldmVyeSAyNSB0aW1lcywgY2hlY2sgc29tZSBtb3JlIGV4cGVuc2l2ZSBzdHVmZi4gKi8KICAgaWYgKCBmb3JjZV9leHBlbnNpdmUKICAgICB8fCBWR18oY2xvX3Nhbml0eV9sZXZlbCkgPiAxCiAgICAgfHwgKFZHXyhjbG9fc2FuaXR5X2xldmVsKSA9PSAxICYmIChzYW5pdHlfZmFzdF9jb3VudCAlIDI1KSA9PSAwKSkgewoKICAgICAgVkdQX1BVU0hDQyhWZ3BDb3JlRXhwZW5zaXZlU2FuaXR5KTsKICAgICAgc2FuaXR5X3Nsb3dfY291bnQrKzsKCiAgICAgIFZHXyhzYW5pdHlfY2hlY2tfcHJveHkpKCk7CgojICAgICBpZiAwCiAgICAgIHsgdm9pZCB6enptZW1zY2FuKHZvaWQpOyB6enptZW1zY2FuKCk7IH0KIyAgICAgZW5kaWYKCiAgICAgIGlmICgoc2FuaXR5X2Zhc3RfY291bnQgJSAyNTApID09IDApCiAgICAgICAgIFZHXyhzYW5pdHlfY2hlY2tfdHRfdGMpKCk7CgogICAgICBpZiAoVkdfKG5lZWRzKS5zYW5pdHlfY2hlY2tzKSB7CiAgICAgICAgICBWR1BfUFVTSENDKFZncFNraW5FeHBlbnNpdmVTYW5pdHkpOwogICAgICAgICAgdmdfYXNzZXJ0KFNLXyhleHBlbnNpdmVfc2FuaXR5X2NoZWNrKSgpKTsKICAgICAgICAgIFZHUF9QT1BDQyhWZ3BTa2luRXhwZW5zaXZlU2FuaXR5KTsKICAgICAgfQogICAgICAvKiAKICAgICAgaWYgKChzYW5pdHlfZmFzdF9jb3VudCAlIDUwMCkgPT0gMCkgVkdfKG1hbGxvY1Nhbml0eUNoZWNrQWxsKSgpOyAKICAgICAgKi8KICAgICAgVkdQX1BPUENDKFZncENvcmVFeHBlbnNpdmVTYW5pdHkpOwogICB9CgogICBpZiAoVkdfKGNsb19zYW5pdHlfbGV2ZWwpID4gMSkgewogICAgICBWR1BfUFVTSENDKFZncENvcmVFeHBlbnNpdmVTYW5pdHkpOwogICAgICAvKiBDaGVjayBzYW5pdHkgb2YgdGhlIGxvdy1sZXZlbCBtZW1vcnkgbWFuYWdlci4gIE5vdGUgdGhhdCBidWdzCiAgICAgICAgIGluIHRoZSBjbGllbnQncyBjb2RlIGNhbiBjYXVzZSB0aGlzIHRvIGZhaWwsIHNvIHdlIGRvbid0IGRvCiAgICAgICAgIHRoaXMgY2hlY2sgdW5sZXNzIHNwZWNpYWxseSBhc2tlZCBmb3IuICBBbmQgYmVjYXVzZSBpdCdzCiAgICAgICAgIHBvdGVudGlhbGx5IHZlcnkgZXhwZW5zaXZlLiAqLwogICAgICBWR18oc2FuaXR5X2NoZWNrX21hbGxvY19hbGwpKCk7CiAgICAgIFZHUF9QT1BDQyhWZ3BDb3JlRXhwZW5zaXZlU2FuaXR5KTsKICAgfQogICBWR1BfUE9QQ0MoVmdwQ29yZUNoZWFwU2FuaXR5KTsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKj09PSBtYWluKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09Ki8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKgogIFRoaXMgY29kZSBkZWNpZGVzIG9uIHRoZSBsYXlvdXQgb2YgdGhlIGNsaWVudCBhbmQgVmFsZ3JpbmQgYWRkcmVzcwogIHNwYWNlcywgbG9hZHMgdmFsZ3JpbmQuc28gYW5kIHRoZSB0b29sLnNvIGludG8gdGhlIHZhbGdyaW5kIHBhcnQsCiAgbG9hZHMgdGhlIGNsaWVudCBleGVjdXRhYmxlIChhbmQgdGhlIGR5bmFtaWMgbGlua2VyLCBpZiBuZWNlc3NhcnkpCiAgaW50byB0aGUgY2xpZW50IHBhcnQsIGFuZCBjYWxscyBpbnRvIFZhbGdyaW5kIHByb3Blci4KCiAgVGhlIGNvZGUgaXMgY2FyZWZ1bCBub3QgdG8gYWxsb3cgc3B1cmlvdXMgbWFwcGluZ3MgdG8gYXBwZWFyIGluIHRoZQogIHdyb25nIHBhcnRzIG9mIHRoZSBhZGRyZXNzIHNwYWNlLiAgSW4gcGFydGljdWxhciwgdG8gbWFrZSBzdXJlCiAgZGxvcGVuIHB1dHMgdGhpbmdzIGluIHRoZSByaWdodCBwbGFjZSwgaXQgd2lsbCBwYWQgb3V0IHRoZSBmb3JiaWRkZW4KICBjaHVua3Mgb2YgYWRkcmVzcyBzcGFjZSBzbyB0aGF0IGRsb3BlbiBpcyBmb3JjZWQgdG8gcHV0IHRoaW5ncyB3aGVyZQogIHdlIHdhbnQgdGhlbS4KCiAgVGhlIG1lbW9yeSBtYXAgaXQgY3JlYXRlcyBpczoKCiAgQ0xJRU5UX0JBU0UgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICAgICAgICAgICAgICAgfCBjbGllbnQgYWRkcmVzcyBzcGFjZSAgICB8CgkgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgIDoKCSAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgOgoJCSB8IGNsaWVudCBzdGFjayAgICAgICAgICAgIHwKICBjbGllbnRfZW5kICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgICAgICAgICAgICAgICB8IHJlZHpvbmUgICAgICAgICAgICAgICAgIHwKICBzaGFkb3dfYmFzZSAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwKCSAgICAgICAgIDogc2hhZG93IG1lbW9yeSBmb3IgdG9vbHMgOgoJICAgICAgICAgfCAobWF5IGJlIDAgc2l6ZWQpICAgICAgICB8CiAgc2hhZG93X2VuZCAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgdmFsZ3JpbmRfYmFzZSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICAgICAgICAgICAgICAgfCBraWNrc3RhcnQgZXhlY3V0YWJsZSAgICB8CiAgICAgICAgICAgICAgICAgfCB2YWxncmluZCBoZWFwICB2dnZ2dnZ2dnZ8IChiYXJlbHkgdXNlZCkKICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgIC0KICAgICAgICAgICAgICAgICB8IHZhbGdyaW5kIC5zbyBmaWxlcyAgICAgIHwKCQkgfCBhbmQgbWFwcGluZ3MgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAtCiAgICAgICAgICAgICAgICAgfCB2YWxncmluZCBzdGFjayBeXl5eXl5eXl58CiAgdmFsZ3JpbmRfbGFzdCAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkJIDoga2VybmVsICAgICAgICAgICAgICAgICAgOgoKICBOYjogQmVmb3JlIHdlIGNhbiBkbyBnZW5lcmFsIGFsbG9jYXRpb25zIHdpdGggVkdfKGFyZW5hX21hbGxvYykoKSBhbmQKICBWR18obW1hcCkoKSwgd2UgbmVlZCB0byBidWlsZCB0aGUgc2VnbWVudCBza2lwLWxpc3QsIHNvIHdlIGtub3cgd2hlcmUKICB3ZSBjYW4gcHV0IHRoaW5ncy4gIEhvd2V2ZXIsIGJ1aWxkaW5nIHRoYXQgc3RydWN0dXJlIHJlcXVpcmVzCiAgYWxsb2NhdGluZyBtZW1vcnkuICBTbyB3ZSBuZWVkIHRvIGEgYm9vdHN0cmFwcGluZyBwcm9jZXNzLiAgSXQncyBkb25lCiAgYnkgbWFraW5nIFZHXyhhcmVuYV9tYWxsb2MpKCkgaGF2ZSBhIHNwZWNpYWwgc3RhdGljIHN1cGVyYmxvY2sgdGhhdCdzCiAgdXNlZCBmb3IgdGhlIGZpcnN0IDFNQidzIHdvcnRoIG9mIGFsbG9jYXRpb25zLiAgVGhpcyBpcyBlbm91Z2ggdG8KICBidWlsZCB0aGUgc2VnbWVudCBza2lwLWxpc3QuCiovCgpzdGF0aWMgaW50IHBybWFwKGNoYXIgKnN0YXJ0LCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKnBlcm0sIG9mZl90IG9mZiwgCiAgICAgICAgICAgICAgICAgaW50IG1haiwgaW50IG1pbiwgaW50IGlubywgdm9pZCogZHVtbXkpIHsKICAgcHJpbnRmKCJtYXBwaW5nICUxMHAtJTEwcCAlcyAlMDJ4OiUwMnggJWRcbiIsCiAgICAgICAgICBzdGFydCwgZW5kLCBwZXJtLCBtYWosIG1pbiwgaW5vKTsKICAgcmV0dXJuIFRydWU7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewogICBjaGFyICoqY2xfYXJndjsKICAgY29uc3QgY2hhciAqdG9vbCA9IE5VTEw7CiAgIGNvbnN0IGNoYXIgKmV4ZWMgPSBOVUxMOwogICBjaGFyICpwcmVsb2FkOyAgICAgICAgICAvKiB0b29sLXNwZWNpZmljIExEX1BSRUxPQUQgLnNvICovCiAgIGNoYXIgKiplbnY7CiAgIEludCBuZWVkX2hlbHAgPSAwOyAgICAgIC8vIDAgPSBubywgMSA9IC0taGVscCwgMiA9IC0taGVscC1kZWJ1ZwogICBzdHJ1Y3QgZXhlaW5mbyBpbmZvOwogICBUb29sSW5mbyAqdG9vbGluZm8gPSBOVUxMOwogICB2b2lkICp0b29sX2RsaGFuZGxlOwogICBBZGRyIGNsaWVudF9laXA7CiAgIEFkZHIgZXNwX2F0X3N0YXJ0dXA7ICAgIC8qIGNsaWVudCdzICVlc3AgYXQgdGhlIHBvaW50IHdlIGdhaW5lZCBjb250cm9sLiAqLwogICBVSW50ICogY2xpZW50X2F1eHY7CiAgIFZnU2NoZWRSZXR1cm5Db2RlIHNyYzsKICAgSW50IGV4aXRjb2RlID0gMDsKICAgSW50IGZhdGFsX3NpZ05vID0gLTE7CiAgIHZraV9ybGltaXQgemVybyA9IHsgMCwgMCB9OwogICBJbnQgcGFkZmlsZTsKICAgVGhyZWFkSWQgbGFzdF9ydW5fdGlkID0gMDsgICAgLy8gTGFzdCB0aHJlYWQgdGhlIHNjaGVkdWxlciByYW4uCgoKICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgLy8gTmI6IHN0YXJ0dXAgaXMgY29tcGxleC4gIFByZXJlcXVpc2l0ZXMgYXJlIHNob3duIGF0IGV2ZXJ5IHN0ZXAuCiAgIC8vCiAgIC8vICoqKiBCZSB2ZXJ5IGNhcmVmdWwgd2hlbiBtZXNzaW5nIHdpdGggdGhlIG9yZGVyICoqKgogICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgLy8gQ29tbWFuZCBsaW5lIGFyZ3VtZW50IGhhbmRsaW5nIG9yZGVyOgogICAvLyAqIElmIC0taGVscC8tLWhlbHAtZGVidWcgYXJlIHByZXNlbnQsIHNob3cgdXNhZ2UgbWVzc2FnZSAKICAgLy8gICAoaWYgLS10b29sIGlzIGFsc28gcHJlc2VudCwgdGhhdCBpbmNsdWRlcyB0aGUgdG9vbC1zcGVjaWZpYyB1c2FnZSkKICAgLy8gKiBUaGVuLCBpZiAtLXRvb2wgaXMgbWlzc2luZywgYWJvcnQgd2l0aCBlcnJvciBtc2cKICAgLy8gKiBUaGVuLCBpZiBjbGllbnQgaXMgbWlzc2luZywgYWJvcnQgd2l0aCBlcnJvciBtc2cKICAgLy8gKiBUaGVuLCBpZiBhbnkgY21kbGluZSBhcmdzIGFyZSBiYWQsIGFib3J0IHdpdGggZXJyb3IgbXNnCiAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAvLyBHZXQgdGhlIGN1cnJlbnQgcHJvY2VzcyBkYXRhc2l6ZSBybGltaXQsIGFuZCBzZXQgaXQgdG8gemVyby4KICAgLy8gVGhpcyBwcmV2ZW50cyBhbnkgaW50ZXJuYWwgdXNlcyBvZiBicmsoKSBmcm9tIGhhdmluZyBhbnkgZWZmZWN0LgogICAvLyBXZSByZW1lbWJlciB0aGUgb2xkIHZhbHVlIHNvIHdlIGNhbiByZXN0b3JlIGl0IG9uIGV4ZWMsIHNvIHRoYXQKICAgLy8gY2hpbGQgcHJvY2Vzc2VzIHdpbGwgaGF2ZSBhIHJlYXNvbmFibGUgYnJrIHZhbHVlLgogICBWR18oZ2V0cmxpbWl0KShWS0lfUkxJTUlUX0RBVEEsICZWR18oY2xpZW50X3JsaW1pdF9kYXRhKSk7CiAgIHplcm8ucmxpbV9tYXggPSBWR18oY2xpZW50X3JsaW1pdF9kYXRhKS5ybGltX21heDsKICAgVkdfKHNldHJsaW1pdCkoVktJX1JMSU1JVF9EQVRBLCAmemVybyk7CgogICAvLyBHZXQgdGhlIGN1cnJlbnQgcHJvY2VzcyBzdGFjayBybGltaXQuCiAgIFZHXyhnZXRybGltaXQpKFZLSV9STElNSVRfU1RBQ0ssICZWR18oY2xpZW50X3JsaW1pdF9zdGFjaykpOwoKICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBDaGVjayB3ZSB3ZXJlIGxhdW5jaGVkIGJ5IHN0YWdlMQogICAvLyAgIHA6IG4vYQogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHsKICAgICAgdm9pZCogaW5pdF9zcCA9IGFyZ3YgLSAxOwogICAgICBwYWRmaWxlID0gc2Nhbl9hdXh2KGluaXRfc3ApOwogICB9CgogICBpZiAoMCkgewogICAgICBwcmludGYoIj09PT09PT09PT0gbWFpbigpID09PT09PT09PT1cbiIpOwogICAgICBmb3JlYWNoX21hcChwcm1hcCwgLypkdW1teSovTlVMTCk7CiAgIH0KCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLy8gTG9vayBmb3IgYWx0ZXJuYXRpdmUgbGliZGlyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAvLyAgIHA6IG4vYQogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHsgIGNoYXIgKmNwID0gZ2V0ZW52KFZBTEdSSU5ETElCKTsKICAgICAgaWYgKGNwICE9IE5VTEwpCgkgVkdfKGxpYmRpcikgPSBjcDsKICAgfQoKICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBHZXQgdmFsZ3JpbmQgYXJncyArIGNsaWVudCBhcmdzIChpbmMuIGZyb20gVkFMR1JJTkRfT1BUUy8udmFsZ3JpbmRyYykuCiAgIC8vIFByZS1wcm9jZXNzIHRoZSBjb21tYW5kIGxpbmUuCiAgIC8vICAgcDogbi9hCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgZ2V0X2NvbW1hbmRfbGluZShhcmdjLCBhcmd2LCAmdmdfYXJnYywgJnZnX2FyZ3YsICZjbF9hcmd2KTsKICAgcHJlX3Byb2Nlc3NfY21kX2xpbmVfb3B0aW9ucygmbmVlZF9oZWxwLCAmdG9vbCwgJmV4ZWMpOwoKICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAvLyBOYjogb25jZSBhIHRvb2wgaXMgc3BlY2lmaWVkLCB0aGUgdG9vbC5zbyBtdXN0IGJlIGxvYWRlZCBldmVuIGlmIAogICAvLyB0aGV5IHNwZWNpZmllZCAtLWhlbHAgb3IgZGlkbid0IHNwZWNpZnkgYSBjbGllbnQgcHJvZ3JhbS4KICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBXaXRoIGNsaWVudCBwYWRkZWQgb3V0LCBtYXAgaW4gdG9vbAogICAvLyAgIHA6IHNldC1saWJkaXIgICAgICAgICAgICAgICAgICAgICBbZm9yIFZHXyhsaWJkaXIpXQogICAvLyAgIHA6IHByZV9wcm9jZXNzX2NtZF9saW5lX29wdGlvbnMoKSBbZm9yICd0b29sJ10KICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBsb2FkX3Rvb2wodG9vbCwgJnRvb2xfZGxoYW5kbGUsICZ0b29saW5mbywgJnByZWxvYWQpOwoKICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAvLyBDYW4gdXNlIFZHXyhtYWxsb2MpKCkgYW5kIFZHXyhhcmVuYV9tYWxsb2MpKCkgb25seSBhZnRlciBsb2FkX3Rvb2woKQogICAvLyAtLSByZWR6b25lIHNpemUgaXMgbm93IHNldC4gIFRoaXMgaXMgY2hlY2tlZCBieSB2Z19tYWxsb2MyLmMuCiAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLy8gRmluYWxpc2UgYWRkcmVzcyBzcGFjZSBsYXlvdXQKICAgLy8gICBwOiBsb2FkX3Rvb2woKSAgW2ZvciAndG9vbGluZm8nXQogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIGxheW91dF9yZW1haW5pbmdfc3BhY2UoIChBZGRyKSAmIGFyZ2MsIHRvb2xpbmZvLT5zaGFkb3dfcmF0aW8gKTsKCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLy8gTG9hZCBjbGllbnQgZXhlY3V0YWJsZSwgZmluZGluZyBpbiAkUEFUSCBpZiBuZWNlc3NhcnkKICAgLy8gICBwOiBwcmVfcHJvY2Vzc19jbWRfbGluZV9vcHRpb25zKCkgIFtmb3IgJ2V4ZWMnLCAnbmVlZF9oZWxwJ10KICAgLy8gICBwOiBsYXlvdXRfcmVtYWluaW5nX3NwYWNlICAgICAgICAgIFtzbyB0aGVyZSdzIHNwYWNlXQogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIGxvYWRfY2xpZW50KGNsX2FyZ3YsIGV4ZWMsIG5lZWRfaGVscCwgJmluZm8sICZjbGllbnRfZWlwKTsKCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLy8gRXZlcnl0aGluZyBpbiBwbGFjZSwgcmVtb3ZlIHBhZGRpbmcgZG9uZSBieSBzdGFnZTEKICAgLy8gICBwOiBsYXlvdXRfcmVtYWluaW5nX3NwYWNlKCkgIFtldmVyeXRoaW5nIG11c3QgYmUgbWFwcGVkIGluIGJlZm9yZSBub3ddICAKICAgLy8gICBwOiBsb2FkX2NsaWVudCgpICAgICAgICAgICAgIFtkaXR0b10gCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgYXNfdW5wYWQoKHZvaWQgKilWR18oc2hhZG93X2VuZCksICh2b2lkICopfjAsIHBhZGZpbGUpOwogICBhc19jbG9zZXBhZGZpbGUocGFkZmlsZSk7ICAvLyBubyBtb3JlIHBhZGRpbmcKCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLy8gU2V0IHVwIGNsaWVudCdzIGVudmlyb25tZW50CiAgIC8vICAgcDogc2V0LWxpYmRpciAgW2ZvciBWR18obGliZGlyKV0KICAgLy8gICBwOiBsb2FkX3Rvb2woKSBbZm9yICdwcmVsb2FkJ10KICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBlbnYgPSBmaXhfZW52aXJvbm1lbnQoZW52aXJvbiwgcHJlbG9hZCk7CgogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vIFNldHVwIGNsaWVudCBzdGFjaywgZWlwLCBhbmQgVkdfKGNsaWVudF9hcmdbY3ZdKQogICAvLyAgIHA6IGxvYWRfY2xpZW50KCkgICAgIFtmb3IgJ2luZm8nXQogICAvLyAgIHA6IGZpeF9lbnZpcm9ubWVudCgpIFtmb3IgJ2VudiddCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgeyAKICAgICAgdm9pZCogaW5pdF9zcCA9IGFyZ3YgLSAxOwogICAgICBlc3BfYXRfc3RhcnR1cCA9IHNldHVwX2NsaWVudF9zdGFjayhpbml0X3NwLCBjbF9hcmd2LCBlbnYsICZpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xpZW50X2F1eHYpOwogICB9CgogICBpZiAoMCkKICAgICAgcHJpbnRmKCJlbnRyeT0lcCBjbGllbnQgZXNwPSVwIHZnX2FyZ2M9JWQgYnJrYmFzZT0lcFxuIiwKCSAgICAgKHZvaWQqKWNsaWVudF9laXAsICh2b2lkKillc3BfYXRfc3RhcnR1cCwgdmdfYXJnYywgCiAgICAgICAgICAgICAodm9pZCopVkdfKGJya19iYXNlKSk7CgogICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIC8vIEZpbmlzaGVkIHNldHRpbmcgdXAgb3BlcmF0aW5nIGVudmlyb25tZW50LiAgTm93IGluaXRpYWxpc2UKICAgLy8gVmFsZ3JpbmQuICAoVGhpcyBpcyB3aGVyZSB0aGUgb2xkIFZHXyhtYWluKSgpIHN0YXJ0ZWQuKQogICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vIGF0Zm9yawogICAvLyAgIHA6IG4vYQogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFZHXyhhdGZvcmspKE5VTEwsIE5VTEwsIG5ld3BpZCk7CiAgIG5ld3BpZChWR19JTlZBTElEX1RIUkVBRElEKTsKCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLy8gc2V0dXAgZmlsZSBkZXNjcmlwdG9ycwogICAvLyAgIHA6IG4vYQogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHNldHVwX2ZpbGVfZGVzY3JpcHRvcnMoKTsKCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLy8gUmVhZCAvcHJvYy9zZWxmL21hcHMgaW50byBhIGJ1ZmZlcgogICAvLyAgIHA6IGFsbCBtZW1vcnkgbGF5b3V0LCBlbnZpcm9ubWVudCBzZXR1cCAgIFtzbyBtZW1vcnkgbWFwcyBhcmUgcmlnaHRdCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVkdfKHJlYWRfcHJvY3NlbGZtYXBzKSgpOwoKICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBCdWlsZCBzZWdtZW50IG1hcCAoVmFsZ3JpbmQgc2VnbWVudHMgb25seSkKICAgLy8gICBwOiByZWFkIHByb2Mvc2VsZi9tYXBzCiAgIC8vICAgcDogc2tfcHJlX2Nsb19pbml0KCkgIFt0byBzZXR1cCBuZXdfbWVtX3N0YXJ0dXAgdHJhY2tlcl0KICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBWR18ocGFyc2VfcHJvY3NlbGZtYXBzKSAoIGJ1aWxkX3ZhbGdyaW5kX21hcF9jYWxsYmFjayApOwoKICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAvLyBDYW4gdXNlIFZHXyhhcmVuYV9tYWxsb2MpKCkgd2l0aCBub24tQ09SRSBhcmVuYSBhZnRlciBzZWdtZW50cyBzZXQgdXAKICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBJbml0IHRvb2w6IHByZV9jbG9faW5pdCwgcHJvY2VzcyBjbWQgbGluZSwgcG9zdF9jbG9faW5pdAogICAvLyAgIHA6IHNldHVwX2NsaWVudF9zdGFjaygpICAgICAgW2ZvciAnVkdfKGNsaWVudF9hcmdbY3ZdJ10KICAgLy8gICBwOiBsb2FkX3Rvb2woKSAgICAgICAgICAgICAgIFtmb3IgJ3Rvb2wnXQogICAvLyAgIHA6IHNldHVwX2ZpbGVfZGVzY3JpcHRvcnMoKSAgW2ZvciAnVkdfKGZkX3h4eF9saW1pdCknXQogICAvLyAgIHA6IHBhcnNlX3Byb2NzZWxmbWFwcyAgICAgICAgW3NvIFZHIHNlZ21lbnRzIGFyZSBzZXR1cCBzbyB0b29sIGNhbgogICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgVkdfKG1hbGxvYyldCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgKCp0b29saW5mby0+c2tfcHJlX2Nsb19pbml0KSgpOwogICBWR18odG9vbF9pbml0X2Rsc3ltKSh0b29sX2RsaGFuZGxlKTsKICAgVkdfKHNhbml0eV9jaGVja19uZWVkcykoKTsKCiAgIC8vIElmIC0tdG9vbCBhbmQgLS1oZWxwLy0taGVscC1kZWJ1ZyB3YXMgZ2l2ZW4sIG5vdyBnaXZlIHRoZSBjb3JlK3Rvb2wKICAgLy8gaGVscCBtZXNzYWdlCiAgIGlmIChuZWVkX2hlbHApIHsKICAgICAgdXNhZ2UoLyotLWhlbHAtZGVidWc/Ki8yID09IG5lZWRfaGVscCk7CiAgIH0KICAgcHJvY2Vzc19jbWRfbGluZV9vcHRpb25zKGNsaWVudF9hdXh2LCB0b29sKTsKCiAgIFNLXyhwb3N0X2Nsb19pbml0KSgpOwoKICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBCdWlsZCBzZWdtZW50IG1hcCAoYWxsIHNlZ21lbnRzKQogICAvLyAgIHA6IHNldHVwX2NsaWVudF9zdGFjaygpICBbZm9yICdlc3BfYXRfc3RhcnR1cCddCiAgIC8vICAgcDogaW5pdCB0b29sICAgICAgICAgICAgIFtmb3IgJ25ld19tZW1fc3RhcnR1cCddCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgZXNwX2F0X3N0YXJ0dXBfX19nbG9iYWxfYXJnID0gZXNwX2F0X3N0YXJ0dXA7CiAgIFZHXyhwYXJzZV9wcm9jc2VsZm1hcHMpICggYnVpbGRfc2VnbWVudF9tYXBfY2FsbGJhY2sgKTsgIC8qIGV2ZXJ5dGhpbmcgKi8KICAgZXNwX2F0X3N0YXJ0dXBfX19nbG9iYWxfYXJnID0gMDsKICAgCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLy8gUHJvdGVjdCBjbGllbnQgdHJhbXBvbGluZSBwYWdlICh3aGljaCBpcyBhbHNvIHN5c2luZm8gc3R1ZmYpCiAgIC8vICAgcDogc2VnbWVudCBzdHVmZiAgIFtvdGhlcndpc2UgZ2V0IHNlZyBmYXVsdHMuLi5dCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVkdfKG1wcm90ZWN0KSggKHZvaWQgKilWR18oY2xpZW50X3RyYW1wb2xpbmVfY29kZSksCiAgICAgICAgICAgICAgICAgVkdfKHRyYW1wb2xpbmVfY29kZV9sZW5ndGgpLCBWS0lfUFJPVF9SRUFEfFZLSV9QUk9UX0VYRUMgKTsKCiAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgLy8gQ2FuIHVzZSBWR18obWFwKSgpIGFmdGVyIHNlZ21lbnRzIHNldCB1cAogICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vIEFsbG93IEdEQiBhdHRhY2gKICAgLy8gICBwOiBwcm9jZXNzX2NtZF9saW5lX29wdGlvbnMoKSAgW2ZvciBWR18oY2xvX3dhaXRfZm9yX2dkYildCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLyogSG9vayB0byBkZWxheSB0aGluZ3MgbG9uZyBlbm91Z2ggc28gd2UgY2FuIGdldCB0aGUgcGlkIGFuZAogICAgICBhdHRhY2ggR0RCIGluIGFub3RoZXIgc2hlbGwuICovCiAgIGlmIChWR18oY2xvX3dhaXRfZm9yX2dkYikpIHsKICAgICAgVkdfKHByaW50ZikoInBpZD0lZFxuIiwgVkdfKGdldHBpZCkoKSk7CiAgICAgIC8qIGRvICJqdW1wICokZWlwIiB0byBza2lwIHRoaXMgaW4gZ2RiICovCiAgICAgIFZHXyhkb19zeXNjYWxsKShfX05SX3BhdXNlKTsKICAgfQoKICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBTZXQgdXAgYmFzZUJsb2NrCiAgIC8vICAgcDoge3ByZSxwb3N0fV9jbG9faW5pdCgpICBbZm9yIHRvb2wgaGVscGVyIHJlZ2lzdHJhdGlvbl0KICAgLy8gICAgICBsb2FkX2NsaWVudCgpICAgICAgICAgIFtmb3IgJ2NsaWVudF9laXAnXQogICAvLyAgICAgIHNldHVwX2NsaWVudF9zdGFjaygpICAgW2ZvciAnZXNwX2F0X3N0YXJ0dXAnXQogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIGluaXRfYmFzZUJsb2NrKGNsaWVudF9laXAsIGVzcF9hdF9zdGFydHVwKTsKCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLy8gU2VhcmNoIGZvciBmaWxlIGRlc2NyaXB0b3JzIHRoYXQgYXJlIGluaGVyaXRlZCBmcm9tIG91ciBwYXJlbnQKICAgLy8gICBwOiBwcm9jZXNzX2NtZF9saW5lX29wdGlvbnMgIFtmb3IgVkdfKGNsb190cmFja19mZHMpXQogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIGlmIChWR18oY2xvX3RyYWNrX2ZkcykpCiAgICAgIFZHXyhpbml0X3ByZW9wZW5lZF9mZHMpKCk7CgogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vIEluaXRpYWxpc2UgdGhlIHNjaGVkdWxlcgogICAvLyAgIHA6IGluaXRfYmFzZUJsb2NrKCkgIFtiYXNlQmxvY2sgcmVncyBjb3BpZWQgaW50byBWR18odGhyZWFkcylbMV1dCiAgIC8vICAgcDogc2V0dXBfZmlsZV9kZXNjcmlwdG9ycygpIFtlbHNlIFZHXyhzYWZlX2ZkKSgpIGJyZWFrc10KICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBWR18oc2NoZWR1bGVyX2luaXQpKCk7CgogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vIFNldCB1cCB0aGUgUHJveHlMV1AgbWFjaGluZXJ5CiAgIC8vICAgcDogVkdfKHNjaGVkdWxlcl9pbml0KSgpPyAgW1hYWDogc3VidGxlIGRlcGVuZGVuY3k/XQogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFZHXyhwcm94eV9pbml0KSgpOwoKICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBJbml0aWFsaXNlIHRoZSBzaWduYWwgaGFuZGxpbmcgc3Vic3lzdGVtCiAgIC8vICAgcDogVkdfKGF0Zm9yaykoTlVMTCwgTlVMTCwgbmV3cGlkKSBbZWxzZSBwcm9ibGVtcyB3aXRoIHNpZ21hc2tzXQogICAvLyAgIHA6IFZHXyhwcm94eV9pbml0KSgpICAgICAgICAgICAgICAgW2Vsc2UgYnJlYWtzLi4uXQogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vIE5iOiB0ZW1wb3JhcmlseSBwYXJrcyB0aGUgc2F2ZWQgYmxvY2tpbmctbWFzayBpbiBzYXZlZF9zaWdtYXNrLgogICBWR18oc2lnc3RhcnR1cF9hY3Rpb25zKSgpOwoKICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBQZXJoYXBzIHdlJ3JlIHByb2ZpbGluZyBWYWxncmluZD8KICAgLy8gICBwOiBwcm9jZXNzX2NtZF9saW5lX29wdGlvbnMoKSAgW2ZvciBWR18oY2xvX3Byb2ZpbGUpXQogICAvLyAgIHA6IG90aGVycz8KICAgLy8KICAgLy8gWFhYOiB0aGlzIHNlZW1zIHRvIGJlIGJyb2tlbj8gICBJdCBhbHdheXMgc2F5cyB0aGUgdG9vbCB3YXNuJ3QgYnVpbHQKICAgLy8gZm9yIHByb2ZpbGluZzsgIHZnX3Byb2ZpbGUuYydzIGZ1bmN0aW9ucyBkb24ndCBzZWVtIHRvIGJlIG92ZXJyaWRpbmcKICAgLy8gdmdfZHVtbXlfcHJvZmlsZS5jJ3M/CiAgIC8vCiAgIC8vIFhYWDogd2FudCB0aGlzIGFzIGVhcmx5IGFzIHBvc3NpYmxlLiAgTG9va2luZyBmb3IgLS1wcm9maWxlCiAgIC8vIGluIHByZV9wcm9jZXNzX2NtZF9saW5lX29wdGlvbnMoKSBjb3VsZCBnZXQgaXQgZWFybGllci4KICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBpZiAoVkdfKGNsb19wcm9maWxlKSkKICAgICAgVkdQXyhpbml0X3Byb2ZpbGluZykoKTsKCiAgIFZHUF9QVVNIQ0MoVmdwU3RhcnR1cCk7CgogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vIFJlYWQgc3VwcHJlc3Npb24gZmlsZQogICAvLyAgIHA6IHByb2Nlc3NfY21kX2xpbmVfb3B0aW9ucygpICBbZm9yIFZHXyhjbG9fc3VwcHJlc3Npb25zKV0KICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBpZiAoVkdfKG5lZWRzKS5jb3JlX2Vycm9ycyB8fCBWR18obmVlZHMpLnNraW5fZXJyb3JzKQogICAgICBWR18obG9hZF9zdXBwcmVzc2lvbnMpKCk7CgogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vIEluaXRpYWxpc2UgdHJhbnNsYXRpb24gdGFibGUgYW5kIHRyYW5zbGF0aW9uIGNhY2hlCiAgIC8vICAgcDogcmVhZF9wcm9jc2VsZm1hcHMgIFtzbyB0aGUgYW5vbnltb3VzIG1tYXBzIGZvciB0aGUgVFQvVEMKICAgLy8gICAgICAgICBhcmVuJ3QgaWRlbnRpZmllZCBhcyBwYXJ0IG9mIHRoZSBjbGllbnQsIHdoaWNoIHdvdWxkIHdhc3RlCiAgIC8vICAgICAgICAgPiAyME0gb2YgdmlydHVhbCBhZGRyZXNzIHNwYWNlLl0KICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBWR18oaW5pdF90dF90YykoKTsKCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLy8gUmVhZCBkZWJ1ZyBpbmZvIHRvIGZpbmQgZ2xpYmMgZW50cnkgcG9pbnRzIHRvIGludGVyY2VwdAogICAvLyAgIHA6IHBhcnNlX3Byb2NzZWxmbWFwcz8gW1hYWCBmb3IgZGVidWcgaW5mbz9dCiAgIC8vICAgcDogaW5pdF90dF90Yz8gIFtYWFggPz8/XQogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFZHXyhzZXR1cF9jb2RlX3JlZGlyZWN0X3RhYmxlKSgpOwoKICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBWZXJib3NpdHkgbWVzc2FnZQogICAvLyAgIHA6IGVuZF9yZHRzY19jYWxpYnJhdGlvbiBbc28gc3RhcnR1cCBtZXNzYWdlIGlzIHByaW50ZWQgZmlyc3RdCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgaWYgKFZHXyhjbG9fdmVyYm9zaXR5KSA9PSAxKQogICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgIkZvciBtb3JlIGRldGFpbHMsIHJlcnVuIHdpdGg6IC12Iik7CiAgIGlmIChWR18oY2xvX3ZlcmJvc2l0eSkgPiAwKQogICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgIiIpOwoKICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBTZXR1cCBwb2ludGVyY2hlY2sKICAgLy8gICBwOiBwcm9jZXNzX2NtZF9saW5lX29wdGlvbnMoKSBbZm9yIFZHXyhjbG9fcG9pbnRlcmNoZWNrKV0KICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBpZiAoVkdfKGNsb19wb2ludGVyY2hlY2spKQogICAgICBWR18oY2xvX3BvaW50ZXJjaGVjaykgPSBWR0FfKHNldHVwX3BvaW50ZXJjaGVjaykoKTsKCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLy8gUnVuIQogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFZHUF9QT1BDQyhWZ3BTdGFydHVwKTsKICAgVkdQX1BVU0hDQyhWZ3BTY2hlZCk7CgogICBzcmMgPSBWR18oc2NoZWR1bGVyKSggJmV4aXRjb2RlLCAmbGFzdF9ydW5fdGlkLCAmZmF0YWxfc2lnTm8gKTsKCiAgIFZHUF9QT1BDQyhWZ3BTY2hlZCk7CgoKICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBGaW5hbGlzYXRpb246IGNsZWFudXAsIG1lc3NhZ2VzLCBldGMuICBPcmRlciBubyBzbyBpbXBvcnRhbnQsIG9ubHkKICAgLy8gYWZmZWN0cyB3aGF0IG9yZGVyIHRoZSBtZXNzYWdlcyBjb21lLgogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIGlmIChWR18oY2xvX3ZlcmJvc2l0eSkgPiAwKQogICAgICBWR18obWVzc2FnZSkoVmdfVXNlck1zZywgIiIpOwoKICAgaWYgKHNyYyA9PSBWZ1NyY19EZWFkbG9jaykgewogICAgIFZHXyhtZXNzYWdlKShWZ19Vc2VyTXNnLCAKICAgICAgICAiV2FybmluZzogcHRocmVhZCBzY2hlZHVsZXIgZXhpdGVkIGR1ZSB0byBkZWFkbG9jayIpOwogICB9CgogICAvKiBQcmludCBvdXQgZmlsZSBkZXNjcmlwdG9yIHN1bW1hcnkgYW5kIHN0YXRzLiAqLwogICBpZiAoVkdfKGNsb190cmFja19mZHMpKQogICAgICBWR18oc2hvd19vcGVuX2ZkcykoKTsKCiAgIGlmIChWR18obmVlZHMpLmNvcmVfZXJyb3JzIHx8IFZHXyhuZWVkcykuc2tpbl9lcnJvcnMpCiAgICAgIFZHXyhzaG93X2FsbF9lcnJvcnMpKCk7CgogICBTS18oZmluaSkoIGV4aXRjb2RlICk7CgogICBWR18oc2FuaXR5X2NoZWNrX2dlbmVyYWwpKCBUcnVlIC8qaW5jbHVkZSBleHBlbnNpdmUgY2hlY2tzKi8gKTsKCiAgIGlmIChWR18oY2xvX3ZlcmJvc2l0eSkgPiAxKQogICAgICBwcmludF9hbGxfc3RhdHMoKTsKCiAgIGlmIChWR18oY2xvX3Byb2ZpbGUpKQogICAgICBWR1BfKGRvbmVfcHJvZmlsaW5nKSgpOwoKICAgLyogV2UncmUgZXhpdGluZywgc28gbnVrZSBhbGwgdGhlIHRocmVhZHMgYW5kIGNsZWFuIHVwIHRoZSBwcm94eSBMV1BzICovCiAgIHZnX2Fzc2VydChzcmMgPT0gVmdTcmNfRmF0YWxTaWcgfHwKCSAgICAgVkdfKHRocmVhZHMpW2xhc3RfcnVuX3RpZF0uc3RhdHVzID09IFZnVHNfUnVubmFibGUgfHwKCSAgICAgVkdfKHRocmVhZHMpW2xhc3RfcnVuX3RpZF0uc3RhdHVzID09IFZnVHNfV2FpdEpvaW5lcik7CiAgIFZHXyhudWtlX2FsbF90aHJlYWRzX2V4Y2VwdCkoVkdfSU5WQUxJRF9USFJFQURJRCk7CgogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vIEV4aXQsIGFjY29yZGluZyB0byB0aGUgc2NoZWR1bGVyJ3MgcmV0dXJuIGNvZGUKICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBzd2l0Y2ggKHNyYykgewogICAgICBjYXNlIFZnU3JjX0V4aXRTeXNjYWxsOiAvKiB0aGUgbm9ybWFsIHdheSBvdXQgKi8KICAgICAgICAgdmdfYXNzZXJ0KGxhc3RfcnVuX3RpZCA+IDAgJiYgbGFzdF9ydW5fdGlkIDwgVkdfTl9USFJFQURTKTsKCSBWR18ocHJveHlfc2h1dGRvd24pKCk7CgogICAgICAgICAvKiBUaGUgdGhyZWFkJ3MgJUVCWCBhdCB0aGUgdGltZSBpdCBkaWQgX19OUl9leGl0KCkgd2lsbCBob2xkCiAgICAgICAgICAgIHRoZSBhcmcgdG8gX19OUl9leGl0KCksIHNvIHdlIGp1c3QgZG8gX19OUl9leGl0KCkgd2l0aAogICAgICAgICAgICB0aGF0IGFyZy4gKi8KICAgICAgICAgVkdfKGV4aXQpKCBleGl0Y29kZSApOwogICAgICAgICAvKiBOT1QgQUxJVkUgSEVSRSEgKi8KICAgICAgICAgVkdfKGNvcmVfcGFuaWMpKCJlbnRlcmVkIHRoZSBhZnRlcmxpZmUgaW4gbWFpbigpIC0tIEV4aXRTeXNjYWxsIik7CiAgICAgICAgIGJyZWFrOyAvKiB3aGF0IHRoZSBoZWxsIDopICovCgogICAgICBjYXNlIFZnU3JjX0RlYWRsb2NrOgogICAgICAgICAvKiBKdXN0IGV4aXQgbm93LiAgTm8gcG9pbnQgaW4gY29udGludWluZy4gKi8KCSBWR18ocHJveHlfc2h1dGRvd24pKCk7CiAgICAgICAgIFZHXyhleGl0KSgwKTsKICAgICAgICAgVkdfKGNvcmVfcGFuaWMpKCJlbnRlcmVkIHRoZSBhZnRlcmxpZmUgaW4gbWFpbigpIC0tIERlYWRsb2NrIik7CiAgICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBWZ1NyY19GYXRhbFNpZzoKCSAvKiBXZSB3ZXJlIGtpbGxlZCBieSBhIGZhdGFsIHNpZ25hbCwgc28gcmVwbGljYXRlIHRoZSBlZmZlY3QgKi8KCSB2Z19hc3NlcnQoZmF0YWxfc2lnTm8gIT0gLTEpOwoJIFZHXyhraWxsX3NlbGYpKGZhdGFsX3NpZ05vKTsKCSBWR18oY29yZV9wYW5pYykoIm1haW4oKTogc2lnbmFsIHdhcyBzdXBwb3NlZCB0byBiZSBmYXRhbCIpOwoJIGJyZWFrOwoKICAgICAgZGVmYXVsdDoKICAgICAgICAgVkdfKGNvcmVfcGFuaWMpKCJtYWluKCk6IHVuZXhwZWN0ZWQgc2NoZWR1bGVyIHJldHVybiBjb2RlIik7CiAgIH0KCiAgIGFib3J0KCk7Cn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyotLS0gZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdfbWFpbi5jIC0tLSovCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwo=