LyoKICogbWliLmMKICoKICogJElkJAogKgogKiBVcGRhdGU6IDE5OTgtMDctMTcgPGpoeUBnc3UuZWR1PgogKiBBZGRlZCBwcmludF9vaWRfcmVwb3J0KiBmdW5jdGlvbnMuCiAqCiAqLwovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHRzLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCUNvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkyIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgojaWYgSEFWRV9ESVJFTlRfSAojIGluY2x1ZGUgPGRpcmVudC5oPgojIGRlZmluZSBOQU1MRU4oZGlyZW50KSBzdHJsZW4oKGRpcmVudCktPmRfbmFtZSkKI2Vsc2UKIyBkZWZpbmUgZGlyZW50IGRpcmVjdAojIGRlZmluZSBOQU1MRU4oZGlyZW50KSAoZGlyZW50KS0+ZF9uYW1sZW4KIyBpZiBIQVZFX1NZU19ORElSX0gKIyAgaW5jbHVkZSA8c3lzL25kaXIuaD4KIyBlbmRpZgojIGlmIEhBVkVfU1lTX0RJUl9ICiMgIGluY2x1ZGUgPHN5cy9kaXIuaD4KIyBlbmRpZgojIGlmIEhBVkVfTkRJUl9ICiMgIGluY2x1ZGUgPG5kaXIuaD4KIyBlbmRpZgojZW5kaWYKCiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbHNlCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU0VMRUNUX0gKI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KI2VuZGlmCgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaWYgSEFWRV9ETUFMTE9DX0gKI2luY2x1ZGUgPGRtYWxsb2MuaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvdHlwZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL291dHB1dF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2NvbmZpZ19hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL3V0aWxpdGllcy5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvYXNuMS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9taWIuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvcGFyc2UuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvaW50NjQuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9jbGllbnQuaD4KCi8qKiBAZGVmZ3JvdXAgbWliX3V0aWxpdGllcyBtaWIgcGFyc2luZyBhbmQgZGF0YXR5cGUgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLgogKiAgQGluZ3JvdXAgbGlicmFyeQogKgogKiAgQHsKICovCgpzdGF0aWMgY2hhciAgICAqdXB0aW1lU3RyaW5nKHVfbG9uZywgY2hhciAqLCBzaXplX3QpOwoKc3RhdGljIHN0cnVjdCB0cmVlICpfZ2V0X3JlYWxsb2Nfc3ltYm9sKGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJlZSAqc3VidHJlZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbmRleF9saXN0ICppbl9kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIGVuZF9vZl9rbm93bik7CgpzdGF0aWMgaW50ICAgICAgcHJpbnRfdHJlZV9ub2RlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKnRwLCBpbnQgd2lkdGgpOwpzdGF0aWMgdm9pZCAgICAgaGFuZGxlX21pYmRpcnNfY29uZihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSk7CnN0YXRpYyB2b2lkICAgICBoYW5kbGVfbWlic19jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKTsKc3RhdGljIHZvaWQgICAgIGhhbmRsZV9taWJmaWxlX2NvbmYoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpOwoKc3RhdGljIHZvaWQgICAgIF9vaWRfZmluaXNoX3ByaW50aW5nKGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLCBpbnQgKmJ1Zl9vdmVyZmxvdyk7CgovKgogKiBoZWxwZXIgZnVuY3Rpb25zIGZvciBnZXRfbW9kdWxlX25vZGUgCiAqLwpzdGF0aWMgaW50ICAgICAgbm9kZV90b19vaWQoc3RydWN0IHRyZWUgKiwgb2lkICosIHNpemVfdCAqKTsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKc3RhdGljIGludCAgICAgIF9hZGRfc3RyaW5nc190b19vaWQoc3RydWN0IHRyZWUgKiwgY2hhciAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWQgKiwgc2l6ZV90ICosIHNpemVfdCk7CiNlbHNlCnN0YXRpYyBpbnQgICAgICBfYWRkX3N0cmluZ3NfdG9fb2lkKHZvaWQgKiwgY2hhciAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWQgKiwgc2l6ZV90ICosIHNpemVfdCk7CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCk5FVFNOTVBfSU1QT1JUIHN0cnVjdCB0cmVlICp0cmVlX2hlYWQ7CnN0YXRpYyBzdHJ1Y3QgdHJlZSAqdHJlZV90b3A7CgpORVRTTk1QX0lNUE9SVCBzdHJ1Y3QgdHJlZSAqTWliOwpzdHJ1Y3QgdHJlZSAgICAqTWliOyAgICAgICAgICAgIC8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCm9pZCAgICAgICAgICAgICBSRkMxMjEzX01JQltdID0geyAxLCAzLCA2LCAxLCAyLCAxIH07CnN0YXRpYyBjaGFyICAgICBTdGFuZGFyZF9QcmVmaXhbXSA9ICIuMS4zLjYuMS4yLjEiOwoKLyoKICogU2V0IGRlZmF1bHQgaGVyZSBhcyBzb21lIHVzZXMgb2YgcmVhZF9vYmppZCByZXF1aXJlIHZhbGlkIHBvaW50ZXIuIAogKi8Kc3RhdGljIGNoYXIgICAgKlByZWZpeCA9ICZTdGFuZGFyZF9QcmVmaXhbMF07CnR5cGVkZWYgc3RydWN0IF9QcmVmaXhMaXN0IHsKICAgIGNvbnN0IGNoYXIgICAgICpzdHI7CiAgICBpbnQgICAgICAgICAgICAgbGVuOwp9ICAgICAgICAgICAgICAqUHJlZml4TGlzdFB0ciwgUHJlZml4TGlzdDsKCi8qCiAqIEhlcmUgYXJlIHRoZSBwcmVmaXggc3RyaW5ncy4KICogTm90ZSB0aGF0IHRoZSBmaXJzdCBvbmUgZmluZHMgdGhlIHZhbHVlIG9mIFByZWZpeCBvciBTdGFuZGFyZF9QcmVmaXguCiAqIEFueSBvZiB0aGVzZSBNQVkgc3RhcnQgd2l0aCBwZXJpb2Q7IGFsbCB3aWxsIE5PVCBlbmQgd2l0aCBwZXJpb2QuCiAqIFBlcmlvZCBpcyBhZGRlZCB3aGVyZSBuZWVkZWQuICBTZWUgdXNlIG9mIFByZWZpeCBpbiB0aGlzIG1vZHVsZS4KICovClByZWZpeExpc3QgICAgICBtaWJfcHJlZml4ZXNbXSA9IHsKICAgIHsmU3RhbmRhcmRfUHJlZml4WzBdfSwgICAgICAvKiBwbGFjZWhvbGRlciBmb3IgUHJlZml4IGRhdGEgKi8KICAgIHsiLmlzby5vcmcuZG9kLmludGVybmV0Lm1nbXQubWliLTIifSwKICAgIHsiLmlzby5vcmcuZG9kLmludGVybmV0LmV4cGVyaW1lbnRhbCJ9LAogICAgeyIuaXNvLm9yZy5kb2QuaW50ZXJuZXQucHJpdmF0ZSJ9LAogICAgeyIuaXNvLm9yZy5kb2QuaW50ZXJuZXQuc25tcFBhcnRpZXMifSwKICAgIHsiLmlzby5vcmcuZG9kLmludGVybmV0LnNubXBTZWNyZXRzIn0sCiAgICB7TlVMTCwgMH0gICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGxpc3QgKi8KfTsKCmVudW0gaW5ldF9hZGRyZXNzX3R5cGUgewogICAgSVBWNCA9IDEsCiAgICBJUFY2ID0gMiwKICAgIElQVjRaID0gMywKICAgIElQVjZaID0gNCwKICAgIEROUyA9IDE2Cn07CgoKLyoqCiAqIEBpbnRlcm5hbAogKiBDb252ZXJ0cyB0aW1ldGlja3MgdG8gaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMgc3RyaW5nLgogKgogKiBAcGFyYW0gdGltZXRpY2tzICAgIFRoZSB0aW1ldGlja3MgdG8gY29udmVydC4KICogQHBhcmFtIGJ1ZiAgICAgICAgICBCdWZmZXIgdG8gd3JpdGUgdG8sIGhhcyB0byBiZSBhdCAKICogICAgICAgICAgICAgICAgICAgICBsZWFzdCA0MCBCeXRlcyBsYXJnZS4KICogICAgICAgCiAqIEByZXR1cm4gVGhlIGJ1ZmZlci4KICovCnN0YXRpYyBjaGFyICAgICoKdXB0aW1lU3RyaW5nKHVfbG9uZyB0aW1ldGlja3MsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKewogICAgaW50ICAgICAgICAgICAgIGNlbnRpc2Vjcywgc2Vjb25kcywgbWludXRlcywgaG91cnMsIGRheXM7CgogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9OVU1FUklDX1RJTUVUSUNLUykpIHsKICAgICAgICBzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVsdSIsIHRpbWV0aWNrcyk7CiAgICAgICAgcmV0dXJuIGJ1ZjsKICAgIH0KCgogICAgY2VudGlzZWNzID0gdGltZXRpY2tzICUgMTAwOwogICAgdGltZXRpY2tzIC89IDEwMDsKICAgIGRheXMgPSB0aW1ldGlja3MgLyAoNjAgKiA2MCAqIDI0KTsKICAgIHRpbWV0aWNrcyAlPSAoNjAgKiA2MCAqIDI0KTsKCiAgICBob3VycyA9IHRpbWV0aWNrcyAvICg2MCAqIDYwKTsKICAgIHRpbWV0aWNrcyAlPSAoNjAgKiA2MCk7CgogICAgbWludXRlcyA9IHRpbWV0aWNrcyAvIDYwOwogICAgc2Vjb25kcyA9IHRpbWV0aWNrcyAlIDYwOwoKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKQogICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJWQ6JWQ6JTAyZDolMDJkLiUwMmQiLAogICAgICAgICAgICAgICAgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGNlbnRpc2Vjcyk7CiAgICBlbHNlIHsKICAgICAgICBpZiAoZGF5cyA9PSAwKSB7CiAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJWQ6JTAyZDolMDJkLiUwMmQiLAogICAgICAgICAgICAgICAgICAgIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBjZW50aXNlY3MpOwogICAgICAgIH0gZWxzZSBpZiAoZGF5cyA9PSAxKSB7CiAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJWQgZGF5LCAlZDolMDJkOiUwMmQuJTAyZCIsCiAgICAgICAgICAgICAgICAgICAgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGNlbnRpc2Vjcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc25wcmludGYoYnVmLCBidWZsZW4sICIlZCBkYXlzLCAlZDolMDJkOiUwMmQuJTAyZCIsCiAgICAgICAgICAgICAgICAgICAgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGNlbnRpc2Vjcyk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGJ1ZjsKfQoKCgovKioKICogQGludGVybmFsCiAqIFByaW50cyB0aGUgY2hhcmFjdGVyIHBvaW50ZWQgdG8gaWYgaW4gaHVtYW4tcmVhZGFibGUgQVNDSUkgcmFuZ2UsCiAqIG90aGVyd2lzZSBwcmludHMgYSBkb3QuCiAqCiAqIEBwYXJhbSBidWYgQnVmZmVyIHRvIHByaW50IHRoZSBjaGFyYWN0ZXIgdG8uCiAqIEBwYXJhbSBjaCAgQ2hhcmFjdGVyIHRvIHByaW50LgogKi8Kc3RhdGljIHZvaWQKc3ByaW50X2NoYXIoY2hhciAqYnVmLCBjb25zdCB1X2NoYXIgY2gpCnsKICAgIGlmIChpc3ByaW50KGNoKSB8fCBpc3NwYWNlKGNoKSkgewogICAgICAgIHNwcmludGYoYnVmLCAiJWMiLCAoaW50KSBjaCk7CiAgICB9IGVsc2UgewogICAgICAgIHNwcmludGYoYnVmLCAiLiIpOwogICAgfQp9CgoKCi8qKgogKiBQcmludHMgYSBoZXhhZGVjaW1hbCBzdHJpbmcgaW50byBhIGJ1ZmZlci4KICoKICogVGhlIGNoYXJhY3RlcnMgcG9pbnRlZCBieSAqY3AgYXJlIGVuY29kZWQgYXMgaGV4YWRlY2ltYWwgc3RyaW5nLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIGFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIGluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSBjcCAgICAgICB0aGUgYXJyYXkgb2YgY2hhcmFjdGVycyB0byBlbmNvZGUuCiAqIEBwYXJhbSBsaW5lX2xlbiB0aGUgYXJyYXkgbGVuZ3RoIG9mIGNwLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApfc3ByaW50X2hleHN0cmluZ19saW5lKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsIGNvbnN0IHVfY2hhciAqIGNwLCBzaXplX3QgbGluZV9sZW4pCnsKICAgIGNvbnN0IHVfY2hhciAgICp0cDsKICAgIGNvbnN0IHVfY2hhciAgICpjcDIgPSBjcDsKICAgIHNpemVfdCAgICAgICAgICBsZW5sZWZ0ID0gbGluZV9sZW47CgogICAgLyoKICAgICAqIE1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCByb29tIGZvciB0aGUgaGV4IG91dHB1dC4uLi4KICAgICAqLwogICAgd2hpbGUgKCgqb3V0X2xlbiArIGxpbmVfbGVuKjMrMSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIC4uLi4gYW5kIGRpc3BsYXkgdGhlIGhleCB2YWx1ZXMgdGhlbXNlbHZlcy4uLi4KICAgICAqLwogICAgZm9yICg7IGxlbmxlZnQgPj0gODsgbGVubGVmdC09OCkgewogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksCiAgICAgICAgICAgICAgICAiJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICIsIGNwWzBdLCBjcFsxXSwKICAgICAgICAgICAgICAgIGNwWzJdLCBjcFszXSwgY3BbNF0sIGNwWzVdLCBjcFs2XSwgY3BbN10pOwogICAgICAgICpvdXRfbGVuICs9IHN0cmxlbigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSk7CiAgICAgICAgY3AgICAgICAgKz0gODsKICAgIH0KICAgIGZvciAoOyBsZW5sZWZ0ID4gMDsgbGVubGVmdC0tKSB7CiAgICAgICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIiUwMlggIiwgKmNwKyspOwogICAgICAgICpvdXRfbGVuICs9IHN0cmxlbigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSk7CiAgICB9CgogICAgLyoKICAgICAqIC4uLi4gcGx1cyAob3B0aW9uYWxseSkgZG8gdGhlIHNhbWUgZm9yIHRoZSBBU0NJSSBlcXVpdmFsZW50LgogICAgICovCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX0hFWF9URVhUKSkgewogICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyBsaW5lX2xlbis1KSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIiAgWyIpOwogICAgICAgICpvdXRfbGVuICs9IHN0cmxlbigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSk7CiAgICAgICAgZm9yICh0cCA9IGNwMjsgdHAgPCBjcDsgdHArKykgewogICAgICAgICAgICBzcHJpbnRfY2hhcigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgKnRwKTsKICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgIH0KICAgICAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiXSIpOwogICAgICAgICpvdXRfbGVuICs9IHN0cmxlbigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKaW50CnNwcmludF9yZWFsbG9jX2hleHN0cmluZyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsIGNvbnN0IHVfY2hhciAqIGNwLCBzaXplX3QgbGVuKQp7CiAgICBpbnQgbGluZV9sZW4gPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0hFWF9PVVRQVVRfTEVOR1RIKTsKICAgIGlmICghbGluZV9sZW4pCiAgICAgICAgbGluZV9sZW49bGVuOwoKICAgIGZvciAoOyAoaW50KWxlbiA+IGxpbmVfbGVuOyBsZW4gLT0gbGluZV9sZW4pIHsKICAgICAgICBpZighX3NwcmludF9oZXhzdHJpbmdfbGluZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwLCBsaW5lX2xlbikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICooKmJ1ZiArICgqb3V0X2xlbikrKykgPSAnXG4nOwogICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDA7CiAgICAgICAgY3AgKz0gbGluZV9sZW47CiAgICB9CiAgICBpZighX3NwcmludF9oZXhzdHJpbmdfbGluZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwLCBsZW4pKQogICAgICAgIHJldHVybiAwOwogICAgKigqYnVmICsgKm91dF9sZW4pID0gMDsKICAgIHJldHVybiAxOwp9CgoKCi8qKgogKiBQcmludHMgYW4gYXNjaWkgc3RyaW5nIGludG8gYSBidWZmZXIuCiAqCiAqIFRoZSBjaGFyYWN0ZXJzIHBvaW50ZWQgYnkgKmNwIGFyZSBlbmNvZGVkIGFzIGFuIGFzY2lpIHN0cmluZy4KICogCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgYWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgaW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIGNwICAgICAgIHRoZSBhcnJheSBvZiBjaGFyYWN0ZXJzIHRvIGVuY29kZS4KICogQHBhcmFtIGxlbiAgICAgIHRoZSBhcnJheSBsZW5ndGggb2YgY3AuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2FzY2lpc3RyaW5nKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1X2NoYXIgKiBjcCwgc2l6ZV90IGxlbikKewogICAgaW50ICAgICAgICAgICAgIGk7CgogICAgZm9yIChpID0gMDsgaSA8IChpbnQpIGxlbjsgaSsrKSB7CiAgICAgICAgaWYgKGlzcHJpbnQoKmNwKSB8fCBpc3NwYWNlKCpjcCkpIHsKICAgICAgICAgICAgaWYgKCpjcCA9PSAnXFwnIHx8ICpjcCA9PSAnIicpIHsKICAgICAgICAgICAgICAgIGlmICgoKm91dF9sZW4gPj0gKmJ1Zl9sZW4pICYmCiAgICAgICAgICAgICAgICAgICAgIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKigqYnVmICsgKCpvdXRfbGVuKSsrKSA9ICdcXCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCgqb3V0X2xlbiA+PSAqYnVmX2xlbikgJiYKICAgICAgICAgICAgICAgICEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICooKmJ1ZiArICgqb3V0X2xlbikrKykgPSAqY3ArKzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoKCpvdXRfbGVuID49ICpidWZfbGVuKSAmJgogICAgICAgICAgICAgICAgIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKigqYnVmICsgKCpvdXRfbGVuKSsrKSA9ICcuJzsKICAgICAgICAgICAgY3ArKzsKICAgICAgICB9CiAgICB9CiAgICBpZiAoKCpvdXRfbGVuID49ICpidWZfbGVuKSAmJgogICAgICAgICEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcMCc7CiAgICByZXR1cm4gMTsKfQoKLyoqCiAqIFByaW50cyBhbiBvY3RldCBzdHJpbmcgaW50byBhIGJ1ZmZlci4KICoKICogVGhlIHZhcmlhYmxlIHZhciBpcyBlbmNvZGVkIGFzIG9jdGV0IHN0cmluZy4KICogCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2Nfb2N0ZXRfc3RyaW5nKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLCBjb25zdCBjaGFyICpoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBzYXZlZF9vdXRfbGVuID0gKm91dF9sZW47CiAgICBjb25zdCBjaGFyICAgICAqc2F2ZWRfaGludCA9IGhpbnQ7CiAgICBpbnQgICAgICAgICAgICAgaGV4ID0gMCwgeCA9IDA7CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICBpbnQgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdCwgY250OwoKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgY29uc3QgY2hhciAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBPQ1RFVCBTVFJJTkcpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKCiAgICBpZiAoaGludCkgewogICAgICAgIGludCAgICAgICAgICAgICByZXBlYXQsIHdpZHRoID0gMTsKICAgICAgICBsb25nICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgY2hhciAgICAgICAgICAgIGNvZGUgPSAnZCcsIHNlcGFyID0gMCwgdGVybSA9IDAsIGNoLCBpbnRidWZbMzJdOwojZGVmaW5lIEhFWDJESUdJVF9ORUVEX0lOSVQgMwogICAgICAgIGNoYXIgICAgICAgICAgICBoZXgyZGlnaXQgPSBIRVgyRElHSVRfTkVFRF9JTklUOwogICAgICAgIHVfY2hhciAgICAgICAgICplY3A7CgogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJTVFJJTkc6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjcCA9IHZhci0+dmFsLnN0cmluZzsKICAgICAgICBlY3AgPSBjcCArIHZhci0+dmFsX2xlbjsKCiAgICAgICAgd2hpbGUgKGNwIDwgZWNwKSB7CiAgICAgICAgICAgIHJlcGVhdCA9IDE7CiAgICAgICAgICAgIGlmICgqaGludCkgewogICAgICAgICAgICAgICAgaWYgKCpoaW50ID09ICcqJykgewogICAgICAgICAgICAgICAgICAgIHJlcGVhdCA9ICpjcCsrOwogICAgICAgICAgICAgICAgICAgIGhpbnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdpZHRoID0gMDsKICAgICAgICAgICAgICAgIHdoaWxlICgnMCcgPD0gKmhpbnQgJiYgKmhpbnQgPD0gJzknKQogICAgICAgICAgICAgICAgICAgIHdpZHRoID0gKHdpZHRoICogMTApICsgKCpoaW50KysgLSAnMCcpOwogICAgICAgICAgICAgICAgY29kZSA9ICpoaW50Kys7CiAgICAgICAgICAgICAgICBpZiAoKGNoID0gKmhpbnQpICYmIGNoICE9ICcqJyAmJiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCiAgICAgICAgICAgICAgICAgICAgJiYgKHdpZHRoICE9IDAKICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNoICE9ICd4JyAmJiBjaCAhPSAnZCcgJiYgY2ggIT0gJ28nKSkpCiAgICAgICAgICAgICAgICAgICAgc2VwYXIgPSAqaGludCsrOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHNlcGFyID0gMDsKICAgICAgICAgICAgICAgIGlmICgoY2ggPSAqaGludCkgJiYgY2ggIT0gJyonICYmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykKICAgICAgICAgICAgICAgICAgICAmJiAod2lkdGggIT0gMAogICAgICAgICAgICAgICAgICAgICAgICB8fCAoY2ggIT0gJ3gnICYmIGNoICE9ICdkJyAmJiBjaCAhPSAnbycpKSkKICAgICAgICAgICAgICAgICAgICB0ZXJtID0gKmhpbnQrKzsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB0ZXJtID0gMDsKICAgICAgICAgICAgICAgIGlmICh3aWR0aCA9PSAwKSAgLyogSGFuZGxlIG1hbGZvcm1lZCBoaW50IHN0cmluZ3MgKi8KICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoaWxlIChyZXBlYXQgJiYgY3AgPCBlY3ApIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gMDsKICAgICAgICAgICAgICAgIGlmIChjb2RlICE9ICdhJyAmJiBjb2RlICE9ICd0JykgewogICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiAyNTYgKyAqY3ArKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICAgICAgICAgIGlmIChIRVgyRElHSVRfTkVFRF9JTklUID09IGhleDJkaWdpdCkKICAgICAgICAgICAgICAgICAgICAgICAgaGV4MmRpZ2l0ID0gbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfMkRJR0lUX0hFWF9PVVRQVVQpOwogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogaWYgdmFsdWUgaXMgPCAxNiwgaXQgd2lsbCBiZSBhIHNpbmdsZSBoZXggZGlnaXQuIElmIHRoZQogICAgICAgICAgICAgICAgICAgICAqIHdpZHRoIGlzIDEgKHdlIGFyZSBvdXRwdXR0aW5nIGEgYnl0ZSBhdCBhIHRpbWUpLCBwYXQgaXQKICAgICAgICAgICAgICAgICAgICAgKiB0byAyIGRpZ2l0cyBpZiBORVRTTk1QX0RTX0xJQl8yRElHSVRfSEVYX09VVFBVVCBpcyBzZXQKICAgICAgICAgICAgICAgICAgICAgKiBvciBhbGwgb2YgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZToKICAgICAgICAgICAgICAgICAgICAgKiAgLSB3ZSBkbyBub3QgaGF2ZSBhIHNlcGFyYXRpb24gY2hhcmFjdGVyCiAgICAgICAgICAgICAgICAgICAgICogIC0gdGhlcmUgaXMgbm8gaGludCBsZWZ0IChvciB0aGVyZSBuZXZlciB3YXMgYSBoaW50KQogICAgICAgICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgICAgICAgICogZS5nLiBmb3IgdGhlIGRhdGEgMHhBQTAxQkIsIHdvdWxkIGFueW9uZSByZWFsbHkgZXZlcgogICAgICAgICAgICAgICAgICAgICAqIHdhbnQgdGhlIHN0cmluZyAiQUExQkIiPz8KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoKCh2YWx1ZSA8IDE2KSAmJiAoMSA9PSB3aWR0aCkpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIChoZXgyZGlnaXQgfHwgKCgwID09IHNlcGFyKSAmJiAoMCA9PSAqaGludCkpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIjAlbHgiLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlbHgiLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlbGQiLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdvJzoKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVsbyIsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3QnOiAvKiBuZXcgaW4gcmZjIDM0MTEgKi8KICAgICAgICAgICAgICAgIGNhc2UgJ2EnOgogICAgICAgICAgICAgICAgICAgIGNudCA9IFNOTVBfTUlOKHdpZHRoLCBlY3AgLSBjcCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19hc2NpaXN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCBjcCwgY250KSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgY3AgKz0gY250OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAqb3V0X2xlbiA9IHNhdmVkX291dF9sZW47CiAgICAgICAgICAgICAgICAgICAgaWYgKHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKEJhZCBoaW50IGlnbm9yZWQ6ICIpCiAgICAgICAgICAgICAgICAgICAgICAgICYmIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHNhdmVkX2hpbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICYmIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICIpICIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19vY3RldF9zdHJpbmcoYnVmLCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoY3AgPCBlY3AgJiYgc2VwYXIpIHsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IHNlcGFyOwogICAgICAgICAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXDAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVwZWF0LS07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0ZXJtICYmIGNwIDwgZWNwKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSB0ZXJtOwogICAgICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1wwJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHVuaXRzKSB7CiAgICAgICAgICAgIHJldHVybiAoc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAiKQogICAgICAgICAgICAgICAgICAgICYmIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHVuaXRzKSk7CiAgICAgICAgfQogICAgICAgIGlmICgoKm91dF9sZW4gPj0gKmJ1Zl9sZW4pICYmCiAgICAgICAgICAgICEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcMCc7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIG91dHB1dF9mb3JtYXQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9TVFJJTkdfT1VUUFVUX0ZPUk1BVCk7CiAgICBpZiAoMCA9PSBvdXRwdXRfZm9ybWF0KSB7CiAgICAgICAgb3V0cHV0X2Zvcm1hdCA9IE5FVFNOTVBfU1RSSU5HX09VVFBVVF9HVUVTUzsKICAgIH0KICAgIHN3aXRjaCAob3V0cHV0X2Zvcm1hdCkgewogICAgY2FzZSBORVRTTk1QX1NUUklOR19PVVRQVVRfR1VFU1M6CiAgICAgICAgaGV4ID0gMDsKICAgICAgICBmb3IgKGNwID0gdmFyLT52YWwuc3RyaW5nLCB4ID0gMDsgeCA8IChpbnQpIHZhci0+dmFsX2xlbjsgeCsrLCBjcCsrKSB7CiAgICAgICAgICAgIGlmICghaXNwcmludCgqY3ApICYmICFpc3NwYWNlKCpjcCkpIHsKICAgICAgICAgICAgICAgIGhleCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBORVRTTk1QX1NUUklOR19PVVRQVVRfQVNDSUk6CiAgICAgICAgaGV4ID0gMDsKICAgICAgICBicmVhazsKCiAgICBjYXNlIE5FVFNOTVBfU1RSSU5HX09VVFBVVF9IRVg6CiAgICAgICAgaGV4ID0gMTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICBpZiAodmFyLT52YWxfbGVuID09IDApIHsKICAgICAgICByZXR1cm4gc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiXCIiKTsKICAgIH0KCiAgICBpZiAoaGV4KSB7CiAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCIiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIkhleC1TVFJJTkc6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZywgdmFyLT52YWxfbGVuKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTVFJJTkc6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCIiKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19hc2NpaXN0cmluZwogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB2YXItPnZhbC5zdHJpbmcsCiAgICAgICAgICAgICB2YXItPnZhbF9sZW4pKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIiIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwoKLyoqCiAqIFByaW50cyBhIGZsb2F0IGludG8gYSBidWZmZXIuCiAqCiAqIFRoZSB2YXJpYWJsZSB2YXIgaXMgZW5jb2RlZCBhcyBhIGZsb2F0aW5nIHBvaW50IHZhbHVlLgogKiAKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19mbG9hdCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9GTE9BVCkgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIEZsb2F0KTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJPcGFxdWU6IEZsb2F0OiAiKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgoKICAgIC8qCiAgICAgKiBIb3cgbXVjaCBzcGFjZSBuZWVkZWQgZm9yIG1heC4gbGVuZ3RoIGZsb2F0PyAgMTI4IGlzIG92ZXJraWxsLiAgCiAgICAgKi8KCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgMTI4ICsgMSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIiVmIiwgKnZhci0+dmFsLmZsb2F0VmFsKTsKICAgICpvdXRfbGVuICs9IHN0cmxlbigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSk7CgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGEgZG91YmxlIGludG8gYSBidWZmZXIuCiAqCiAqIFRoZSB2YXJpYWJsZSB2YXIgaXMgZW5jb2RlZCBhcyBhIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUuCiAqIAogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2RvdWJsZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9PUEFRVUVfRE9VQkxFKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgRG91YmxlKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJPcGFxdWU6IEZsb2F0OiAiKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIEhvdyBtdWNoIHNwYWNlIG5lZWRlZCBmb3IgbWF4LiBsZW5ndGggZG91YmxlPyAgMTI4IGlzIG92ZXJraWxsLiAgCiAgICAgKi8KCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgMTI4ICsgMSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIiVmIiwgKnZhci0+dmFsLmRvdWJsZVZhbCk7CiAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTICovCgoKLyoqCiAqIFByaW50cyBhIGNvdW50ZXIgaW50byBhIGJ1ZmZlci4KICoKICogVGhlIHZhcmlhYmxlIHZhciBpcyBlbmNvZGVkIGFzIGEgY291bnRlciB2YWx1ZS4KICogCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfY291bnRlcjY0KHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICBhNjRidWZbSTY0Q0hBUlNaICsgMV07CgogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fQ09VTlRFUjY0CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgICAgICAmJiB2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9DT1VOVEVSNjQKICAgICAgICAmJiB2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9JNjQgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfVTY0CiNlbmRpZgogICAgICAgICkgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIENvdW50ZXI2NCk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX0NPVU5URVI2NCkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIk9wYXF1ZTogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQojZW5kaWYKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgICAgIHN3aXRjaCAodmFyLT50eXBlKSB7CiAgICAgICAgY2FzZSBBU05fT1BBUVVFX1U2NDoKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJVSW50NjQ6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFTTl9PUEFRVUVfSTY0OgogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIkludDY0OiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBU05fQ09VTlRFUjY0OgogICAgICAgIGNhc2UgQVNOX09QQVFVRV9DT1VOVEVSNjQ6CiNlbmRpZgogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIkNvdW50ZXI2NDogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgICAgICB9CiNlbmRpZgogICAgfQojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICBpZiAodmFyLT50eXBlID09IEFTTl9PUEFRVUVfSTY0KSB7CiAgICAgICAgcHJpbnRJNjQoYTY0YnVmLCB2YXItPnZhbC5jb3VudGVyNjQpOwogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgYTY0YnVmKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewojZW5kaWYKICAgICAgICBwcmludFU2NChhNjRidWYsIHZhci0+dmFsLmNvdW50ZXI2NCk7CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBhNjRidWYpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgfQojZW5kaWYKCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYW4gb2JqZWN0IGlkZW50aWZpZXIgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19vcGFxdWUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fT1BBUVVFCiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgICAgICAmJiB2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9DT1VOVEVSNjQKICAgICAgICAmJiB2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9VNjQKICAgICAgICAmJiB2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9JNjQKICAgICAgICAmJiB2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9GTE9BVCAmJiB2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9ET1VCTEUKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMgKi8KICAgICAgICApIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBPcGFxdWUpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICBzd2l0Y2ggKHZhci0+dHlwZSkgewogICAgY2FzZSBBU05fT1BBUVVFX0NPVU5URVI2NDoKICAgIGNhc2UgQVNOX09QQVFVRV9VNjQ6CiAgICBjYXNlIEFTTl9PUEFRVUVfSTY0OgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19jb3VudGVyNjQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUVfRkxPQVQ6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2Zsb2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX09QQVFVRV9ET1VCTEU6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2RvdWJsZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT1BBUVVFOgojZW5kaWYKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIk9QQVFVRTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmcsIHZhci0+dmFsX2xlbikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICB9CiNlbmRpZgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhbiBvYmplY3QgaWRlbnRpZmllciBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX29iamVjdF9pZGVudGlmaWVyKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaW50ICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdyA9IDA7CgogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fT0JKRUNUX0lEKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgT0JKRUNUIElERU5USUZJRVIpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIk9JRDogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvaWQgKikgKHZhci0+dmFsLm9iamlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbF9sZW4gLyBzaXplb2Yob2lkKSk7CgogICAgaWYgKGJ1Zl9vdmVyZmxvdykgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCgovKioKICogUHJpbnRzIGEgdGltZXRpY2sgdmFyaWFibGUgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY190aW1ldGlja3ModV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgY2hhciAgICAgICAgICAgIHRpbWVidWZbNDBdOwoKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX1RJTUVUSUNLUykgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIFRpbWV0aWNrcyk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05VTUVSSUNfVElNRVRJQ0tTKSkgewogICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgIHNwcmludGYoc3RyLCAiJWx1IiwgKih1X2xvbmcgKikgdmFyLT52YWwuaW50ZWdlcik7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiAxOwogICAgfQogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgc3ByaW50ZihzdHIsICJUaW1ldGlja3M6ICglbHUpICIsICoodV9sb25nICopIHZhci0+dmFsLmludGVnZXIpOwogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIHVwdGltZVN0cmluZygqKHVfbG9uZyAqKSAodmFyLT52YWwuaW50ZWdlciksIHRpbWVidWYsIHNpemVvZih0aW1lYnVmKSk7CiAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSB0aW1lYnVmKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhbiBpbnRlZ2VyIGFjY29yZGluZyB0byB0aGUgaGludCBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YWwgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZGVjaW1hbHR5cGUgJ2QnIG9yICd1JyBkZXBlbmRpbmcgb24gaW50ZWdlciB0eXBlCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgX05PVF8gYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2hpbnRlZF9pbnRlZ2VyKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHZhbCwgY29uc3QgY2hhciBkZWNpbWFsdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICBmbXRbMTBdID0gIiVsQCIsIHRtcFsyNTZdOwogICAgaW50ICAgICAgICAgICAgIHNoaWZ0ID0gMCwgbGVuLCBuZWdhdGl2ZSA9IDA7CgogICAgaWYgKGhpbnRbMF0gPT0gJ2QnKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBXZSBtaWdodCAqYWN0dWFsbHkqIHdhbnQgYSAndScgaGVyZS4gIAogICAgICAgICAqLwogICAgICAgIGlmIChoaW50WzFdID09ICctJykKICAgICAgICAgICAgc2hpZnQgPSBhdG9pKGhpbnQgKyAyKTsKICAgICAgICBmbXRbMl0gPSBkZWNpbWFsdHlwZTsKICAgICAgICBpZiAodmFsIDwgMCkgewogICAgICAgICAgICBuZWdhdGl2ZSA9IDE7CiAgICAgICAgICAgIHZhbCA9IC12YWw7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIERJU1BMQVktSElOVCBjaGFyYWN0ZXIgaXMgJ2InLCAnbycsIG9yICd4Jy4gIAogICAgICAgICAqLwogICAgICAgIGZtdFsyXSA9IGhpbnRbMF07CiAgICB9CgogICAgaWYgKGhpbnRbMF0gPT0gJ2InKSB7Cgl1bnNpZ25lZCBsb25nIGludCBiaXQgPSAweDgwMDAwMDAwTFU7CgljaGFyICpicCA9IHRtcDsKCXdoaWxlIChiaXQpIHsKCSAgICAqYnArKyA9IHZhbCAmIGJpdCA/ICcxJyA6ICcwJzsKCSAgICBiaXQgPj49IDE7Cgl9CgkqYnAgPSAwOwogICAgfQogICAgZWxzZQoJc3ByaW50Zih0bXAsIGZtdCwgdmFsKTsKCiAgICBpZiAoc2hpZnQgIT0gMCkgewogICAgICAgIGxlbiA9IHN0cmxlbih0bXApOwogICAgICAgIGlmIChzaGlmdCA8PSBsZW4pIHsKICAgICAgICAgICAgdG1wW2xlbiArIDFdID0gMDsKICAgICAgICAgICAgd2hpbGUgKHNoaWZ0LS0pIHsKICAgICAgICAgICAgICAgIHRtcFtsZW5dID0gdG1wW2xlbiAtIDFdOwogICAgICAgICAgICAgICAgbGVuLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG1wW2xlbl0gPSAnLic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdG1wW3NoaWZ0ICsgMV0gPSAwOwogICAgICAgICAgICB3aGlsZSAoc2hpZnQpIHsKICAgICAgICAgICAgICAgIGlmIChsZW4tLSA+IDApIHsKICAgICAgICAgICAgICAgICAgICB0bXBbc2hpZnRdID0gdG1wW2xlbl07CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRtcFtzaGlmdF0gPSAnMCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzaGlmdC0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRtcFswXSA9ICcuJzsKICAgICAgICB9CiAgICB9CiAgICBpZiAobmVnYXRpdmUpIHsKICAgICAgICBsZW4gPSBzdHJsZW4odG1wKSsxOwogICAgICAgIHdoaWxlIChsZW4pIHsKICAgICAgICAgICAgdG1wW2xlbl0gPSB0bXBbbGVuLTFdOwogICAgICAgICAgICBsZW4tLTsKICAgICAgICB9CiAgICAgICAgdG1wWzBdID0gJy0nOwogICAgfQogICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKHVfY2hhciAqKXRtcCk7Cn0KCgovKioKICogUHJpbnRzIGFuIGludGVnZXIgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19pbnRlZ2VyKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAqZW51bV9zdHJpbmcgPSBOVUxMOwoKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBJTlRFR0VSKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGZvciAoOyBlbnVtczsgZW51bXMgPSBlbnVtcy0+bmV4dCkgewogICAgICAgIGlmIChlbnVtcy0+dmFsdWUgPT0gKnZhci0+dmFsLmludGVnZXIpIHsKICAgICAgICAgICAgZW51bV9zdHJpbmcgPSBlbnVtcy0+bGFiZWw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIklOVEVHRVI6ICIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoZW51bV9zdHJpbmcgPT0gTlVMTCB8fAogICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9OVU1FUklDX0VOVU0pKSB7CiAgICAgICAgaWYgKGhpbnQpIHsKICAgICAgICAgICAgaWYgKCEoc3ByaW50X3JlYWxsb2NfaGludGVkX2ludGVnZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFyLT52YWwuaW50ZWdlciwgJ2QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50LCB1bml0cykpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVsZCIsICp2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBlbnVtX3N0cmluZykpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICBzcHJpbnRmKHN0ciwgIiglbGQpIiwgKnZhci0+dmFsLmludGVnZXIpOwogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgZW51bV9zdHJpbmcpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhbiB1bnNpZ25lZCBpbnRlZ2VyIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfdWludGVnZXIodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAqZW51bV9zdHJpbmcgPSBOVUxMOwoKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX1VJTlRFR0VSKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgVUludGVnZXIzMik6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBmb3IgKDsgZW51bXM7IGVudW1zID0gZW51bXMtPm5leHQpIHsKICAgICAgICBpZiAoZW51bXMtPnZhbHVlID09ICp2YXItPnZhbC5pbnRlZ2VyKSB7CiAgICAgICAgICAgIGVudW1fc3RyaW5nID0gZW51bXMtPmxhYmVsOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGVudW1fc3RyaW5nID09IE5VTEwgfHwKICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfTlVNRVJJQ19FTlVNKSkgewogICAgICAgIGlmIChoaW50KSB7CiAgICAgICAgICAgIGlmICghKHNwcmludF9yZWFsbG9jX2hpbnRlZF9pbnRlZ2VyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhci0+dmFsLmludGVnZXIsICd1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludCwgdW5pdHMpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlbHUiLCAqdmFyLT52YWwuaW50ZWdlcik7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgZW51bV9zdHJpbmcpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgc3ByaW50ZihzdHIsICIoJWx1KSIsICp2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVudW1fc3RyaW5nKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYSBnYXVnZSB2YWx1ZSBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2dhdWdlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgY2hhciAgICAgICAgICAgIHRtcFszMl07CgogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fR0FVR0UpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBHYXVnZTMyIG9yIFVuc2lnbmVkMzIpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIkdhdWdlMzI6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgaWYgKGhpbnQpIHsKICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2hpbnRlZF9pbnRlZ2VyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFyLT52YWwuaW50ZWdlciwgJ3UnLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgc3ByaW50Zih0bXAsICIldSIsICh1bnNpZ25lZCBpbnQpKCp2YXItPnZhbC5pbnRlZ2VyICYgMHhmZmZmZmZmZikpOwogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSB0bXApKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYSBjb3VudGVyIHZhbHVlIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfY291bnRlcih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgY2hhciAgICAgICAgICAgIHRtcFszMl07CgogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fQ09VTlRFUikgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIENvdW50ZXIzMik6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiQ291bnRlcjMyOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIHNwcmludGYodG1wLCAiJXUiLCAodW5zaWduZWQgaW50KSgqdmFyLT52YWwuaW50ZWdlciAmIDB4ZmZmZmZmZmYpKTsKICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAoY29uc3QgdV9jaGFyICopIHRtcCkpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYSBuZXR3b3JrIGFkZHJlc3MgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19uZXR3b3JrYWRkcmVzcyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywgY29uc3QgY2hhciAqaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBpOwoKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX0lQQUREUkVTUykgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE5ldHdvcmtBZGRyZXNzKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJOZXR3b3JrIEFkZHJlc3M6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHdoaWxlICgoKm91dF9sZW4gKyAodmFyLT52YWxfbGVuICogMykgKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKGkgPSAwOyBpIDwgdmFyLT52YWxfbGVuOyBpKyspIHsKICAgICAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiJTAyWCIsIHZhci0+dmFsLnN0cmluZ1tpXSk7CiAgICAgICAgKm91dF9sZW4gKz0gMjsKICAgICAgICBpZiAoaSA8IHZhci0+dmFsX2xlbiAtIDEpIHsKICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJzonOwogICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGFuIGlwLWFkZHJlc3MgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19pcGFkZHJlc3ModV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgdV9jaGFyICAgICAgICAgKmlwID0gdmFyLT52YWwuc3RyaW5nOwoKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX0lQQUREUkVTUykgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIElwQWRkcmVzcyk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiSXBBZGRyZXNzOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIHdoaWxlICgoKm91dF9sZW4gKyAxNykgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBpZiAoaXApCiAgICAgICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIiVkLiVkLiVkLiVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcFswXSwgaXBbMV0sIGlwWzJdLCBpcFszXSk7CiAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGEgbnVsbCB2YWx1ZSBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX251bGwodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJOVUxMIjsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9OVUxMKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgTlVMTCk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpOwp9CgoKLyoqCiAqIFByaW50cyBhIGJpdCBzdHJpbmcgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19iaXRzdHJpbmcodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaW50ICAgICAgICAgICAgIGxlbiwgYml0OwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgY2hhciAgICAgICAgICAgKmVudW1fc3RyaW5nOwoKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX0JJVF9TVFIgJiYgdmFyLT50eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBCSVRTKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIlwiIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJCSVRTOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGlmICghc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLmJpdHN0cmluZywgdmFyLT52YWxfbGVuKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIlwiIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNwID0gdmFyLT52YWwuYml0c3RyaW5nOwogICAgICAgIGZvciAobGVuID0gMDsgbGVuIDwgKGludCkgdmFyLT52YWxfbGVuOyBsZW4rKykgewogICAgICAgICAgICBmb3IgKGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoKmNwICYgKDB4ODAgPj4gYml0KSkgewogICAgICAgICAgICAgICAgICAgIGVudW1fc3RyaW5nID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBmb3IgKDsgZW51bXM7IGVudW1zID0gZW51bXMtPm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1zLT52YWx1ZSA9PSAobGVuICogOCkgKyBiaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1fc3RyaW5nID0gZW51bXMtPmxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1fc3RyaW5nID09IE5VTEwgfHwKICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX1BSSU5UX05VTUVSSUNfRU5VTSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJWQgIiwgKGxlbiAqIDgpICsgYml0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiKCVkKSAiLCAobGVuICogOCkgKyBiaXQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgZW51bV9zdHJpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3ArKzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKaW50CnNwcmludF9yZWFsbG9jX25zYXBhZGRyZXNzKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLCBjb25zdCBjaGFyICpoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1bml0cykKewogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fTlNBUCkgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE5zYXBBZGRyZXNzKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJOc2FwQWRkcmVzczogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2hleHN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZywgdmFyLT52YWxfbGVuKTsKfQoKCi8qKgogKiBGYWxsYmFjayByb3V0aW5lIGZvciBhIGJhZCB0eXBlLCBwcmludHMgIlZhcmlhYmxlIGhhcyBiYWQgdHlwZSIgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19iYWR0eXBlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiVmFyaWFibGUgaGFzIGJhZCB0eXBlIjsKCiAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpOwp9CgoKCi8qKgogKiBVbml2ZXJzYWwgcHJpbnQgcm91dGluZSwgcHJpbnRzIGEgdmFyaWFibGUgaW50byBhIGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHZhcmlhYmxlIAogKiB0eXBlLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2J5X3R5cGUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIERFQlVHTVNHVEwoKCJvdXRwdXQiLCAic3ByaW50X2J5X3R5cGUsIHR5cGUgJWRcbiIsIHZhci0+dHlwZSkpOwoKICAgIHN3aXRjaCAodmFyLT50eXBlKSB7CiAgICBjYXNlIEFTTl9JTlRFR0VSOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19pbnRlZ2VyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9PQ1RFVF9TVFI6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgY2FzZSBBU05fQklUX1NUUjoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYml0c3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICBjYXNlIEFTTl9PUEFRVUU6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX29wYXF1ZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9PQkpFQ1RfSUQ6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX29iamVjdF9pZGVudGlmaWVyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fVElNRVRJQ0tTOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY190aW1ldGlja3MoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgIGNhc2UgQVNOX0dBVUdFOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19nYXVnZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX0NPVU5URVI6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2NvdW50ZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX0lQQUREUkVTUzoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfaXBhZGRyZXNzKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICBjYXNlIEFTTl9OVUxMOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19udWxsKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9VSU5URUdFUjoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfdWludGVnZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICBjYXNlIEFTTl9DT1VOVEVSNjQ6CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIGNhc2UgQVNOX09QQVFVRV9VNjQ6CiAgICBjYXNlIEFTTl9PUEFRVUVfSTY0OgogICAgY2FzZSBBU05fT1BBUVVFX0NPVU5URVI2NDoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMgKi8KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfY291bnRlcjY0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIGNhc2UgQVNOX09QQVFVRV9GTE9BVDoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfZmxvYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9PUEFRVUVfRE9VQkxFOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19kb3VibGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUyAqLwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic3ByaW50X2J5X3R5cGUiLCAiYmFkIHR5cGU6ICVkXG4iLCB2YXItPnR5cGUpKTsKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYmFkdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgfQp9CgoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKLyoqCiAqIFJldHJpZXZlcyB0aGUgdHJlZSBoZWFkLgogKgogKiBAcmV0dXJuIHRoZSB0cmVlIGhlYWQuCiAqLwpzdHJ1Y3QgdHJlZSAgICAqCmdldF90cmVlX2hlYWQodm9pZCkKewogICAgcmV0dXJuICh0cmVlX2hlYWQpOwp9CgpzdGF0aWMgY2hhciAgICAqY29uZm1pYmRpciA9IE5VTEw7CnN0YXRpYyBjaGFyICAgICpjb25mbWlicyA9IE5VTEw7CgpzdGF0aWMgdm9pZApoYW5kbGVfbWliZGlyc19jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBjaGFyICAgICAgICAgICAqY3RtcDsKCiAgICBpZiAoY29uZm1pYmRpcikgewogICAgICAgIGlmICgoKmxpbmUgPT0gJysnKSB8fCAoKmxpbmUgPT0gJy0nKSkgewogICAgICAgICAgICBjdG1wID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihjb25mbWliZGlyKSArIHN0cmxlbihsaW5lKSArIDIpOwogICAgICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaWJkaXIgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKCpsaW5lKysgPT0gJysnKQogICAgICAgICAgICAgICAgc3ByaW50ZihjdG1wLCAiJXMlYyVzIiwgY29uZm1pYmRpciwgRU5WX1NFUEFSQVRPUl9DSEFSLCBsaW5lKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3ByaW50ZihjdG1wLCAiJXMlYyVzIiwgbGluZSwgRU5WX1NFUEFSQVRPUl9DSEFSLCBjb25mbWliZGlyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjdG1wID0gc3RyZHVwKGxpbmUpOwogICAgICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgIm1pYnMgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFNOTVBfRlJFRShjb25mbWliZGlyKTsKICAgIH0gZWxzZSB7CiAgICAgICAgY3RtcCA9IHN0cmR1cChsaW5lKTsKICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAibWlicyBjb25mIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBjb25mbWliZGlyID0gY3RtcDsKICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgInVzaW5nIG1pYmRpcnM6ICVzXG4iLCBjb25mbWliZGlyKSk7Cn0KCnN0YXRpYyB2b2lkCmhhbmRsZV9taWJzX2NvbmYoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIGNoYXIgICAgICAgICAgICpjdG1wOwoKICAgIGlmIChjb25mbWlicykgewogICAgICAgIGlmICgoKmxpbmUgPT0gJysnKSB8fCAoKmxpbmUgPT0gJy0nKSkgewogICAgICAgICAgICBjdG1wID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihjb25mbWlicykgKyBzdHJsZW4obGluZSkgKyAyKTsKICAgICAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJtaWJzIGNvbmYgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZigqbGluZSsrID09ICcrJykKICAgICAgICAgICAgICAgIHNwcmludGYoY3RtcCwgIiVzJWMlcyIsIGNvbmZtaWJzLCBFTlZfU0VQQVJBVE9SX0NIQVIsIGxpbmUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzcHJpbnRmKGN0bXAsICIlcyVjJXMiLCBsaW5lLCBFTlZfU0VQQVJBVE9SX0NIQVIsIGNvbmZtaWJkaXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGN0bXAgPSBzdHJkdXAobGluZSk7CiAgICAgICAgICAgIGlmICghY3RtcCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAibWlicyBjb25mIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKGNvbmZtaWJzKTsKICAgIH0gZWxzZSB7CiAgICAgICAgY3RtcCA9IHN0cmR1cChsaW5lKTsKICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAibWlicyBjb25mIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBjb25mbWlicyA9IGN0bXA7CiAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJ1c2luZyBtaWJzOiAlc1xuIiwgY29uZm1pYnMpKTsKfQoKCnN0YXRpYyB2b2lkCmhhbmRsZV9taWJmaWxlX2NvbmYoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgInJlYWRpbmcgbWliZmlsZTogJXNcbiIsIGxpbmUpKTsKICAgIHJlYWRfbWliKGxpbmUpOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQKaGFuZGxlX3ByaW50X251bWVyaWMoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIGNvbnN0IGNoYXIgKnZhbHVlOwogICAgY2hhciAgICAgICAqc3Q7CgogICAgdmFsdWUgPSBzdHJ0b2tfcihsaW5lLCAiIFx0XG4iLCAmc3QpOwogICAgaWYgKHZhbHVlICYmICgKCSAgICAoc3RyY2FzZWNtcCh2YWx1ZSwgInllcyIpICA9PSAwKSB8fCAKCSAgICAoc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSA9PSAwKSB8fAoJICAgICgqdmFsdWUgPT0gJzEnKSApKSB7CgogICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDKTsKICAgIH0KfQoKY2hhciAgICAgICAgICAgKgpzbm1wX291dF90b2dnbGVfb3B0aW9ucyhjaGFyICpvcHRpb25zKQp7CiAgICB3aGlsZSAoKm9wdGlvbnMpIHsKICAgICAgICBzd2l0Y2ggKCpvcHRpb25zKyspIHsKICAgICAgICBjYXNlICcwJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfMkRJR0lUX0hFWF9PVVRQVVQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfU1RSSU5HX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfU1RSSU5HX09VVFBVVF9BU0NJSSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2InOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9CUkVBS0RPV05fT0lEUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfTlVNRVJJQ19FTlVNKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnRSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX09JRF9PVVRQVVRfRlVMTCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9PSURfT1VUUFVUX05VTUVSSUMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdxJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnUSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQsIDEpOwogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9TVUZGSVgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdTJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9NT0RVTEUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05VTUVSSUNfVElNRVRJQ0tTKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnVCc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9IRVhfVEVYVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3UnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9PSURfT1VUUFVUX1VDRCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1UnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9QUklOVF9VTklUUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3YnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfQkFSRV9WQUxVRSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9TVFJJTkdfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9TVFJJTkdfT1VUUFVUX0hFWCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1gnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVhURU5ERURfSU5ERVgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gb3B0aW9ucyAtIDE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCnZvaWQKc25tcF9vdXRfdG9nZ2xlX29wdGlvbnNfdXNhZ2UoY29uc3QgY2hhciAqbGVhZCwgRklMRSAqIG91dGYpCnsKICAgIGZwcmludGYob3V0ZiwgIiVzMDogIHByaW50IGxlYWRpbmcgMCBmb3Igc2luZ2xlLWRpZ2l0IGhleCBjaGFyYWN0ZXJzXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzYTogIHByaW50IGFsbCBzdHJpbmdzIGluIGFzY2lpIGZvcm1hdFxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc2I6ICBkbyBub3QgYnJlYWsgT0lEIGluZGV4ZXMgZG93blxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc2U6ICBwcmludCBlbnVtcyBudW1lcmljYWxseVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc0U6ICBlc2NhcGUgcXVvdGVzIGluIHN0cmluZyBpbmRpY2VzXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzZjogIHByaW50IGZ1bGwgT0lEcyBvbiBvdXRwdXRcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNuOiAgcHJpbnQgT0lEcyBudW1lcmljYWxseVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3E6ICBxdWljayBwcmludCBmb3IgZWFzaWVyIHBhcnNpbmdcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNROiAgcXVpY2sgcHJpbnQgd2l0aCBlcXVhbC1zaWduc1xuIiwgbGVhZCk7ICAgIC8qIEBASkRXICovCiAgICBmcHJpbnRmKG91dGYsICIlc3M6ICBwcmludCBvbmx5IGxhc3Qgc3ltYm9saWMgZWxlbWVudCBvZiBPSURcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNTOiAgcHJpbnQgTUlCIG1vZHVsZS1pZCBwbHVzIGxhc3QgZWxlbWVudFxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3Q6ICBwcmludCB0aW1ldGlja3MgdW5wYXJzZWQgYXMgbnVtZXJpYyBpbnRlZ2Vyc1xuIiwKICAgICAgICAgICAgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsCiAgICAgICAgICAgICIlc1Q6ICBwcmludCBodW1hbi1yZWFkYWJsZSB0ZXh0IGFsb25nIHdpdGggaGV4IHN0cmluZ3NcbiIsCiAgICAgICAgICAgIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXN1OiAgcHJpbnQgT0lEcyB1c2luZyBVQ0Qtc3R5bGUgcHJlZml4IHN1cHByZXNzaW9uXG4iLAogICAgICAgICAgICBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzVTogIGRvbid0IHByaW50IHVuaXRzXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzdjogIHByaW50IHZhbHVlcyBvbmx5IChub3QgT0lEID0gdmFsdWUpXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzeDogIHByaW50IGFsbCBzdHJpbmdzIGluIGhleCBmb3JtYXRcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNYOiAgZXh0ZW5kZWQgaW5kZXggZm9ybWF0XG4iLCBsZWFkKTsKfQoKY2hhciAqCnNubXBfaW5fb3B0aW9ucyhjaGFyICpvcHRhcmcsIGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndikKewogICAgY2hhciAqY3A7CgogICAgZm9yIChjcCA9IG9wdGFyZzsgKmNwOyBjcCsrKSB7CiAgICAgICAgc3dpdGNoICgqY3ApIHsKICAgICAgICBjYXNlICdiJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JFR0VYX0FDQ0VTUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1InOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUkFORE9NX0FDQ0VTUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3InOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9DSEVDS19SQU5HRSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTk9fRElTUExBWV9ISU5UKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SRUFEX1VDRF9TVFlMRV9PSUQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgLyogV2hhdCBpZiBhcmdjL2FyZ3YgYXJlIG51bGwgPyAqLwogICAgICAgICAgICBpZiAoISooKytjcCkpCiAgICAgICAgICAgICAgICBjcCA9IGFyZ3Zbb3B0aW5kKytdOwogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfT0lEU1VGRklYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgY2FzZSAnUyc6CiAgICAgICAgICAgIC8qIFdoYXQgaWYgYXJnYy9hcmd2IGFyZSBudWxsID8gKi8KICAgICAgICAgICAgaWYgKCEqKCsrY3ApKQogICAgICAgICAgICAgICAgY3AgPSBhcmd2W29wdGluZCsrXTsKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX09JRFBSRUZJWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgLyoKICAgICAgICAgICAgKiAgSGVyZT8gIE9yIGluIHNubXBfcGFyc2VfYXJncz8KICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIlVua25vd24gaW5wdXQgb3B0aW9uIHBhc3NlZCB0byAtSTogJWMuXG4iLCAqY3ApOwogICAgICAgICAgICAqLwogICAgICAgICAgICByZXR1cm4gY3A7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCmNoYXIgICAgICAgICAgICoKc25tcF9pbl90b2dnbGVfb3B0aW9ucyhjaGFyICpvcHRpb25zKQp7CiAgICByZXR1cm4gc25tcF9pbl9vcHRpb25zKCBvcHRpb25zLCAwLCBOVUxMICk7Cn0KCgovKioKICogUHJpbnRzIG91dCBhIGhlbHAgdXNhZ2UgZm9yIHRoZSBpbiogdG9nZ2xlIG9wdGlvbnMuCiAqCiAqIEBwYXJhbSBsZWFkICAgICAgVGhlIGxlYWQgdG8gcHJpbnQgZm9yIGV2ZXJ5IGxpbmUuCiAqIEBwYXJhbSBvdXRmICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZSB0by4KICogCiAqLwp2b2lkCnNubXBfaW5fdG9nZ2xlX29wdGlvbnNfdXNhZ2UoY29uc3QgY2hhciAqbGVhZCwgRklMRSAqIG91dGYpCnsKICAgIGZwcmludGYob3V0ZiwgIiVzYjogIGRvIGJlc3QvcmVnZXggbWF0Y2hpbmcgdG8gZmluZCBhIE1JQiBub2RlXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzaDogIGRvbid0IGFwcGx5IERJU1BMQVktSElOVHNcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNyOiAgZG8gbm90IGNoZWNrIHZhbHVlcyBmb3IgcmFuZ2UvdHlwZSBsZWdhbGl0eVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc1I6ICBkbyByYW5kb20gYWNjZXNzIHRvIE9JRCBsYWJlbHNcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLAogICAgICAgICAgICAiJXN1OiAgdG9wLWxldmVsIE9JRHMgbXVzdCBoYXZlICcuJyBwcmVmaXggKFVDRC1zdHlsZSlcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLAogICAgICAgICAgICAiJXNzIFNVRkZJWDogIEFwcGVuZCBhbGwgdGV4dHVhbCBPSURzIHdpdGggU1VGRklYIGJlZm9yZSBwYXJzaW5nXG4iLAogICAgICAgICAgICBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwKICAgICAgICAgICAgIiVzUyBQUkVGSVg6ICBQcmVwZW5kIGFsbCB0ZXh0dWFsIE9JRHMgd2l0aCBQUkVGSVggYmVmb3JlIHBhcnNpbmdcbiIsCiAgICAgICAgICAgIGxlYWQpOwp9CgovKioqCiAqCiAqLyAKdm9pZApyZWdpc3Rlcl9taWJfaGFuZGxlcnModm9pZCkKewojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgcmVnaXN0ZXJfcHJlbmV0c25tcF9taWJfaGFuZGxlcigic25tcCIsICJtaWJkaXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX21pYmRpcnNfY29uZiwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlttaWItZGlyc3wrbWliLWRpcnN8LW1pYi1kaXJzXSIpOwogICAgcmVnaXN0ZXJfcHJlbmV0c25tcF9taWJfaGFuZGxlcigic25tcCIsICJtaWJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX21pYnNfY29uZiwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlttaWItdG9rZW5zfCttaWItdG9rZW5zXSIpOwogICAgcmVnaXN0ZXJfY29uZmlnX2hhbmRsZXIoInNubXAiLCAibWliZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfbWliZmlsZV9jb25mLCBOVUxMLCAibWliZmlsZS10by1yZWFkIik7CiAgICAvKgogICAgICogcmVnaXN0ZXIgdGhlIHNubXAuY29uZiBjb25maWd1cmF0aW9uIGhhbmRsZXJzIGZvciBkZWZhdWx0CiAgICAgKiBwYXJzaW5nIGJlaGF2aW91ciAKICAgICAqLwoKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJzaG93TWliRXJyb3JzIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9FUlJPUlMpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgImNvbW1lbnRUb0VPTCIsICAgICAvKiBEZXNjcmliZXMgYWN0dWFsIGJlaGF2aW91ciAqLwogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCX0NPTU1FTlRfVEVSTSk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAic3RyaWN0Q29tbWVudFRlcm0iLCAgICAvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfQ09NTUVOVF9URVJNKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJtaWJBbGxvd1VuZGVybGluZSIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfUEFSU0VfTEFCRUwpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0lOVEVHRVIsICJzbm1wIiwgIm1pYldhcm5pbmdMZXZlbCIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgIm1pYlJlcGxhY2VXaXRoTGF0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9SRVBMQUNFKTsKI2VuZGlmCgogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgInByaW50TnVtZXJpY0VudW1zIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX05VTUVSSUNfRU5VTSk7CiAgICByZWdpc3Rlcl9wcmVuZXRzbm1wX21pYl9oYW5kbGVyKCJzbm1wIiwgInByaW50TnVtZXJpY09pZHMiLAogICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9wcmludF9udW1lcmljLCBOVUxMLCAiKDF8eWVzfHRydWV8MHxub3xmYWxzZSkiKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJlc2NhcGVRdW90ZXMiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUyk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAiZG9udEJyZWFrZG93bk9pZHMiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9CUkVBS0RPV05fT0lEUyk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAicXVpY2tQcmludGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAibnVtZXJpY1RpbWV0aWNrcyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9OVU1FUklDX1RJTUVUSUNLUyk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fSU5URUdFUiwgInNubXAiLCAib2lkT3V0cHV0Rm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFUKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9JTlRFR0VSLCAic25tcCIsICJzdWZmaXhQcmludGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAiZXh0ZW5kZWRJbmRleCIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FWFRFTkRFRF9JTkRFWCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAicHJpbnRIZXhUZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX0hFWF9URVhUKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJwcmludFZhbHVlT25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9CQVJFX1ZBTFVFKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJkb250UHJpbnRVbml0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9ET05UX1BSSU5UX1VOSVRTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9JTlRFR0VSLCAic25tcCIsICJoZXhPdXRwdXRMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfSEVYX09VVFBVVF9MRU5HVEgpOwp9CgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwovKgogKiBmdW5jdGlvbiA6IG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkKICogICAgICAgICAgICAtIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgc3RyaW5nIG9mIHRoZSBkaXJlY3RvcmllcwogKiAgICAgICAgICAgICAgZnJvbSB3aGljaCB0aGUgTUlCIG1vZHVsZXMgd2lsbCBiZSBzZWFyY2hlZCBvcgogKiAgICAgICAgICAgICAgbG9hZGVkLgogKiBhcmd1bWVudHM6IGNvbnN0IGNoYXIgKmRpciwgd2hpY2ggYXJlIHRoZSBkaXJlY3RvcmllcwogKiAgICAgICAgICAgICAgZnJvbSB3aGljaCB0aGUgTUlCIG1vZHVsZXMgd2lsbCBiZSBzZWFyY2hlZCBvcgogKiAgICAgICAgICAgICAgbG9hZGVkLgogKiByZXR1cm5zICA6IC0KICovCnZvaWQKbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShjb25zdCBjaGFyICpkaXIpCnsKICAgIGNvbnN0IGNoYXIgKm5ld2RpcjsKICAgIGNoYXIgKm9sZGRpciwgKnRtcGRpciA9IE5VTEw7CgogICAgREVCVUdUUkFDRTsKICAgIGlmIChOVUxMID09IGRpcikgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIAogICAgb2xkZGlyID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKCQkJCSAgIE5FVFNOTVBfRFNfTElCX01JQkRJUlMpOwogICAgaWYgKG9sZGRpcikgewogICAgICAgIGlmICgoKmRpciA9PSAnKycpIHx8ICgqZGlyID09ICctJykpIHsKICAgICAgICAgICAgLyoqIE5ldyBkaXIgc3RhcnRzIHdpdGggJysnLCB0aHVzIHdlIGFkZCBpdC4gKi8KICAgICAgICAgICAgdG1wZGlyID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKGRpcikgKyBzdHJsZW4ob2xkZGlyKSArIDIpOwogICAgICAgICAgICBpZiAoIXRtcGRpcikgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAic2V0IG1pYmRpciBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgqZGlyKysgPT0gJysnKQogICAgICAgICAgICAgICAgc3ByaW50Zih0bXBkaXIsICIlcyVjJXMiLCBvbGRkaXIsIEVOVl9TRVBBUkFUT1JfQ0hBUiwgZGlyKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3ByaW50Zih0bXBkaXIsICIlcyVjJXMiLCBkaXIsIEVOVl9TRVBBUkFUT1JfQ0hBUiwgb2xkZGlyKTsKICAgICAgICAgICAgbmV3ZGlyID0gdG1wZGlyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ld2RpciA9IGRpcjsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIC8qKiBJZiBkaXIgc3RhcnRzIHdpdGggJysnIHNraXAgJysnIGl0LiAqLwogICAgICAgIG5ld2RpciA9ICgoKmRpciA9PSAnKycpID8gKytkaXIgOiBkaXIpOwogICAgfQogICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCRElSUywKICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdkaXIpOwoKICAgIC8qKiBzZXRfc3RyaW5nIGNhbGxzIHN0cmR1cCwgc28gaWYgd2UgYWxsb2NhdGVkIG1lbW9yeSwgZnJlZSBpdCAqLwogICAgaWYgKHRtcGRpciA9PSBuZXdkaXIpIHsKICAgICAgICBTTk1QX0ZSRUUodG1wZGlyKTsKICAgIH0KfQoKLyoKICogZnVuY3Rpb24gOiBuZXRzbm1wX2dldF9taWJfZGlyZWN0b3J5CiAqICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcgb2YgdGhlIGRpcmVjdG9yaWVzCiAqICAgICAgICAgICAgICBmcm9tIHdoaWNoIHRoZSBNSUIgbW9kdWxlcyB3aWxsIGJlIHNlYXJjaGVkIG9yCiAqICAgICAgICAgICAgICBsb2FkZWQuCiAqICAgICAgICAgICAgICBJZiB0aGUgdmFsdWUgc3RpbGwgZG9lcyBub3QgZXhpc3RzLCBpdCB3aWxsIGJlIG1hZGUKICogICAgICAgICAgICAgIGZyb20gdGhlIGV2aXJvbm1lbnQgdmFyaWFibGUgJ01JQkRJUlMnIGFuZC9vciB0aGUKICogICAgICAgICAgICAgIGRlZmF1bHQuCiAqIGFyZ3VtZW50czogLQogKiByZXR1cm5zICA6IGNoYXIgKiBvZiB0aGUgZGlyZWN0b3JpZXMgaW4gd2hpY2ggdGhlIE1JQiBtb2R1bGVzCiAqICAgICAgICAgICAgd2lsbCBiZSBzZWFyY2hlZC9sb2FkZWQuCiAqLwoKY2hhciAqCm5ldHNubXBfZ2V0X21pYl9kaXJlY3Rvcnkodm9pZCkKewogICAgY2hhciAqZGlyOwoKICAgIERFQlVHVFJBQ0U7CiAgICBkaXIgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJESVJTKTsKICAgIGlmIChkaXIgPT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJubyBtaWIgZGlyZWN0b3JpZXMgc2V0XG4iKSk7CgogICAgICAgIC8qKiBDaGVjayBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0ICovCiAgICAgICAgZGlyID0gbmV0c25tcF9nZXRlbnYoIk1JQkRJUlMiKTsKICAgICAgICBpZiAoZGlyID09IE5VTEwpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm5vIG1pYiBkaXJlY3RvcmllcyBzZXQgYnkgZW52aXJvbm1lbnRcbiIpKTsKICAgICAgICAgICAgLyoqIE5vdCBzZXQgdXNlIGhhcmQgY29kZWQgcGF0aCAqLwogICAgICAgICAgICBpZiAoY29uZm1pYmRpciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibm8gbWliIGRpcmVjdG9yaWVzIHNldCBieSBjb25maWdcbiIpKTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoTkVUU05NUF9ERUZBVUxUX01JQkRJUlMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCgqY29uZm1pYmRpciA9PSAnKycpIHx8ICgqY29uZm1pYmRpciA9PSAnLScpKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibWliIGRpcmVjdG9yaWVzIHNldCBieSBjb25maWcgKGJ1dCBhZGRlZClcbiIpKTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoTkVUU05NUF9ERUZBVUxUX01JQkRJUlMpOwogICAgICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShjb25mbWliZGlyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgc2V0IGJ5IGNvbmZpZ1xuIikpOwogICAgICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShjb25mbWliZGlyKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoKCpkaXIgPT0gJysnKSB8fCAoKmRpciA9PSAnLScpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgc2V0IGJ5IGVudmlyb25tZW50IChidXQgYWRkZWQpXG4iKSk7CiAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoTkVUU05NUF9ERUZBVUxUX01JQkRJUlMpOwogICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KGRpcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm1pYiBkaXJlY3RvcmllcyBzZXQgYnkgZW52aXJvbm1lbnRcbiIpKTsKICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShkaXIpOwogICAgICAgIH0KICAgICAgICBkaXIgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJESVJTKTsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgc2V0ICclcydcbiIsIGRpcikpOwogICAgcmV0dXJuKGRpcik7Cn0KCi8qCiAqIGZ1bmN0aW9uIDogbmV0c25tcF9maXh1cF9taWJfZGlyZWN0b3J5CiAqIGFyZ3VtZW50czogLQogKiByZXR1cm5zICA6IC0KICovCnZvaWQKbmV0c25tcF9maXh1cF9taWJfZGlyZWN0b3J5KHZvaWQpCnsKICAgIGNoYXIgKmhvbWVwYXRoID0gbmV0c25tcF9nZXRlbnYoIkhPTUUiKTsKICAgIGNoYXIgKm1pYnBhdGggPSBuZXRzbm1wX2dldF9taWJfZGlyZWN0b3J5KCk7CiAgICBjaGFyICpvbGRtaWJwYXRoID0gTlVMTDsKICAgIGNoYXIgKnB0cl9ob21lOwogICAgY2hhciAqbmV3X21pYnBhdGg7CgogICAgREVCVUdUUkFDRTsKICAgIGlmIChob21lcGF0aCAmJiBtaWJwYXRoKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImZpeHVwX21pYl9kaXJlY3RvcnkiLCAibWliIGRpcmVjdG9yaWVzICclcydcbiIsIG1pYnBhdGgpKTsKICAgICAgICB3aGlsZSAoKHB0cl9ob21lID0gc3Ryc3RyKG1pYnBhdGgsICIkSE9NRSIpKSkgewogICAgICAgICAgICBuZXdfbWlicGF0aCA9IChjaGFyICopbWFsbG9jKHN0cmxlbihtaWJwYXRoKSAtIHN0cmxlbigiJEhPTUUiKSArCgkJCQkJIHN0cmxlbihob21lcGF0aCkrMSk7CiAgICAgICAgICAgIGlmIChuZXdfbWlicGF0aCkgewogICAgICAgICAgICAgICAgKnB0cl9ob21lID0gMDsgLyogbnVsbCBvdXQgdGhlIHNwb3Qgd2hlcmUgd2Ugc3RvcCBjb3B5aW5nICovCiAgICAgICAgICAgICAgICBzcHJpbnRmKG5ld19taWJwYXRoLCAiJXMlcyVzIiwgbWlicGF0aCwgaG9tZXBhdGgsCgkJCXB0cl9ob21lICsgc3RybGVuKCIkSE9NRSIpKTsKICAgICAgICAgICAgICAgIC8qKiBzd2FwIGluIHRoZSBuZXcgdmFsdWUgYW5kIHJlcGVhdCAqLwogICAgICAgICAgICAgICAgbWlicGF0aCA9IG5ld19taWJwYXRoOwoJCWlmIChvbGRtaWJwYXRoICE9IE5VTEwpIHsKCQkgICAgU05NUF9GUkVFKG9sZG1pYnBhdGgpOwoJCX0KCQlvbGRtaWJwYXRoID0gbmV3X21pYnBhdGg7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShtaWJwYXRoKTsKCQoJLyogIFRoZSBhYm92ZSBjb3BpZXMgdGhlIG1pYnBhdGggZm9yIHVzLCBzby4uLiAgKi8KCglpZiAob2xkbWlicGF0aCAhPSBOVUxMKSB7CgkgICAgU05NUF9GUkVFKG9sZG1pYnBhdGgpOwoJfQoKICAgIH0KCn0KCi8qKgogKiBJbml0aWFsaXNlcyB0aGUgbWliIHJlYWRlci4KICoKICogUmVhZHMgaW4gYWxsIHNldHRpbmdzIGZyb20gdGhlIGVudmlyb25tZW50LgogKi8Kdm9pZApuZXRzbm1wX2luaXRfbWliKHZvaWQpCnsKICAgIGNvbnN0IGNoYXIgICAgICpwcmVmaXg7CiAgICBjaGFyICAgICAgICAgICAqZW52X3ZhciwgKmVudHJ5OwogICAgUHJlZml4TGlzdFB0ciAgIHBwID0gJm1pYl9wcmVmaXhlc1swXTsKICAgIGNoYXIgICAgICAgICAgICpzdCA9IE5VTEw7CgogICAgaWYgKE1pYikKICAgICAgICByZXR1cm47CiAgICBuZXRzbm1wX2luaXRfbWliX2ludGVybmFscygpOwoKICAgIC8qCiAgICAgKiBJbml0aWFsaXNlIHRoZSBNSUIgZGlyZWN0b3J5L2llcyAKICAgICAqLwogICAgbmV0c25tcF9maXh1cF9taWJfZGlyZWN0b3J5KCk7CiAgICBlbnZfdmFyID0gc3RyZHVwKG5ldHNubXBfZ2V0X21pYl9kaXJlY3RvcnkoKSk7CiAgICBuZXRzbm1wX21pYmluZGV4X2xvYWQoKTsKCiAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLAogICAgICAgICAgICAgICAgIlNlZW4gTUlCRElSUzogTG9va2luZyBpbiAnJXMnIGZvciBtaWIgZGlycyAuLi5cbiIsCiAgICAgICAgICAgICAgICBlbnZfdmFyKSk7CgogICAgZW50cnkgPSBzdHJ0b2tfcihlbnZfdmFyLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgYWRkX21pYmRpcihlbnRyeSk7CiAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgfQogICAgU05NUF9GUkVFKGVudl92YXIpOwoKICAgIGVudl92YXIgPSBuZXRzbm1wX2dldGVudigiTUlCRklMRVMiKTsKICAgIGlmIChlbnZfdmFyICE9IE5VTEwpIHsKICAgICAgICBpZiAoKmVudl92YXIgPT0gJysnKQogICAgICAgICAgICBlbnRyeSA9IHN0cnRva19yKGVudl92YXIrMSwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVudHJ5ID0gc3RydG9rX3IoZW52X3ZhciwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgICAgICB3aGlsZSAoZW50cnkpIHsKICAgICAgICAgICAgYWRkX21pYmZpbGUoZW50cnksIE5VTEwsIE5VTEwpOwogICAgICAgICAgICBlbnRyeSA9IHN0cnRva19yKE5VTEwsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICAgICAgfQogICAgfQoKICAgIG5ldHNubXBfaW5pdF9taWJfaW50ZXJuYWxzKCk7CgogICAgLyoKICAgICAqIFJlYWQgaW4gYW55IG1vZHVsZXMgb3IgbWlicyByZXF1ZXN0ZWQgCiAgICAgKi8KCiAgICBlbnZfdmFyID0gbmV0c25tcF9nZXRlbnYoIk1JQlMiKTsKICAgIGlmIChlbnZfdmFyID09IE5VTEwpIHsKICAgICAgICBpZiAoY29uZm1pYnMgIT0gTlVMTCkKICAgICAgICAgICAgZW52X3ZhciA9IHN0cmR1cChjb25mbWlicyk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBlbnZfdmFyID0gc3RyZHVwKE5FVFNOTVBfREVGQVVMVF9NSUJTKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZW52X3ZhciA9IHN0cmR1cChlbnZfdmFyKTsKICAgIH0KICAgIGlmIChlbnZfdmFyICYmICgoKmVudl92YXIgPT0gJysnKSB8fCAoKmVudl92YXIgPT0gJy0nKSkpIHsKICAgICAgICBlbnRyeSA9CiAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzdHJsZW4oTkVUU05NUF9ERUZBVUxUX01JQlMpICsgc3RybGVuKGVudl92YXIpICsgMik7CiAgICAgICAgaWYgKCFlbnRyeSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLCAiZW52IG1pYnMgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgU05NUF9GUkVFKGVudl92YXIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCplbnZfdmFyID09ICcrJykKICAgICAgICAgICAgICAgIHNwcmludGYoZW50cnksICIlcyVjJXMiLCBORVRTTk1QX0RFRkFVTFRfTUlCUywgRU5WX1NFUEFSQVRPUl9DSEFSLAogICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyKzEpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzcHJpbnRmKGVudHJ5LCAiJXMlYyVzIiwgZW52X3ZhcisxLCBFTlZfU0VQQVJBVE9SX0NIQVIsCiAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfREVGQVVMVF9NSUJTICk7CiAgICAgICAgfQogICAgICAgIFNOTVBfRlJFRShlbnZfdmFyKTsKICAgICAgICBlbnZfdmFyID0gZW50cnk7CiAgICB9CgogICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwKICAgICAgICAgICAgICAgICJTZWVuIE1JQlM6IExvb2tpbmcgaW4gJyVzJyBmb3IgbWliIGZpbGVzIC4uLlxuIiwKICAgICAgICAgICAgICAgIGVudl92YXIpKTsKICAgIGVudHJ5ID0gc3RydG9rX3IoZW52X3ZhciwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgIGlmIChzdHJjYXNlY21wKGVudHJ5LCBERUJVR19BTFdBWVNfVE9LRU4pID09IDApIHsKICAgICAgICAgICAgcmVhZF9hbGxfbWlicygpOwogICAgICAgIH0gZWxzZSBpZiAoc3Ryc3RyKGVudHJ5LCAiLyIpICE9IE5VTEwpIHsKICAgICAgICAgICAgcmVhZF9taWIoZW50cnkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ldHNubXBfcmVhZF9tb2R1bGUoZW50cnkpOwogICAgICAgIH0KICAgICAgICBlbnRyeSA9IHN0cnRva19yKE5VTEwsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICB9CiAgICBhZG9wdF9vcnBoYW5zKCk7CiAgICBTTk1QX0ZSRUUoZW52X3Zhcik7CgogICAgZW52X3ZhciA9IG5ldHNubXBfZ2V0ZW52KCJNSUJGSUxFUyIpOwogICAgaWYgKGVudl92YXIgIT0gTlVMTCkgewogICAgICAgIGlmICgoKmVudl92YXIgPT0gJysnKSB8fCAoKmVudl92YXIgPT0gJy0nKSkgewojaWZkZWYgTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTCiAgICAgICAgICAgIGVudHJ5ID0KICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzdHJsZW4oTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGVudl92YXIpICsgMik7CiAgICAgICAgICAgIGlmICghZW50cnkpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsICJlbnYgbWliZmlsZXMgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICgqZW52X3ZhcisrID09ICcrJykKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGVudHJ5LCAiJXMlYyVzIiwgTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTLCBFTlZfU0VQQVJBVE9SX0NIQVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyICk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihlbnRyeSwgIiVzJWMlcyIsIGVudl92YXIsIEVOVl9TRVBBUkFUT1JfQ0hBUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFNOTVBfRlJFRShlbnZfdmFyKTsKICAgICAgICAgICAgZW52X3ZhciA9IGVudHJ5OwojZWxzZQogICAgICAgICAgICBlbnZfdmFyID0gc3RyZHVwKGVudl92YXIgKyAxKTsKI2VuZGlmCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZW52X3ZhciA9IHN0cmR1cChlbnZfdmFyKTsKICAgICAgICB9CiAgICB9IGVsc2UgewojaWZkZWYgTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTCiAgICAgICAgZW52X3ZhciA9IHN0cmR1cChORVRTTk1QX0RFRkFVTFRfTUlCRklMRVMpOwojZW5kaWYKICAgIH0KCiAgICBpZiAoZW52X3ZhciAhPSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwKICAgICAgICAgICAgICAgICAgICAiU2VlbiBNSUJGSUxFUzogTG9va2luZyBpbiAnJXMnIGZvciBtaWIgZmlsZXMgLi4uXG4iLAogICAgICAgICAgICAgICAgICAgIGVudl92YXIpKTsKICAgICAgICBlbnRyeSA9IHN0cnRva19yKGVudl92YXIsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICAgICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgICAgIHJlYWRfbWliKGVudHJ5KTsKICAgICAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUoZW52X3Zhcik7CiAgICB9CgogICAgcHJlZml4ID0gbmV0c25tcF9nZXRlbnYoIlBSRUZJWCIpOwoKICAgIGlmICghcHJlZml4KQogICAgICAgIHByZWZpeCA9IFN0YW5kYXJkX1ByZWZpeDsKCiAgICBQcmVmaXggPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHByZWZpeCkgKyAyKTsKICAgIGlmICghUHJlZml4KQogICAgICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsICJQcmVmaXggbWFsbG9jIGZhaWxlZCIpKTsKICAgIGVsc2UKICAgICAgICBzdHJjcHkoUHJlZml4LCBwcmVmaXgpOwoKICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsCiAgICAgICAgICAgICAgICAiU2VlbiBQUkVGSVg6IExvb2tpbmcgaW4gJyVzJyBmb3IgcHJlZml4IC4uLlxuIiwgUHJlZml4KSk7CgogICAgLyoKICAgICAqIHJlbW92ZSB0cmFpbGluZyBkb3QgCiAgICAgKi8KICAgIGlmIChQcmVmaXgpIHsKICAgICAgICBlbnZfdmFyID0gJlByZWZpeFtzdHJsZW4oUHJlZml4KSAtIDFdOwogICAgICAgIGlmICgqZW52X3ZhciA9PSAnLicpCiAgICAgICAgICAgICplbnZfdmFyID0gJ1wwJzsKICAgIH0KCiAgICBwcC0+c3RyID0gUHJlZml4OyAgICAgICAgICAgLyogZml4dXAgZmlyc3QgbWliX3ByZWZpeCBlbnRyeSAqLwogICAgLyoKICAgICAqIG5vdyB0aGF0IHRoZSBsaXN0IG9mIHByZWZpeGVzIGlzIGJ1aWx0LCBzYXZlIGVhY2ggc3RyaW5nIGxlbmd0aC4gCiAgICAgKi8KICAgIHdoaWxlIChwcC0+c3RyKSB7CiAgICAgICAgcHAtPmxlbiA9IHN0cmxlbihwcC0+c3RyKTsKICAgICAgICBwcCsrOwogICAgfQoKICAgIE1pYiA9IHRyZWVfaGVhZDsgICAgICAgICAgICAvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwogICAgdHJlZV90b3AgPSAoc3RydWN0IHRyZWUgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdHJlZSkpOwogICAgLyoKICAgICAqIFhYIGVycm9yIGNoZWNrID8gCiAgICAgKi8KICAgIGlmICh0cmVlX3RvcCkgewogICAgICAgIHRyZWVfdG9wLT5sYWJlbCA9IHN0cmR1cCgiKHRvcCkiKTsKICAgICAgICB0cmVlX3RvcC0+Y2hpbGRfbGlzdCA9IHRyZWVfaGVhZDsKICAgIH0KfQoKI2lmbmRlZiBORVRTTk1QX05PX0xFR0FDWV9ERUZJTklUSU9OUwp2b2lkCmluaXRfbWliKHZvaWQpCnsKICAgIG5ldHNubXBfaW5pdF9taWIoKTsKfQojZW5kaWYKCgovKgogKiBIYW5kbGUgTUlCIGluZGV4ZXMgY2VudHJhbGx5CiAqLwpzdGF0aWMgaW50IF9taWJpbmRleCAgICAgPSAwOyAgIC8qIExhc3QgaW5kZXggaW4gdXNlICovCnN0YXRpYyBpbnQgX21pYmluZGV4X21heCA9IDA7ICAgLyogU2l6ZSBvZiBpbmRleCBhcnJheSAqLwpjaGFyICAgICAqKl9taWJpbmRleGVzICAgPSBOVUxMOwoKaW50IF9taWJpbmRleF9hZGQoIGNvbnN0IGNoYXIgKmRpcm5hbWUsIGludCBpICk7CnZvaWQKbmV0c25tcF9taWJpbmRleF9sb2FkKCB2b2lkICkKewogICAgRElSICpkaXI7CiAgICBzdHJ1Y3QgZGlyZW50ICpmaWxlOwogICAgRklMRSAqZnA7CiAgICBjaGFyIHRtcGJ1ZlsgMzAwXTsKICAgIGNoYXIgdG1wYnVmMlszMDBdOwogICAgaW50ICBpOwogICAgY2hhciAqY3A7CgogICAgLyoKICAgICAqIE9wZW4gdGhlIE1JQiBpbmRleCBkaXJlY3RvcnksIG9yIGNyZWF0ZSBpdCAoZW1wdHkpCiAgICAgKi8KICAgIHNucHJpbnRmKCB0bXBidWYsIHNpemVvZih0bXBidWYpLCAiJXMvbWliX2luZGV4ZXMiLAogICAgICAgICAgICAgIGdldF9wZXJzaXN0ZW50X2RpcmVjdG9yeSgpKTsKICAgIHRtcGJ1ZltzaXplb2YodG1wYnVmKS0xXSA9IDA7CiAgICBkaXIgPSBvcGVuZGlyKCB0bXBidWYgKTsKICAgIGlmICggZGlyID09IE5VTEwgKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYmluZGV4IiwgImxvYWQ6IChuZXcpXG4iKSk7CiAgICAgICAgbWtkaXJoaWVyKCB0bXBidWYsIE5FVFNOTVBfQUdFTlRfRElSRUNUT1JZX01PREUsIDApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKgogICAgICogQ3JlYXRlIGEgbGlzdCBvZiB3aGljaCBkaXJlY3RvcnkgZWFjaCBmaWxlIHJlZmVycyB0bwogICAgICovCiAgICB3aGlsZSAoKGZpbGUgPSByZWFkZGlyKCBkaXIgKSkpIHsKICAgICAgICBpZiAoICFpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKShmaWxlLT5kX25hbWVbMF0pKSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgaSA9IGF0b2koIGZpbGUtPmRfbmFtZSApOwoKICAgICAgICBzbnByaW50ZiggdG1wYnVmLCBzaXplb2YodG1wYnVmKSwgIiVzL21pYl9pbmRleGVzLyVkIiwKICAgICAgICAgICAgICBnZXRfcGVyc2lzdGVudF9kaXJlY3RvcnkoKSwgaSApOwogICAgICAgIHRtcGJ1ZltzaXplb2YodG1wYnVmKS0xXSA9IDA7CiAgICAgICAgZnAgPSBmb3BlbiggdG1wYnVmLCAiciIgKTsKICAgICAgICBpZiAoIWZwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjcCA9IGZnZXRzKCB0bXBidWYyLCBzaXplb2YodG1wYnVmMiksIGZwICk7CiAgICAgICAgaWYgKCAhY3AgKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJFbXB0eSBNSUIgaW5kZXggKCVkKVxuIiwgaSkpOwogICAgICAgICAgICBmY2xvc2UoZnApOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdG1wYnVmMltzdHJsZW4odG1wYnVmMiktMV0gPSAwOwogICAgICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJsb2FkOiAoJWQpICVzXG4iLCBpLCB0bXBidWYyKSk7CiAgICAgICAgKHZvaWQpX21pYmluZGV4X2FkZCggdG1wYnVmMis0LCBpICk7ICAvKiBTa2lwICdESVIgJyAqLwogICAgICAgIGZjbG9zZSggZnAgKTsKICAgIH0KICAgIGNsb3NlZGlyKCBkaXIgKTsKfQoKY2hhciAqCm5ldHNubXBfbWliaW5kZXhfbG9va3VwKCBjb25zdCBjaGFyICpkaXJuYW1lICkKewogICAgaW50IGk7CiAgICBzdGF0aWMgY2hhciB0bXBidWZbMzAwXTsKCiAgICBmb3IgKGk9MDsgaTxfbWliaW5kZXg7IGkrKykgewogICAgICAgIGlmICggX21pYmluZGV4ZXNbaV0gJiYKICAgICAgICAgICAgIHN0cmNtcCggX21pYmluZGV4ZXNbaV0sIGRpcm5hbWUgKSA9PSAwKSB7CiAgICAgICAgICAgICBzbnByaW50Zih0bXBidWYsIHNpemVvZih0bXBidWYpLCAiJXMvbWliX2luZGV4ZXMvJWQiLAogICAgICAgICAgICAgICAgICAgICAgZ2V0X3BlcnNpc3RlbnRfZGlyZWN0b3J5KCksIGkpOwogICAgICAgICAgICAgdG1wYnVmW3NpemVvZih0bXBidWYpLTFdID0gMDsKICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJsb29rdXA6ICVzICglZCkgJXNcbiIsIGRpcm5hbWUsIGksIHRtcGJ1ZiApKTsKICAgICAgICAgICAgIHJldHVybiB0bXBidWY7CiAgICAgICAgfQogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYmluZGV4IiwgImxvb2t1cDogKG5vbmUpXG4iKSk7CiAgICByZXR1cm4gTlVMTDsKfQoKaW50Cl9taWJpbmRleF9hZGQoIGNvbnN0IGNoYXIgKmRpcm5hbWUsIGludCBpICkKewogICAgY29uc3QgaW50IG9sZF9taWJpbmRleF9tYXggPSBfbWliaW5kZXhfbWF4OwoKICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJhZGQ6ICVzICglZClcbiIsIGRpcm5hbWUsIGkgKSk7CiAgICBpZiAoIGkgPT0gLTEgKQogICAgICAgIGkgPSBfbWliaW5kZXgrKzsKICAgIGlmICggaSA+PSBfbWliaW5kZXhfbWF4ICkgewogICAgICAgIC8qCiAgICAgICAgICogSWYgdGhlIGluZGV4IGFycmF5IGlzIGZ1bGwgKG9yIG5vbi1leGlzdGVudCkKICAgICAgICAgKiAgIHRoZW4gZXhwYW5kIChvciBjcmVhdGUpIGl0CiAgICAgICAgICovCiAgICAgICAgX21pYmluZGV4X21heCA9IGkgKyAxMDsKICAgICAgICBfbWliaW5kZXhlcyA9IHJlYWxsb2MoX21pYmluZGV4ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9taWJpbmRleF9tYXggKiBzaXplb2YoX21pYmluZGV4ZXNbMF0pKTsKICAgICAgICBuZXRzbm1wX2Fzc2VydChfbWliaW5kZXhlcyk7CiAgICAgICAgbWVtc2V0KF9taWJpbmRleGVzICsgb2xkX21pYmluZGV4X21heCwgMCwKICAgICAgICAgICAgICAgKF9taWJpbmRleF9tYXggLSBvbGRfbWliaW5kZXhfbWF4KSAqIHNpemVvZihfbWliaW5kZXhlc1swXSkpOwogICAgfQoKICAgIF9taWJpbmRleGVzWyBpIF0gPSBzdHJkdXAoIGRpcm5hbWUgKTsKICAgIGlmICggaSA+PSBfbWliaW5kZXggKQogICAgICAgIF9taWJpbmRleCA9IGkrMTsKCiAgICBERUJVR01TR1RMKCgibWliaW5kZXgiLCAiYWRkOiAlZC8lZC8lZFxuIiwgaSwgX21pYmluZGV4LCBfbWliaW5kZXhfbWF4ICkpOwogICAgcmV0dXJuIGk7Cn0KICAgIApGSUxFICoKbmV0c25tcF9taWJpbmRleF9uZXcoIGNvbnN0IGNoYXIgKmRpcm5hbWUgKQp7CiAgICBGSUxFICpmcDsKICAgIGNoYXIgIHRtcGJ1ZlszMDBdOwogICAgY2hhciAqY3A7CiAgICBpbnQgICBpOwoKICAgIGNwID0gbmV0c25tcF9taWJpbmRleF9sb29rdXAoIGRpcm5hbWUgKTsKICAgIGlmICghY3ApIHsKICAgICAgICBpICA9IF9taWJpbmRleF9hZGQoIGRpcm5hbWUsIC0xICk7CiAgICAgICAgc25wcmludGYoIHRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZiksICIlcy9taWJfaW5kZXhlcy8lZCIsCiAgICAgICAgICAgICAgICAgIGdldF9wZXJzaXN0ZW50X2RpcmVjdG9yeSgpLCBpICk7CiAgICAgICAgdG1wYnVmW3NpemVvZih0bXBidWYpLTFdID0gMDsKICAgICAgICBjcCA9IHRtcGJ1ZjsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJuZXc6ICVzICglcylcbiIsIGRpcm5hbWUsIGNwICkpOwogICAgZnAgPSBmb3BlbiggY3AsICJ3IiApOwogICAgaWYgKGZwKQogICAgICAgIGZwcmludGYoIGZwLCAiRElSICVzXG4iLCBkaXJuYW1lICk7CiAgICByZXR1cm4gZnA7Cn0KCgovKioKICogVW5sb2FkcyBhbGwgbWlicy4KICovCnZvaWQKc2h1dGRvd25fbWliKHZvaWQpCnsKICAgIHVubG9hZF9hbGxfbWlicygpOwogICAgaWYgKHRyZWVfdG9wKSB7CiAgICAgICAgaWYgKHRyZWVfdG9wLT5sYWJlbCkKICAgICAgICAgICAgU05NUF9GUkVFKHRyZWVfdG9wLT5sYWJlbCk7CiAgICAgICAgU05NUF9GUkVFKHRyZWVfdG9wKTsKICAgICAgICB0cmVlX3RvcCA9IE5VTEw7CiAgICB9CiAgICB0cmVlX2hlYWQgPSBOVUxMOwogICAgTWliID0gTlVMTDsKICAgIGlmIChfbWliaW5kZXhlcykgewogICAgICAgIGludCBpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBfbWliaW5kZXg7ICsraSkKICAgICAgICAgICAgU05NUF9GUkVFKF9taWJpbmRleGVzW2ldKTsKICAgICAgICBmcmVlKF9taWJpbmRleGVzKTsKICAgICAgICBfbWliaW5kZXggPSAwOwogICAgICAgIF9taWJpbmRleF9tYXggPSAwOwogICAgICAgIF9taWJpbmRleGVzID0gTlVMTDsKICAgIH0KICAgIGlmIChQcmVmaXggIT0gTlVMTCAmJiBQcmVmaXggIT0gJlN0YW5kYXJkX1ByZWZpeFswXSkKICAgICAgICBTTk1QX0ZSRUUoUHJlZml4KTsKICAgIGlmIChQcmVmaXgpCiAgICAgICAgUHJlZml4ID0gTlVMTDsKICAgIFNOTVBfRlJFRShjb25mbWlicyk7CiAgICBTTk1QX0ZSRUUoY29uZm1pYmRpcik7Cn0KCi8qKgogKiBQcmludHMgdGhlIE1JQnMgdG8gdGhlIGZpbGUgZnAuCiAqCiAqIEBwYXJhbSBmcCAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gcHJpbnQgdG8uCiAqLwp2b2lkCnByaW50X21pYihGSUxFICogZnApCnsKICAgIHByaW50X3N1YnRyZWUoZnAsIHRyZWVfaGVhZCwgMCk7Cn0KCnZvaWQKcHJpbnRfYXNjaWlfZHVtcChGSUxFICogZnApCnsKICAgIGZwcmludGYoZnAsICJkdW1wIERFRklOSVRJT05TIDo6PSBCRUdJTlxuIik7CiAgICBwcmludF9hc2NpaV9kdW1wX3RyZWUoZnAsIHRyZWVfaGVhZCwgMCk7CiAgICBmcHJpbnRmKGZwLCAiRU5EXG4iKTsKfQoKCi8qKgogKiBTZXQncyB0aGUgcHJpbnRpbmcgZnVuY3Rpb24gcHJpbnRvbWF0IGluIGEgc3VidHJlZSBhY2NvcmRpbmcKICogaXQncyB0eXBlCiAqCiAqIEBwYXJhbSBzdWJ0cmVlICAgIFRoZSBzdWJ0cmVlIHRvIHNldC4KICovCnZvaWQKc2V0X2Z1bmN0aW9uKHN0cnVjdCB0cmVlICpzdWJ0cmVlKQp7CiAgICBzdWJ0cmVlLT5wcmludGVyID0gTlVMTDsKICAgIHN3aXRjaCAoc3VidHJlZS0+dHlwZSkgewogICAgY2FzZSBUWVBFX09CSklEOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX29iamVjdF9pZGVudGlmaWVyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZzsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2ludGVnZXI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2ludGVnZXI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfTkVUQUREUjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19uZXR3b3JrYWRkcmVzczsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9JUEFERFI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfaXBhZGRyZXNzOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0NPVU5URVI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfY291bnRlcjsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19nYXVnZTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9USU1FVElDS1M6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfdGltZXRpY2tzOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX09QQVFVRToKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19vcGFxdWU7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfTlVMTDoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19udWxsOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0JJVFNUUklORzoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19iaXRzdHJpbmc7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfTlNBUEFERFJFU1M6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfbnNhcGFkZHJlc3M7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfQ09VTlRFUjY0OgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2NvdW50ZXI2NDsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY191aW50ZWdlcjsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2dhdWdlOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX09USEVSOgogICAgZGVmYXVsdDoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19ieV90eXBlOwogICAgICAgIGJyZWFrOwogICAgfQp9CgojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgovKioKICogUmVhZHMgYW4gb2JqZWN0IGlkZW50aWZpZXIgZnJvbSBhbiBpbnB1dCBzdHJpbmcgaW50byBpbnRlcm5hbCBPSUQgZm9ybS4KICogCiAqIFdoZW4gY2FsbGVkLCBvdXRfbGVuIG11c3QgaG9sZCB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG91dHB1dCBhcnJheS4KICoKICogQHBhcmFtIGlucHV0ICAgICB0aGUgaW5wdXQgc3RyaW5nLgogKiBAcGFyYW0gb3V0cHV0ICAgIHRoZSBvaWQgd2lydGUuCiAqIEBwYXJhbSBvdXRfbGVuICAgbnVtYmVyIG9mIHN1YmlkJ3MgaW4gb3V0cHV0LgogKiAKICogQHJldHVybiAxIGlmIHN1Y2Nlc3NmdWwuCiAqIAogKiBJZiBhbiBlcnJvciBvY2N1cnMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIGFuZCBNQVkgc2V0IHNubXBfZXJybm8uCiAqIHNubXBfZXJybm8gaXMgTk9UIHNldCBpZiBTRVRfU05NUF9FUlJPUiBldmFsdWF0ZXMgdG8gbm90aGluZy4KICogVGhpcyBjYW4gbWFrZSBtdWx0aS10aHJlYWRlZCB1c2UgYSB0aW55IGJpdCBtb3JlIHJvYnVzdC4KICovCmludApyZWFkX29iamlkKGNvbnN0IGNoYXIgKmlucHV0LCBvaWQgKiBvdXRwdXQsIHNpemVfdCAqIG91dF9sZW4pCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN1YmlkJ3MgaW4gIm91dHB1dCIgKi8KI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIHN0cnVjdCB0cmVlICAgICpyb290ID0gdHJlZV90b3A7CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIGNoYXIgICAgICAgICAgICBidWZbU1BSSU5UX01BWF9MRU5dOwogICAgaW50ICAgICAgICAgICAgIHJldCwgbWF4X291dF9sZW47CiAgICBjaGFyICAgICAgICAgICAqbmFtZSwgY2g7CiAgICBjb25zdCBjaGFyICAgICAqY3A7CgogICAgY3AgPSBpbnB1dDsKICAgIHdoaWxlICgoY2ggPSAqY3ApKSB7CiAgICAgICAgaWYgKCgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKQogICAgICAgICAgICB8fCAoJ2EnIDw9IGNoICYmIGNoIDw9ICd6JykKICAgICAgICAgICAgfHwgKCdBJyA8PSBjaCAmJiBjaCA8PSAnWicpCiAgICAgICAgICAgIHx8IGNoID09ICctJykKICAgICAgICAgICAgY3ArKzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGJyZWFrOwogICAgfQojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgaWYgKGNoID09ICc6JykKICAgICAgICByZXR1cm4gZ2V0X25vZGUoaW5wdXQsIG91dHB1dCwgb3V0X2xlbik7CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCiAgICBpZiAoKmlucHV0ID09ICcuJykKICAgICAgICBpbnB1dCsrOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgZWxzZSBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JFQURfVUNEX1NUWUxFX09JRCkpIHsKICAgICAgICAvKgogICAgICAgICAqIGdldCBwYXN0IGxlYWRpbmcgJy4nLCBhcHBlbmQgJy4nIHRvIFByZWZpeC4gCiAgICAgICAgICovCiAgICAgICAgaWYgKCpQcmVmaXggPT0gJy4nKQogICAgICAgICAgICBzdHJsY3B5KGJ1ZiwgUHJlZml4ICsgMSwgc2l6ZW9mKGJ1ZikpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgc3RybGNweShidWYsIFByZWZpeCwgc2l6ZW9mKGJ1ZikpOwogICAgICAgIHN0cmxjYXQoYnVmLCAiLiIsIHNpemVvZihidWYpKTsKICAgICAgICBzdHJsY2F0KGJ1ZiwgaW5wdXQsIHNpemVvZihidWYpKTsKICAgICAgICBpbnB1dCA9IGJ1ZjsKICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGlmICgocm9vdCA9PSBOVUxMKSAmJiAodHJlZV9oZWFkICE9IE5VTEwpKSB7CiAgICAgICAgcm9vdCA9IHRyZWVfaGVhZDsKICAgIH0KICAgIGVsc2UgaWYgKHJvb3QgPT0gTlVMTCkgewogICAgICAgIFNFVF9TTk1QX0VSUk9SKFNOTVBFUlJfTk9NSUIpOwogICAgICAgICpvdXRfbGVuID0gMDsKICAgICAgICByZXR1cm4gMDsKICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgbmFtZSA9IHN0cmR1cChpbnB1dCk7CiAgICBtYXhfb3V0X2xlbiA9ICpvdXRfbGVuOwogICAgKm91dF9sZW4gPSAwOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgaWYgKChyZXQgPQogICAgICAgICBfYWRkX3N0cmluZ3NfdG9fb2lkKHJvb3QsIG5hbWUsIG91dHB1dCwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfb3V0X2xlbikpIDw9IDApCiNlbHNlCiAgICBpZiAoKHJldCA9CiAgICAgICAgIF9hZGRfc3RyaW5nc190b19vaWQoTlVMTCwgbmFtZSwgb3V0cHV0LCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9vdXRfbGVuKSkgPD0gMCkKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgewogICAgICAgIGlmIChyZXQgPT0gMCkKICAgICAgICAgICAgcmV0ID0gU05NUEVSUl9VTktOT1dOX09CSklEOwogICAgICAgIFNFVF9TTk1QX0VSUk9SKHJldCk7CiAgICAgICAgU05NUF9GUkVFKG5hbWUpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgU05NUF9GUkVFKG5hbWUpOwoKICAgIHJldHVybiAxOwp9CgovKioKICogCiAqLwp2b2lkCm5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWQodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7CiAgICB1X2NoYXIgICAgICAgICAqdGJ1ZiA9IE5VTEwsICpjcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgdGJ1Zl9sZW4gPSAyNTYsIHRvdXRfbGVuID0gMDsKICAgIGludCAgICAgICAgICAgICB0YnVmX292ZXJmbG93ID0gMDsKICAgIGludCAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0OwoKICAgIGlmICgodGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKHRidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIHRidWZfb3ZlcmZsb3cgPSAxOwogICAgfSBlbHNlIHsKICAgICAgICAqdGJ1ZiA9ICcuJzsKICAgICAgICB0b3V0X2xlbiA9IDE7CiAgICB9CgogICAgX29pZF9maW5pc2hfcHJpbnRpbmcob2JqaWQsIG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgJnRidWYsICZ0YnVmX2xlbiwgJnRvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJnRidWZfb3ZlcmZsb3cpOwoKICAgIGlmICh0YnVmX292ZXJmbG93KSB7CiAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdGJ1Zik7CiAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUodGJ1Zik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG91dHB1dF9mb3JtYXQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCk7CiAgICBpZiAoMCA9PSBvdXRwdXRfZm9ybWF0KSB7CiAgICAgICAgb3V0cHV0X2Zvcm1hdCA9IE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDOwogICAgfQogICAgc3dpdGNoIChvdXRwdXRfZm9ybWF0KSB7CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9GVUxMOgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQzoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX1NVRkZJWDoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX01PRFVMRToKICAgICAgICBjcCA9IHRidWY7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTk9ORToKICAgIGRlZmF1bHQ6CiAgICAgICAgY3AgPSBOVUxMOwogICAgfQoKICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJgogICAgICAgICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSkgewogICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgfQogICAgU05NUF9GUkVFKHRidWYpOwp9CgovKioKICogCiAqLwojaWZkZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCnZvaWQKbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKewogICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdywgb2JqaWQsIG9iamlkbGVuKTsKfQojZWxzZQpzdHJ1Y3QgdHJlZSAgICAqCm5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4pCnsKICAgIHVfY2hhciAgICAgICAgICp0YnVmID0gTlVMTCwgKmNwID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICB0YnVmX2xlbiA9IDUxMiwgdG91dF9sZW4gPSAwOwogICAgc3RydWN0IHRyZWUgICAgKnN1YnRyZWUgPSB0cmVlX2hlYWQ7CiAgICBzaXplX3QgICAgICAgICAgbWlkcG9pbnRfb2Zmc2V0ID0gMDsKICAgIGludCAgICAgICAgICAgICB0YnVmX292ZXJmbG93ID0gMDsKICAgIGludCAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0OwoKICAgIGlmICgodGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKHRidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIHRidWZfb3ZlcmZsb3cgPSAxOwogICAgfSBlbHNlIHsKICAgICAgICAqdGJ1ZiA9ICcuJzsKICAgICAgICB0b3V0X2xlbiA9IDE7CiAgICB9CgogICAgc3VidHJlZSA9IF9nZXRfcmVhbGxvY19zeW1ib2wob2JqaWQsIG9iamlkbGVuLCBzdWJ0cmVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRidWYsICZ0YnVmX2xlbiwgJnRvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJnRidWZfb3ZlcmZsb3csIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlkcG9pbnRfb2Zmc2V0KTsKCiAgICBpZiAodGJ1Zl9vdmVyZmxvdykgewogICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRidWYpOwogICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKHRidWYpOwogICAgICAgIHJldHVybiBzdWJ0cmVlOwogICAgfQoKICAgIG91dHB1dF9mb3JtYXQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCk7CiAgICBpZiAoMCA9PSBvdXRwdXRfZm9ybWF0KSB7CiAgICAgICAgb3V0cHV0X2Zvcm1hdCA9IE5FVFNOTVBfT0lEX09VVFBVVF9NT0RVTEU7CiAgICB9CiAgICBzd2l0Y2ggKG91dHB1dF9mb3JtYXQpIHsKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX0ZVTEw6CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDOgogICAgICAgIGNwID0gdGJ1ZjsKICAgICAgICBicmVhazsKCiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9TVUZGSVg6CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9NT0RVTEU6CiAgICAgICAgZm9yIChjcCA9IHRidWY7ICpjcDsgY3ArKyk7CgogICAgICAgIGlmIChtaWRwb2ludF9vZmZzZXQgIT0gMCkgewogICAgICAgICAgICBjcCA9IHRidWYgKyBtaWRwb2ludF9vZmZzZXQgLSAyOyAgICAvKiAgYmV5b25kIHRoZSAnLicgICovCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd2hpbGUgKGNwID49IHRidWYpIHsKICAgICAgICAgICAgICAgIGlmIChpc2FscGhhKCpjcCkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNwLS07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHdoaWxlIChjcCA+PSB0YnVmKSB7CiAgICAgICAgICAgIGlmICgqY3AgPT0gJy4nKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjcC0tOwogICAgICAgIH0KCiAgICAgICAgY3ArKzsKCiAgICAgICAgaWYgKChORVRTTk1QX09JRF9PVVRQVVRfTU9EVUxFID09IG91dHB1dF9mb3JtYXQpCiAgICAgICAgICAgICYmIGNwID4gdGJ1ZikgewogICAgICAgICAgICBjaGFyICAgICAgICAgICAgbW9kYnVmWzI1Nl0gPSB7IDAgfSwgKm1vZCA9CiAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZShzdWJ0cmVlLT5tb2RpZCwgbW9kYnVmKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIERvbid0IGFkZCB0aGUgbW9kdWxlIElEIGlmIGl0J3MganVzdCBudW1lcmljIChpLmUuIHdlIGNvdWxkbid0IGxvb2sKICAgICAgICAgICAgICogaXQgdXAgcHJvcGVybHkuICAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgbW9kYnVmWzBdICE9ICcjJykgewogICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgbW9kKQogICAgICAgICAgICAgICAgICAgIHx8ICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIjo6IikpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9VQ0Q6CiAgICB7CiAgICAgICAgUHJlZml4TGlzdFB0ciAgIHBwID0gJm1pYl9wcmVmaXhlc1swXTsKICAgICAgICBzaXplX3QgICAgICAgICAgaWxlbiwgdGxlbjsKICAgICAgICBjb25zdCBjaGFyICAgICAqdGVzdGNwOwoKICAgICAgICBjcCA9IHRidWY7CiAgICAgICAgdGxlbiA9IHN0cmxlbigoY2hhciAqKSB0YnVmKTsKCiAgICAgICAgd2hpbGUgKHBwLT5zdHIpIHsKICAgICAgICAgICAgaWxlbiA9IHBwLT5sZW47CiAgICAgICAgICAgIHRlc3RjcCA9IHBwLT5zdHI7CgogICAgICAgICAgICBpZiAoKHRsZW4gPiBpbGVuKSAmJiBtZW1jbXAodGJ1ZiwgdGVzdGNwLCBpbGVuKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBjcCArPSAoaWxlbiArIDEpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHArKzsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTk9ORToKICAgIGRlZmF1bHQ6CiAgICAgICAgY3AgPSBOVUxMOwogICAgfQoKICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJgogICAgICAgICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSkgewogICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgfQogICAgU05NUF9GUkVFKHRidWYpOwogICAgcmV0dXJuIHN1YnRyZWU7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKaW50CnNwcmludF9yZWFsbG9jX29iamlkKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgYnVmX292ZXJmbG93ID0gMDsKCiAgICBuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZfb3ZlcmZsb3csIG9iamlkLCBvYmppZGxlbik7CiAgICByZXR1cm4gIWJ1Zl9vdmVyZmxvdzsKfQoKaW50CnNucHJpbnRfb2JqaWQoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CgogICAgaWYgKHNwcmludF9yZWFsbG9jX29iamlkKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuKSkgewogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn0KCi8qKgogKiBQcmludHMgYW4gb2lkIHRvIHN0ZG91dC4KICoKICogQHBhcmFtIG9iamlkICAgICAgVGhlIG9pZCB0byBwcmludAogKiBAcGFyYW0gb2JqaWRsZW4gICBUaGUgbGVuZ3RoIG9mIG9pZGlkLgogKi8Kdm9pZApwcmludF9vYmppZChjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdWJpZGVudGlmaWVycyAqLwogICAgZnByaW50X29iamlkKHN0ZG91dCwgb2JqaWQsIG9iamlkbGVuKTsKfQoKCi8qKgogKiBQcmludHMgYW4gb2lkIHRvIGEgZmlsZSBkZXNjcmlwdG9yLgogKgogKiBAcGFyYW0gZiAgICAgICAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHByaW50IHRvLgogKiBAcGFyYW0gb2JqaWQgICAgICBUaGUgb2lkIHRvIHByaW50CiAqIEBwYXJhbSBvYmppZGxlbiAgIFRoZSBsZW5ndGggb2Ygb2lkaWQuCiAqLwp2b2lkCmZwcmludF9vYmppZChGSUxFICogZiwgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMgKi8KICAgIHVfY2hhciAgICAgICAgICpidWYgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIGJ1Zl9sZW4gPSAyNTYsIG91dF9sZW4gPSAwOwogICAgaW50ICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdyA9IDA7CgogICAgaWYgKChidWYgPSAodV9jaGFyICopIGNhbGxvYyhidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoZiwgIltUUlVOQ0FURURdXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICAgIG5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZSgmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZfb3ZlcmZsb3csIG9iamlkLCBvYmppZGxlbik7CiAgICAgICAgaWYgKGJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlcyBbVFJVTkNBVEVEXVxuIiwgYnVmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlc1xuIiwgYnVmKTsKICAgICAgICB9CiAgICB9CgogICAgU05NUF9GUkVFKGJ1Zik7Cn0KCmludApzcHJpbnRfcmVhbGxvY192YXJpYWJsZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIGludCAgICAgICAgICAgICBidWZfb3ZlcmZsb3cgPSAwOwoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIHN0cnVjdCB0cmVlICAgICpzdWJ0cmVlID0gdHJlZV9oZWFkOwoKICAgIHN1YnRyZWUgPQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICAgICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuKTsKCiAgICBpZiAoYnVmX292ZXJmbG93KSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9CQVJFX1ZBTFVFKSkgewogICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiA9ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiID0gIikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBlbmQgaWYtZWxzZSBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCAqLwogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpZi1lbHNlIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCAqLwogICAgfSBlbHNlIHsKICAgICAgICAqb3V0X2xlbiA9IDA7CiAgICB9CgogICAgaWYgKHZhcmlhYmxlLT50eXBlID09IFNOTVBfTk9TVUNIT0JKRUNUKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gU3VjaCBPYmplY3QgYXZhaWxhYmxlIG9uIHRoaXMgYWdlbnQgYXQgdGhpcyBPSUQiKTsKICAgIH0gZWxzZSBpZiAodmFyaWFibGUtPnR5cGUgPT0gU05NUF9OT1NVQ0hJTlNUQU5DRSkgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFN1Y2ggSW5zdGFuY2UgY3VycmVudGx5IGV4aXN0cyBhdCB0aGlzIE9JRCIpOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZS0+dHlwZSA9PSBTTk1QX0VORE9GTUlCVklFVykgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1vcmUgdmFyaWFibGVzIGxlZnQgaW4gdGhpcyBNSUIgVmlldyAoSXQgaXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBNSUIgdHJlZSkiKTsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIH0gZWxzZSBpZiAoc3VidHJlZSkgewogICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzID0gTlVMTDsKICAgICAgICBjb25zdCBjaGFyICpoaW50ID0gTlVMTDsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9ET05UX1BSSU5UX1VOSVRTKSkgewogICAgICAgICAgICB1bml0cyA9IHN1YnRyZWUtPnVuaXRzOwogICAgICAgIH0KCgkJaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfTk9fRElTUExBWV9ISU5UKSkgewoJCQloaW50ID0gc3VidHJlZS0+aGludDsKICAgICAgICB9CgogICAgICAgIGlmIChzdWJ0cmVlLT5wcmludG9tYXQpIHsKICAgICAgICAgICAgcmV0dXJuICgqc3VidHJlZS0+cHJpbnRvbWF0KSAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXJpYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZS0+ZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhcmlhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlLT5lbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIEhhbmRsZSByYXJlIGNhc2Ugd2hlcmUgdHJlZSBpcyBlbXB0eS4gIAogICAgICAgICAqLwogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICB9Cn0KCmludApzbnByaW50X3ZhcmlhYmxlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwoKICAgIGlmIChzcHJpbnRfcmVhbGxvY192YXJpYWJsZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpKSB7CiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KfQoKLyoqCiAqIFByaW50cyBhIHZhcmlhYmxlIHRvIHN0ZG91dC4KICoKICogQHBhcmFtIG9iamlkICAgICBUaGUgb2JqZWN0IGlkLgogKiBAcGFyYW0gb2JqaWRsZW4gIFRoZSBsZW5ndGggb2YgdGVoIG9iamVjdCBpZC4KICogQHBhcmFtIHZhcmlhYmxlICBUaGUgdmFyaWFibGUgdG8gcHJpbnQuCiAqLwp2b2lkCnByaW50X3ZhcmlhYmxlKGNvbnN0IG9pZCAqIG9iamlkLAogICAgICAgICAgICAgICBzaXplX3Qgb2JqaWRsZW4sIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICBmcHJpbnRfdmFyaWFibGUoc3Rkb3V0LCBvYmppZCwgb2JqaWRsZW4sIHZhcmlhYmxlKTsKfQoKCi8qKgogKiBQcmludHMgYSB2YXJpYWJsZSB0byBhIGZpbGUgZGVzY3JpcHRvci4KICoKICogQHBhcmFtIGYgICAgICAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHByaW50IHRvLgogKiBAcGFyYW0gb2JqaWQgICAgIFRoZSBvYmplY3QgaWQuCiAqIEBwYXJhbSBvYmppZGxlbiAgVGhlIGxlbmd0aCBvZiB0ZWggb2JqZWN0IGlkLgogKiBAcGFyYW0gdmFyaWFibGUgIFRoZSB2YXJpYWJsZSB0byBwcmludC4KICovCnZvaWQKZnByaW50X3ZhcmlhYmxlKEZJTEUgKiBmLAogICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsCiAgICAgICAgICAgICAgICBzaXplX3Qgb2JqaWRsZW4sIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICB1X2NoYXIgICAgICAgICAqYnVmID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMjU2LCBvdXRfbGVuID0gMDsKCiAgICBpZiAoKGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKGJ1Zl9sZW4sIDEpKSA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihmLCAiW1RSVU5DQVRFRF1cbiIpOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHNwcmludF9yZWFsbG9jX3ZhcmlhYmxlKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSkpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiIsIGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgW1RSVU5DQVRFRF1cbiIsIGJ1Zik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShidWYpOwp9CgppbnQKc3ByaW50X3JlYWxsb2NfdmFsdWUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICBpZiAodmFyaWFibGUtPnR5cGUgPT0gU05NUF9OT1NVQ0hPQkpFQ1QpIHsKICAgICAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBTdWNoIE9iamVjdCBhdmFpbGFibGUgb24gdGhpcyBhZ2VudCBhdCB0aGlzIE9JRCIpOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZS0+dHlwZSA9PSBTTk1QX05PU1VDSElOU1RBTkNFKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gU3VjaCBJbnN0YW5jZSBjdXJyZW50bHkgZXhpc3RzIGF0IHRoaXMgT0lEIik7CiAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLT50eXBlID09IFNOTVBfRU5ET0ZNSUJWSUVXKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gbW9yZSB2YXJpYWJsZXMgbGVmdCBpbiB0aGlzIE1JQiBWaWV3IChJdCBpcyBwYXN0IHRoZSBlbmQgb2YgdGhlIE1JQiB0cmVlKSIpOwogICAgfSBlbHNlIHsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgICAgICBjb25zdCBjaGFyICp1bml0cyA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyZWUgKnN1YnRyZWUgPSB0cmVlX2hlYWQ7CglzdWJ0cmVlID0gZ2V0X3RyZWUob2JqaWQsIG9iamlkbGVuLCBzdWJ0cmVlKTsKICAgICAgICBpZiAoc3VidHJlZSAmJiAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfRE9OVF9QUklOVF9VTklUUykpIHsKICAgICAgICAgICAgdW5pdHMgPSBzdWJ0cmVlLT51bml0czsKICAgICAgICB9CiAgICAgICAgaWYgKHN1YnRyZWUpIHsKCSAgICBpZihzdWJ0cmVlLT5wcmludG9tYXQpIHsKCQlyZXR1cm4gKCpzdWJ0cmVlLT5wcmludG9tYXQpIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCgkJCQkJICAgICAgYWxsb3dfcmVhbGxvYywgdmFyaWFibGUsCgkJCQkJICAgICAgc3VidHJlZS0+ZW51bXMsIHN1YnRyZWUtPmhpbnQsCgkJCQkJICAgICAgdW5pdHMpOwoJICAgIH0gZWxzZSB7CgkJcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAoJCQkJCSAgICAgIGFsbG93X3JlYWxsb2MsIHZhcmlhYmxlLAoJCQkJCSAgICAgIHN1YnRyZWUtPmVudW1zLCBzdWJ0cmVlLT5oaW50LAoJCQkJCSAgICAgIHVuaXRzKTsKCSAgICB9Cgl9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyaWFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICB9Cn0KCmludApzbnByaW50X3ZhbHVlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwoKICAgIGlmIChzcHJpbnRfcmVhbGxvY192YWx1ZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpKSB7CiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KfQoKdm9pZApwcmludF92YWx1ZShjb25zdCBvaWQgKiBvYmppZCwKICAgICAgICAgICAgc2l6ZV90IG9iamlkbGVuLCBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgZnByaW50X3ZhbHVlKHN0ZG91dCwgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSk7Cn0KCnZvaWQKZnByaW50X3ZhbHVlKEZJTEUgKiBmLAogICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsCiAgICAgICAgICAgICBzaXplX3Qgb2JqaWRsZW4sIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICB1X2NoYXIgICAgICAgICAqYnVmID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMjU2LCBvdXRfbGVuID0gMDsKCiAgICBpZiAoKGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKGJ1Zl9sZW4sIDEpKSA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihmLCAiW1RSVU5DQVRFRF1cbiIpOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHNwcmludF9yZWFsbG9jX3ZhbHVlKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSkpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiIsIGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgW1RSVU5DQVRFRF1cbiIsIGJ1Zik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShidWYpOwp9CgoKLyoqCiAqIFRha2VzIHRoZSB2YWx1ZSBpbiBWQVIgYW5kIHR1cm5zIGl0IGludG8gYW4gT0lEIHNlZ21lbnQgaW4gdmFyLT5uYW1lLgogKiAgCiAqIEBwYXJhbSB2YXIgICAgVGhlIHZhcmlhYmxlLgogKgogKiBAcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUyBvciBTTk1QRVJSX0dFTkVSUiAKICovCmludApidWlsZF9vaWRfc2VnbWVudChuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIpCnsKICAgIGludCAgICAgICAgICAgICBpOwogICAgdWludDMyX3QgICAgICAgIGlwYWRkcjsKCiAgICBpZiAodmFyLT5uYW1lICYmIHZhci0+bmFtZSAhPSB2YXItPm5hbWVfbG9jKQogICAgICAgIFNOTVBfRlJFRSh2YXItPm5hbWUpOwogICAgc3dpdGNoICh2YXItPnR5cGUpIHsKICAgIGNhc2UgQVNOX0lOVEVHRVI6CiAgICBjYXNlIEFTTl9DT1VOVEVSOgogICAgY2FzZSBBU05fR0FVR0U6CiAgICBjYXNlIEFTTl9USU1FVElDS1M6CiAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCA9IDE7CiAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICB2YXItPm5hbWVbMF0gPSAqKHZhci0+dmFsLmludGVnZXIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX0lQQUREUkVTUzoKICAgICAgICB2YXItPm5hbWVfbGVuZ3RoID0gNDsKICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIG1lbWNweSgmaXBhZGRyLCB2YXItPnZhbC5zdHJpbmcsIHNpemVvZihpcGFkZHIpKTsKICAgICAgICB2YXItPm5hbWVbMF0gPSAoaXBhZGRyID4+IDI0KSAmIDB4ZmY7CiAgICAgICAgdmFyLT5uYW1lWzFdID0gKGlwYWRkciA+PiAxNikgJiAweGZmOwogICAgICAgIHZhci0+bmFtZVsyXSA9IChpcGFkZHIgPj4gIDgpICYgMHhmZjsKICAgICAgICB2YXItPm5hbWVbM10gPSAoaXBhZGRyID4+ICAwKSAmIDB4ZmY7CiAgICAgICAgYnJlYWs7CiAgICAgICAgCiAgICBjYXNlIEFTTl9QUklWX0lNUExJRURfT0JKRUNUX0lEOgogICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSB2YXItPnZhbF9sZW4gLyBzaXplb2Yob2lkKTsKICAgICAgICBpZiAodmFyLT5uYW1lX2xlbmd0aCA+IChzaXplb2YodmFyLT5uYW1lX2xvYykgLyBzaXplb2Yob2lkKSkpCiAgICAgICAgICAgIHZhci0+bmFtZSA9IChvaWQgKikgbWFsbG9jKHNpemVvZihvaWQpICogKHZhci0+bmFtZV9sZW5ndGgpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHZhci0+bmFtZSA9IHZhci0+bmFtZV9sb2M7CiAgICAgICAgaWYgKHZhci0+bmFtZSA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSB2YXItPm5hbWVfbGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHZhci0+bmFtZVtpXSA9IHZhci0+dmFsLm9iamlkW2ldOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX09CSkVDVF9JRDoKICAgICAgICB2YXItPm5hbWVfbGVuZ3RoID0gdmFyLT52YWxfbGVuIC8gc2l6ZW9mKG9pZCkgKyAxOwogICAgICAgIGlmICh2YXItPm5hbWVfbGVuZ3RoID4gKHNpemVvZih2YXItPm5hbWVfbG9jKSAvIHNpemVvZihvaWQpKSkKICAgICAgICAgICAgdmFyLT5uYW1lID0gKG9pZCAqKSBtYWxsb2Moc2l6ZW9mKG9pZCkgKiAodmFyLT5uYW1lX2xlbmd0aCkpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICBpZiAodmFyLT5uYW1lID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAgICAgdmFyLT5uYW1lWzBdID0gdmFyLT5uYW1lX2xlbmd0aCAtIDE7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIHZhci0+bmFtZV9sZW5ndGggLSAxOyBpKyspCiAgICAgICAgICAgIHZhci0+bmFtZVtpICsgMV0gPSB2YXItPnZhbC5vYmppZFtpXTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9QUklWX0lNUExJRURfT0NURVRfU1RSOgogICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSB2YXItPnZhbF9sZW47CiAgICAgICAgaWYgKHZhci0+bmFtZV9sZW5ndGggPiAoc2l6ZW9mKHZhci0+bmFtZV9sb2MpIC8gc2l6ZW9mKG9pZCkpKQogICAgICAgICAgICB2YXItPm5hbWUgPSAob2lkICopIG1hbGxvYyhzaXplb2Yob2lkKSAqICh2YXItPm5hbWVfbGVuZ3RoKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIGlmICh2YXItPm5hbWUgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgdmFyLT52YWxfbGVuOyBpKyspCiAgICAgICAgICAgIHZhci0+bmFtZVtpXSA9IChvaWQpIHZhci0+dmFsLnN0cmluZ1tpXTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUU6CiAgICBjYXNlIEFTTl9PQ1RFVF9TVFI6CiAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCA9IHZhci0+dmFsX2xlbiArIDE7CiAgICAgICAgaWYgKHZhci0+bmFtZV9sZW5ndGggPiAoc2l6ZW9mKHZhci0+bmFtZV9sb2MpIC8gc2l6ZW9mKG9pZCkpKQogICAgICAgICAgICB2YXItPm5hbWUgPSAob2lkICopIG1hbGxvYyhzaXplb2Yob2lkKSAqICh2YXItPm5hbWVfbGVuZ3RoKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIGlmICh2YXItPm5hbWUgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgICAgICB2YXItPm5hbWVbMF0gPSAob2lkKSB2YXItPnZhbF9sZW47CiAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIHZhci0+dmFsX2xlbjsgaSsrKQogICAgICAgICAgICB2YXItPm5hbWVbaSArIDFdID0gKG9pZCkgdmFyLT52YWwuc3RyaW5nW2ldOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoImJ1aWxkX29pZF9zZWdtZW50IiwKICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBhc24gdHlwZTogJWRcbiIsIHZhci0+dHlwZSkpOwogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0KCiAgICBpZiAodmFyLT5uYW1lX2xlbmd0aCA+IE1BWF9PSURfTEVOKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImJ1aWxkX29pZF9zZWdtZW50IiwKICAgICAgICAgICAgICAgICAgICAiU29tZXRoaW5nIHRlcnJpYmx5IHdyb25nLCBuYW1lbGVuID0gJWx1XG4iLAogICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXZhci0+bmFtZV9sZW5ndGgpKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICB9CgogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKCmludApidWlsZF9vaWRfbm9hbGxvYyhvaWQgKiBpbiwgc2l6ZV90IGluX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgb2lkICogcHJlZml4LCBzaXplX3QgcHJlZml4X2xlbiwKICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICogaW5kZXhlcykKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXI7CgogICAgaWYgKHByZWZpeCkgewogICAgICAgIGlmIChpbl9sZW4gPCBwcmVmaXhfbGVuKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgbWVtY3B5KGluLCBwcmVmaXgsIHByZWZpeF9sZW4gKiBzaXplb2Yob2lkKSk7CiAgICAgICAgKm91dF9sZW4gPSBwcmVmaXhfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICAqb3V0X2xlbiA9IDA7CiAgICB9CgogICAgZm9yICh2YXIgPSBpbmRleGVzOyB2YXIgIT0gTlVMTDsgdmFyID0gdmFyLT5uZXh0X3ZhcmlhYmxlKSB7CiAgICAgICAgaWYgKGJ1aWxkX29pZF9zZWdtZW50KHZhcikgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgaWYgKHZhci0+bmFtZV9sZW5ndGggKyAqb3V0X2xlbiA8PSBpbl9sZW4pIHsKICAgICAgICAgICAgbWVtY3B5KCYoaW5bKm91dF9sZW5dKSwgdmFyLT5uYW1lLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKiB2YXItPm5hbWVfbGVuZ3RoKTsKICAgICAgICAgICAgKm91dF9sZW4gKz0gdmFyLT5uYW1lX2xlbmd0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgfQogICAgfQoKICAgIERFQlVHTVNHVEwoKCJidWlsZF9vaWRfbm9hbGxvYyIsICJnZW5lcmF0ZWQ6ICIpKTsKICAgIERFQlVHTVNHT0lEKCgiYnVpbGRfb2lkX25vYWxsb2MiLCBpbiwgKm91dF9sZW4pKTsKICAgIERFQlVHTVNHKCgiYnVpbGRfb2lkX25vYWxsb2MiLCAiXG4iKSk7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgppbnQKYnVpbGRfb2lkKG9pZCAqKiBvdXQsIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICBvaWQgKiBwcmVmaXgsIHNpemVfdCBwcmVmaXhfbGVuLCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiBpbmRleGVzKQp7CiAgICBvaWQgICAgICAgICAgICAgdG1wb3V0W01BWF9PSURfTEVOXTsKCiAgICAvKgogICAgICogeHh4LXJrczogaW5lZmZpY2VudC4gdHJ5IG9ubHkgYnVpbGRpbmcgc2VnbWVudHMgdG8gZmluZCBpbmRleCBsZW46CiAgICAgKiAgIGZvciAodmFyID0gaW5kZXhlczsgdmFyICE9IE5VTEw7IHZhciA9IHZhci0+bmV4dF92YXJpYWJsZSkgewogICAgICogICAgICBpZiAoYnVpbGRfb2lkX3NlZ21lbnQodmFyKSAhPSBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgKiAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAqICAgICAgKm91dF9sZW4gKz0gdmFyLT5uYW1lX2xlbmd0aDsKICAgICAqCiAgICAgKiB0aGVuIHNlZSBpZiBpdCBmaXRzIGluIGV4aXN0aW5nIGJ1ZmZlciwgb3IgcmVhbGxvYyBidWZmZXIuCiAgICAgKi8KICAgIGlmIChidWlsZF9vaWRfbm9hbGxvYyh0bXBvdXQsIHNpemVvZih0bXBvdXQpLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwgcHJlZml4X2xlbiwgaW5kZXhlcykgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAvKiogeHh4LXJrczogc2hvdWxkIGZyZWUgcHJldmlvdXMgdmFsdWU/ICovCiAgICBzbm1wX2Nsb25lX21lbSgodm9pZCAqKikgb3V0LCAodm9pZCAqKSB0bXBvdXQsICpvdXRfbGVuICogc2l6ZW9mKG9pZCkpOwoKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCi8qCiAqIHZibGlzdF9vdXQgbXVzdCBjb250YWluIGEgcHJlLWFsbG9jYXRlZCBzdHJpbmcgb2YgdmFyaWFibGVzIGludG8KICogd2hpY2ggaW5kZXhlcyBjYW4gYmUgZXh0cmFjdGVkIGJhc2VkIG9uIHRoZSBwcmV2aW91c2x5IGV4aXN0aW5nCiAqIHR5cGVzIGluIHRoZSB2YXJpYWJsZSBjaGFpbgogKiByZXR1cm5zOgogKiBTTk1QRVJSX0dFTkVSUiAgb24gZXJyb3IKICogU05NUEVSUl9TVUNDRVNTIG9uIHN1Y2Nlc3MKICovCgppbnQKcGFyc2Vfb2lkX2luZGV4ZXMob2lkICogb2lkSW5kZXgsIHNpemVfdCBvaWRMZW4sCiAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIGRhdGEpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyID0gZGF0YTsKCiAgICB3aGlsZSAodmFyICYmIG9pZExlbiA+IDApIHsKCiAgICAgICAgaWYgKHBhcnNlX29uZV9vaWRfaW5kZXgoJm9pZEluZGV4LCAmb2lkTGVuLCB2YXIsIDApICE9CiAgICAgICAgICAgIFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIHZhciA9IHZhci0+bmV4dF92YXJpYWJsZTsKICAgIH0KCiAgICBpZiAodmFyICE9IE5VTEwgfHwgb2lkTGVuICE9IDApCiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKCmludApwYXJzZV9vbmVfb2lkX2luZGV4KG9pZCAqKiBvaWRTdGFydCwgc2l6ZV90ICogb2lkTGVuLAogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIGRhdGEsIGludCBjb21wbGV0ZSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXIgPSBkYXRhOwogICAgb2lkICAgICAgICAgICAgIHRtcG91dFtNQVhfT0lEX0xFTl07CiAgICB1bnNpZ25lZCBpbnQgICAgaTsKICAgIHVuc2lnbmVkIGludCAgICB1aXRtcCA9IDA7CgogICAgb2lkICAgICAgICAgICAgKm9pZEluZGV4ID0gKm9pZFN0YXJ0OwoKICAgIGlmICh2YXIgPT0gTlVMTCB8fCAoKCpvaWRMZW4gPT0gMCkgJiYgKGNvbXBsZXRlID09IDApKSkKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICBlbHNlIHsKICAgICAgICBzd2l0Y2ggKHZhci0+dHlwZSkgewogICAgICAgIGNhc2UgQVNOX0lOVEVHRVI6CiAgICAgICAgY2FzZSBBU05fQ09VTlRFUjoKICAgICAgICBjYXNlIEFTTl9HQVVHRToKICAgICAgICBjYXNlIEFTTl9USU1FVElDS1M6CiAgICAgICAgICAgIGlmICgqb2lkTGVuKSB7CiAgICAgICAgICAgICAgICBzbm1wX3NldF92YXJfdmFsdWUodmFyLCAodV9jaGFyICopIG9pZEluZGV4KyssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgLS0oKm9pZExlbik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzbm1wX3NldF92YXJfdmFsdWUodmFyLCAodV9jaGFyICopIG9pZExlbiwgc2l6ZW9mKGxvbmcpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiUGFyc2VkIGludCglZCk6ICVsZFxuIiwgdmFyLT50eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAqdmFyLT52YWwuaW50ZWdlcikpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBBU05fSVBBRERSRVNTOgogICAgICAgICAgICBpZiAoKDQgPiAqb2lkTGVuKSAmJiAoY29tcGxldGUgPT0gMCkpCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNCAmJiBpIDwgKm9pZExlbjsgKytpKSB7CiAgICAgICAgICAgICAgICBpZiAob2lkSW5kZXhbaV0gPiAyNTUpIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIG9pZCBpbiBpbmRleDogJSIgTkVUU05NUF9QUklvICJkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9pZEluZGV4WzBdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsgIC8qIHN1Yi1pZGVudGlmaWVyIHRvbyBsYXJnZSAqLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1aXRtcCA9IHVpdG1wICsgKG9pZEluZGV4W2ldIDw8ICg4KigzLWkpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICg0ID4gKGludCkgKCpvaWRMZW4pKSB7CiAgICAgICAgICAgICAgICBvaWRJbmRleCArPSAqb2lkTGVuOwogICAgICAgICAgICAgICAgKCpvaWRMZW4pID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG9pZEluZGV4ICs9IDQ7CiAgICAgICAgICAgICAgICAoKm9pZExlbikgLT0gNDsKICAgICAgICAgICAgfQogICAgICAgICAgICB1aXRtcCA9IGh0b25sKHVpdG1wKTsgLyogcHV0IGl0IGluIHByb3BlciBvcmRlciBmb3IgYnl0ZSBjb3BpZXMgKi8KICAgICAgICAgICAgdWl0bXAgPSAKICAgICAgICAgICAgICAgIHNubXBfc2V0X3Zhcl92YWx1ZSh2YXIsICh1X2NoYXIgKikgJnVpdG1wLCA0KTsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnNlZCBpcGFkZHIoJWQpOiAlZC4lZC4lZC4lZFxuIiwgdmFyLT50eXBlLAogICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmdbMF0sIHZhci0+dmFsLnN0cmluZ1sxXSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nWzJdLCB2YXItPnZhbC5zdHJpbmdbM10pKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQVNOX09CSkVDVF9JRDoKICAgICAgICBjYXNlIEFTTl9QUklWX0lNUExJRURfT0JKRUNUX0lEOgogICAgICAgICAgICBpZiAodmFyLT50eXBlID09IEFTTl9QUklWX0lNUExJRURfT0JKRUNUX0lEKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogbWlnaHQgbm90IGJlIGltcGxpZWQsIG1pZ2h0IGJlIGZpeGVkIGxlbi4gY2hlY2sgaWYKICAgICAgICAgICAgICAgICAqIGNhbGxlciBzZXQgdXAgdmFsIGxlbiwgYW5kIHVzZSBpdCBpZiB0aGV5IGRpZC4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKDAgPT0gdmFyLT52YWxfbGVuKQogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gKm9pZExlbjsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlczpmaXgiLCAiZml4ZWQgbGVuIG9pZFxuIikpOwogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gdmFyLT52YWxfbGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCpvaWRMZW4pIHsKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9ICpvaWRJbmRleCsrOwogICAgICAgICAgICAgICAgICAgIC0tKCpvaWRMZW4pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKHVpdG1wID4gKm9pZExlbikgJiYgKGNvbXBsZXRlID09IDApKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHVpdG1wID4gTUFYX09JRF9MRU4pCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7ICAvKiB0b28gYmlnIGFuZCBpbGxlZ2FsICovCgogICAgICAgICAgICBpZiAodWl0bXAgPiAqb2lkTGVuKSB7CiAgICAgICAgICAgICAgICBtZW1jcHkodG1wb3V0LCBvaWRJbmRleCwgc2l6ZW9mKG9pZCkgKiAoKm9pZExlbikpOwogICAgICAgICAgICAgICAgbWVtc2V0KCZ0bXBvdXRbKm9pZExlbl0sIDB4MDAsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKiAodWl0bXAgLSAqb2lkTGVuKSk7CiAgICAgICAgICAgICAgICBzbm1wX3NldF92YXJfdmFsdWUodmFyLCAodV9jaGFyICopIHRtcG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSAqIHVpdG1wKTsKICAgICAgICAgICAgICAgIG9pZEluZGV4ICs9ICpvaWRMZW47CiAgICAgICAgICAgICAgICAoKm9pZExlbikgPSAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc25tcF9zZXRfdmFyX3ZhbHVlKHZhciwgKHVfY2hhciAqKSBvaWRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSAqIHVpdG1wKTsKICAgICAgICAgICAgICAgIG9pZEluZGV4ICs9IHVpdG1wOwogICAgICAgICAgICAgICAgKCpvaWRMZW4pIC09IHVpdG1wOwogICAgICAgICAgICB9CgogICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLCAiUGFyc2VkIG9pZDogIikpOwogICAgICAgICAgICBERUJVR01TR09JRCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLm9iamlkLCB2YXItPnZhbF9sZW4gLyBzaXplb2Yob2lkKSkpOwogICAgICAgICAgICBERUJVR01TRygoInBhcnNlX29pZF9pbmRleGVzIiwgIlxuIikpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBBU05fT1BBUVVFOgogICAgICAgIGNhc2UgQVNOX09DVEVUX1NUUjoKICAgICAgICBjYXNlIEFTTl9QUklWX0lNUExJRURfT0NURVRfU1RSOgogICAgICAgICAgICBpZiAodmFyLT50eXBlID09IEFTTl9QUklWX0lNUExJRURfT0NURVRfU1RSKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogbWlnaHQgbm90IGJlIGltcGxpZWQsIG1pZ2h0IGJlIGZpeGVkIGxlbi4gY2hlY2sgaWYKICAgICAgICAgICAgICAgICAqIGNhbGxlciBzZXQgdXAgdmFsIGxlbiwgYW5kIHVzZSBpdCBpZiB0aGV5IGRpZC4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKDAgPT0gdmFyLT52YWxfbGVuKQogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gKm9pZExlbjsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlczpmaXgiLCAiZml4ZWQgbGVuIHN0clxuIikpOwogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gdmFyLT52YWxfbGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCpvaWRMZW4pIHsKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9ICpvaWRJbmRleCsrOwogICAgICAgICAgICAgICAgICAgIC0tKCpvaWRMZW4pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKHVpdG1wID4gKm9pZExlbikgJiYgKGNvbXBsZXRlID09IDApKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogd2UgaGFuZGxlIHRoaXMgb25lIG91cnNlbHZlcyBzaW5jZSB3ZSBkb24ndCBoYXZlCiAgICAgICAgICAgICAqIHByZS1hbGxvY2F0ZWQgbWVtb3J5IHRvIGNvcHkgZnJvbSB1c2luZwogICAgICAgICAgICAgKiBzbm1wX3NldF92YXJfdmFsdWUoKSAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAodWl0bXAgPT0gMCkKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiB6ZXJvIGxlbmd0aCBzdHJpbmdzIHNob3VsZG4ndCBtYWxsb2MgKi8KCiAgICAgICAgICAgIGlmICh1aXRtcCA+IE1BWF9PSURfTEVOKQogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOyAgLyogdG9vIGJpZyBhbmQgaWxsZWdhbCAqLwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogbWFsbG9jIGJ5IHNpemUrMSB0byBhbGxvdyBhIG51bGwgdG8gYmUgYXBwZW5kZWQuIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFyLT52YWxfbGVuID0gdWl0bXA7CiAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZyA9ICh1X2NoYXIgKikgY2FsbG9jKDEsIHVpdG1wICsgMSk7CiAgICAgICAgICAgIGlmICh2YXItPnZhbC5zdHJpbmcgPT0gTlVMTCkKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAgICAgICAgIGlmICgoc2l6ZV90KXVpdG1wID4gKCpvaWRMZW4pKSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKm9pZExlbjsgKytpKQogICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZ1tpXSA9ICh1X2NoYXIpICogb2lkSW5kZXgrKzsKICAgICAgICAgICAgICAgIGZvciAoaSA9ICpvaWRMZW47IGkgPCB1aXRtcDsgKytpKQogICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZ1tpXSA9ICdcMCc7CiAgICAgICAgICAgICAgICAoKm9pZExlbikgPSAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHVpdG1wOyArK2kpCiAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nW2ldID0gKHVfY2hhcikgKiBvaWRJbmRleCsrOwogICAgICAgICAgICAgICAgKCpvaWRMZW4pIC09IHVpdG1wOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZ1t1aXRtcF0gPSAnXDAnOwoKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnNlZCBzdHIoJWQpOiAlc1xuIiwgdmFyLT50eXBlLAogICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmcpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGFzbiB0eXBlOiAlZFxuIiwgdmFyLT50eXBlKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICB9CiAgICB9CiAgICAoKm9pZFN0YXJ0KSA9IG9pZEluZGV4OwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKLyoKICogZHVtcF9yZWFsbG9jX29pZF90b19pbmV0YWRkcmVzczoKICogICByZXR1cm4gMCBmb3IgZmFpbHVyZSwKICogICByZXR1cm4gMSBmb3Igc3VjY2VzcywKICogICByZXR1cm4gMiBmb3Igbm90IGhhbmRsZWQKICovCgppbnQgCmR1bXBfcmVhbGxvY19vaWRfdG9faW5ldGFkZHJlc3MoY29uc3QgaW50IGFkZHJfdHlwZSwgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBxdW90ZWNoYXIpCnsKICAgIGludCAgICAgICAgICAgICBpLCBsZW47CiAgICBjaGFyICAgICAgICAgICAgaW50YnVmWzY0XSwgKnA7CiAgICBjaGFyICpjb25zdCAgICAgZW5kID0gaW50YnVmICsgc2l6ZW9mKGludGJ1Zik7CiAgICB1bnNpZ25lZCBjaGFyICAqemM7CiAgICB1bnNpZ25lZCBsb25nICAgem9uZTsKCiAgICBpZiAoIWJ1ZikKICAgICAgICByZXR1cm4gMTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgb2JqaWRsZW47IGkrKykKICAgICAgICBpZiAob2JqaWRbaV0gPCAwIHx8IG9iamlkW2ldID4gMjU1KQogICAgICAgICAgICByZXR1cm4gMjsKCiAgICBwID0gaW50YnVmOwogICAgKnArKyA9IHF1b3RlY2hhcjsKCiAgICBzd2l0Y2ggKGFkZHJfdHlwZSkgewogICAgY2FzZSBJUFY0OgogICAgY2FzZSBJUFY0WjoKICAgICAgICBpZiAoKGFkZHJfdHlwZSA9PSBJUFY0ICAmJiBvYmppZGxlbiAhPSA0KSB8fAogICAgICAgICAgICAoYWRkcl90eXBlID09IElQVjRaICYmIG9iamlkbGVuICE9IDgpKQogICAgICAgICAgICByZXR1cm4gMjsKCiAgICAgICAgbGVuID0gc25wcmludGYocCwgZW5kIC0gcCwgIiUiIE5FVFNOTVBfUFJJbyAidS4lIiBORVRTTk1QX1BSSW8gInUuIgogICAgICAgICAgICAgICAgICAgICAgIiUiIE5FVFNOTVBfUFJJbyAidS4lIiBORVRTTk1QX1BSSW8gInUiLAogICAgICAgICAgICAgICAgICAgICAgb2JqaWRbMF0sIG9iamlkWzFdLCBvYmppZFsyXSwgb2JqaWRbM10pOwogICAgICAgIHAgKz0gbGVuOwogICAgICAgIGlmIChwID49IGVuZCkKICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgaWYgKGFkZHJfdHlwZSA9PSBJUFY0WikgewogICAgICAgICAgICB6YyA9ICh1bnNpZ25lZCBjaGFyKikmem9uZTsKICAgICAgICAgICAgemNbMF0gPSBvYmppZFs0XTsKICAgICAgICAgICAgemNbMV0gPSBvYmppZFs1XTsKICAgICAgICAgICAgemNbMl0gPSBvYmppZFs2XTsKICAgICAgICAgICAgemNbM10gPSBvYmppZFs3XTsKICAgICAgICAgICAgem9uZSA9IG50b2hsKHpvbmUpOwogICAgICAgICAgICBsZW4gPSBzbnByaW50ZihwLCBlbmQgLSBwLCAiJSUlbHUiLCB6b25lKTsKICAgICAgICAgICAgcCArPSBsZW47CiAgICAgICAgICAgIGlmIChwID49IGVuZCkKICAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBJUFY2OgogICAgY2FzZSBJUFY2WjoKICAgICAgICBpZiAoKGFkZHJfdHlwZSA9PSBJUFY2ICYmIG9iamlkbGVuICE9IDE2KSB8fAogICAgICAgICAgICAoYWRkcl90eXBlID09IElQVjZaICYmIG9iamlkbGVuICE9IDIwKSkKICAgICAgICAgICAgcmV0dXJuIDI7CgogICAgICAgIGxlbiA9IDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICsrKSB7CiAgICAgICAgICAgIGxlbiA9IHNucHJpbnRmKHAsIGVuZCAtIHAsICIlcyUwMiIgTkVUU05NUF9QUklvICJ4IiwgaSA/ICI6IiA6ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZFtpXSk7CiAgICAgICAgICAgIHAgKz0gbGVuOwogICAgICAgICAgICBpZiAocCA+PSBlbmQpCiAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9CgogICAgICAgIGlmIChhZGRyX3R5cGUgPT0gSVBWNlopIHsKICAgICAgICAgICAgemMgPSAodW5zaWduZWQgY2hhciopJnpvbmU7CiAgICAgICAgICAgIHpjWzBdID0gb2JqaWRbMTZdOwogICAgICAgICAgICB6Y1sxXSA9IG9iamlkWzE3XTsKICAgICAgICAgICAgemNbMl0gPSBvYmppZFsxOF07CiAgICAgICAgICAgIHpjWzNdID0gb2JqaWRbMTldOwogICAgICAgICAgICB6b25lID0gbnRvaGwoem9uZSk7CiAgICAgICAgICAgIGxlbiA9IHNucHJpbnRmKHAsIGVuZCAtIHAsICIlJSVsdSIsIHpvbmUpOwogICAgICAgICAgICBwICs9IGxlbjsKICAgICAgICAgICAgaWYgKHAgPj0gZW5kKQogICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgfQoKICAgICAgICBicmVhazsKCiAgICBjYXNlIEROUzoKICAgIGRlZmF1bHQ6IAogICAgICAgIC8qIEROUyBjYW4ganVzdCBiZSBoYW5kbGVkIGJ5IGR1bXBfcmVhbGxvY19vaWRfdG9fc3RyaW5nKCkgKi8KICAgICAgICByZXR1cm4gMjsKICAgIH0KCiAgICAqcCsrID0gcXVvdGVjaGFyOwogICAgaWYgKHAgPj0gZW5kKQogICAgICAgIHJldHVybiAyOwoKICAgICpwKysgPSAnXDAnOwogICAgaWYgKHAgPj0gZW5kKQogICAgICAgIHJldHVybiAyOwoKICAgIHJldHVybiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBpbnRidWYpOwp9CgppbnQKZHVtcF9yZWFsbG9jX29pZF90b19zdHJpbmcoY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcXVvdGVjaGFyKQp7CiAgICBpZiAoYnVmKSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIGksIGFsZW47CgogICAgICAgIGZvciAoaSA9IDAsIGFsZW4gPSAwOyBpIDwgKGludCkgb2JqaWRsZW47IGkrKykgewogICAgICAgICAgICBvaWQgICAgICAgICAgICAgdHN0ID0gb2JqaWRbaV07CiAgICAgICAgICAgIGlmICgodHN0ID4gMjU0KSB8fCAoIWlzcHJpbnQodHN0KSkpIHsKICAgICAgICAgICAgICAgIHRzdCA9IChvaWQpICcuJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGFsZW4gPT0gMCkgewogICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKSkgewogICAgICAgICAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1xcJzsKICAgICAgICAgICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSBxdW90ZWNoYXI7CiAgICAgICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAoY2hhcikgdHN0OwogICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgIGFsZW4rKzsKICAgICAgICB9CgogICAgICAgIGlmIChhbGVuKSB7CiAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUykpIHsKICAgICAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcXCc7CiAgICAgICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDIpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IHF1b3RlY2hhcjsKICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgIH0KCiAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1wwJzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKdm9pZApfb2lkX2ZpbmlzaF9wcmludGluZyhjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgaW50ICpidWZfb3ZlcmZsb3cpIHsKICAgIGNoYXIgICAgICAgICAgICBpbnRidWZbNjRdOwogICAgaWYgKCpidWYgIT0gTlVMTCAmJiAqKCpidWYgKyAqb3V0X2xlbiAtIDEpICE9ICcuJykgewogICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIi4iKSkgewogICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgd2hpbGUgKG9iamlkbGVuLS0gPiAwKSB7ICAgIC8qIG91dHB1dCByZXN0IG9mIG5hbWUsIHVuaW50ZXJwcmV0ZWQgKi8KICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiUiIE5FVFNOTVBfUFJJbyAidS4iLCAqb2JqaWQrKyk7CiAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBpbnRidWYpKSB7CiAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoKmJ1ZiAhPSBOVUxMKSB7CiAgICAgICAgKigqYnVmICsgKm91dF9sZW4gLSAxKSA9ICdcMCc7ICAvKiByZW1vdmUgdHJhaWxpbmcgZG90ICovCiAgICAgICAgKm91dF9sZW4gPSAqb3V0X2xlbiAtIDE7CiAgICB9Cn0KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCnN0YXRpYyBzdHJ1Y3QgdHJlZSAqCl9nZXRfcmVhbGxvY19zeW1ib2woY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJlZSAqc3VidHJlZSwKICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLCBpbnQgKmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaW5fZGljZXMsIHNpemVfdCAqIGVuZF9vZl9rbm93bikKewogICAgc3RydWN0IHRyZWUgICAgKnJldHVybl90cmVlID0gTlVMTDsKICAgIGludCAgICAgICAgICAgICBleHRlbmRlZF9pbmRleCA9CiAgICAgICAgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VYVEVOREVEX0lOREVYKTsKICAgIGludCAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0ID0KICAgICAgICBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCk7CiAgICBjaGFyICAgICAgICAgICAgaW50YnVmWzY0XTsKCiAgICBpZiAoIW9iamlkIHx8ICFidWYpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBmb3IgKDsgc3VidHJlZTsgc3VidHJlZSA9IHN1YnRyZWUtPm5leHRfcGVlcikgewogICAgICAgIGlmICgqb2JqaWQgPT0gc3VidHJlZS0+c3ViaWQpIHsKCSAgICB3aGlsZSAoc3VidHJlZS0+bmV4dF9wZWVyICYmIHN1YnRyZWUtPm5leHRfcGVlci0+c3ViaWQgPT0gKm9iamlkKQoJCXN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXI7CiAgICAgICAgICAgIGlmIChzdWJ0cmVlLT5pbmRleGVzKSB7CiAgICAgICAgICAgICAgICBpbl9kaWNlcyA9IHN1YnRyZWUtPmluZGV4ZXM7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VidHJlZS0+YXVnbWVudHMpIHsKICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICAgICp0cDIgPQogICAgICAgICAgICAgICAgICAgIGZpbmRfdHJlZV9ub2RlKHN1YnRyZWUtPmF1Z21lbnRzLCAtMSk7CiAgICAgICAgICAgICAgICBpZiAodHAyKSB7CiAgICAgICAgICAgICAgICAgICAgaW5fZGljZXMgPSB0cDItPmluZGV4ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc3RybmNtcChzdWJ0cmVlLT5sYWJlbCwgQU5PTiwgQU5PTl9MRU4pIHx8CiAgICAgICAgICAgICAgICAoTkVUU05NUF9PSURfT1VUUFVUX05VTUVSSUMgPT0gb3V0cHV0X2Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWx1Iiwgc3VidHJlZS0+c3ViaWQpOwogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZS0+bGFiZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChvYmppZGxlbiA+IDEpIHsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIuIikpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm5fdHJlZSA9IF9nZXRfcmVhbGxvY19zeW1ib2wob2JqaWQgKyAxLCBvYmppZGxlbiAtIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZS0+Y2hpbGRfbGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfb3ZlcmZsb3csIGluX2RpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9vZl9rbm93bik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChyZXR1cm5fdHJlZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuX3RyZWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3VidHJlZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCgogICAgaWYgKGVuZF9vZl9rbm93bikgewogICAgICAgICplbmRfb2Zfa25vd24gPSAqb3V0X2xlbjsKICAgIH0KCiAgICAvKgogICAgICogU3VidHJlZSBub3QgZm91bmQuICAKICAgICAqLwoKICAgIHdoaWxlIChpbl9kaWNlcyAmJiAob2JqaWRsZW4gPiAwKSAmJgogICAgICAgICAgIChORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQyAhPSBvdXRwdXRfZm9ybWF0KSAmJgogICAgICAgICAgICFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9CUkVBS0RPV05fT0lEUykpIHsKICAgICAgICBzaXplX3QgICAgICAgICAgbnVtaWRzOwogICAgICAgIHN0cnVjdCB0cmVlICAgICp0cDsKCiAgICAgICAgdHAgPSBmaW5kX3RyZWVfbm9kZShpbl9kaWNlcy0+aWxhYmVsLCAtMSk7CgogICAgICAgIGlmICghdHApIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogQ2FuJ3QgZmluZCBhbiBpbmRleCBpbiB0aGUgbWliIHRyZWUuICBCYWlsLiAgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICB9CgogICAgICAgIGlmIChleHRlbmRlZF9pbmRleCkgewogICAgICAgICAgICBpZiAoKmJ1ZiAhPSBOVUxMICYmICooKmJ1ZiArICpvdXRfbGVuIC0gMSkgPT0gJy4nKSB7CiAgICAgICAgICAgICAgICAoKm91dF9sZW4pLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJbIikpIHsKICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKHRwLT50eXBlKSB7CiAgICAgICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgICAgICBpZiAoZXh0ZW5kZWRfaW5kZXggJiYgdHAtPmhpbnQpIHsKICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCB2YXI7CiAgICAgICAgICAgICAgICB1X2NoYXIgICAgICAgICAgYnVmZmVyWzEwMjRdOwogICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGk7CgogICAgICAgICAgICAgICAgbWVtc2V0KCZ2YXIsIDAsIHNpemVvZiB2YXIpOwogICAgICAgICAgICAgICAgaWYgKGluX2RpY2VzLT5pc2ltcGxpZWQpIHsKICAgICAgICAgICAgICAgICAgICBudW1pZHMgPSBvYmppZGxlbjsKICAgICAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cC0+cmFuZ2VzICYmICF0cC0+cmFuZ2VzLT5uZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRwLT5yYW5nZXMtPmxvdyA9PSB0cC0+cmFuZ2VzLT5oaWdoKSB7CiAgICAgICAgICAgICAgICAgICAgbnVtaWRzID0gdHAtPnJhbmdlcy0+bG93OwogICAgICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG51bWlkcyA9ICpvYmppZDsKICAgICAgICAgICAgICAgICAgICBpZiAobnVtaWRzID49IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgICAgICAgICBvYmppZCsrOwogICAgICAgICAgICAgICAgICAgIG9iamlkbGVuLS07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgbnVtaWRzOyBpKyspCiAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gKHVfY2hhcikgb2JqaWRbaV07CiAgICAgICAgICAgICAgICB2YXIudHlwZSA9IEFTTl9PQ1RFVF9TVFI7CiAgICAgICAgICAgICAgICB2YXIudmFsLnN0cmluZyA9IGJ1ZmZlcjsKICAgICAgICAgICAgICAgIHZhci52YWxfbGVuID0gbnVtaWRzOwogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19vY3RldF9zdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICZ2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgdHAtPmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGluX2RpY2VzLT5pc2ltcGxpZWQpIHsKICAgICAgICAgICAgICAgIG51bWlkcyA9IG9iamlkbGVuOwogICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwoKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICAgICAgICAgIGlmICghZHVtcF9yZWFsbG9jX29pZF90b19zdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgKG9iamlkLCBudW1pZHMsIGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICdcJycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICh0cC0+cmFuZ2VzICYmICF0cC0+cmFuZ2VzLT5uZXh0CiAgICAgICAgICAgICAgICAgICAgICAgJiYgdHAtPnJhbmdlcy0+bG93ID09IHRwLT5yYW5nZXMtPmhpZ2gpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBhIGZpeGVkLWxlbmd0aCBvY3RldCBzdHJpbmcgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG51bWlkcyA9IHRwLT5yYW5nZXMtPmxvdzsKICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKCiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWR1bXBfcmVhbGxvY19vaWRfdG9fc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIChvYmppZCwgbnVtaWRzLCBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAnXCcnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBudW1pZHMgPSAoc2l6ZV90KSAqIG9iamlkICsgMTsKICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuCiAgICAgICAgICAgICAgICAgICAgICAgIChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VTQ0FQRV9RVU9URVMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIlxcIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIlwiIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuCiAgICAgICAgICAgICAgICAgICAgICAgIChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VTQ0FQRV9RVU9URVMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIlxcIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIlwiIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKiBuZXh0X3BlZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3JtYWxfaGFuZGxpbmcgPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRwLT5uZXh0X3BlZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfcGVlciA9IHRwLT5uZXh0X3BlZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyeSBoYW5kbGluZyB0aGUgSW5ldEFkZHJlc3MgaW4gdGhlIE9JRCwgaW4gY2FzZSBvZiBmYWlsdXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgKiB1c2UgdGhlIG5vcm1hbF9oYW5kbGluZy4gCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHAtPm5leHRfcGVlciAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnRjX2luZGV4ICE9IC0xICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3BlZXItPnRjX2luZGV4ICE9IC0xICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoZ2V0X3RjX2Rlc2NyaXB0b3IodHAtPnRjX2luZGV4KSwgIkluZXRBZGRyZXNzIikgPT0gMCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGdldF90Y19kZXNjcmlwdG9yKG5leHRfcGVlci0+dGNfaW5kZXgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZXRBZGRyZXNzVHlwZSIpID09IDAgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZGRyX3R5cGUgPSAqKG9iamlkIC0gMSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gZHVtcF9yZWFsbG9jX29pZF90b19pbmV0YWRkcmVzcyhhZGRyX3R5cGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQgKyAxLCBudW1pZHMgLSAxLCBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAnIicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsX2hhbmRsaW5nID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbF9oYW5kbGluZyAmJiAhZHVtcF9yZWFsbG9jX29pZF90b19zdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmppZCArIDEsIG51bWlkcyAtIDEsIGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAnIicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvYmppZCArPSBudW1pZHM7CiAgICAgICAgICAgIG9iamlkbGVuIC09IG51bWlkczsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICAgICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICAgICAgaWYgKHRwLT5lbnVtcykgewogICAgICAgICAgICAgICAgc3RydWN0IGVudW1fbGlzdCAqZXAgPSB0cC0+ZW51bXM7CiAgICAgICAgICAgICAgICB3aGlsZSAoZXAgJiYgZXAtPnZhbHVlICE9IChpbnQpICgqb2JqaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgZXAgPSBlcC0+bmV4dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChlcCkgewogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgZXAtPmxhYmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJSIgTkVUU05NUF9QUklvICJ1IiwgKm9iamlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlIiBORVRTTk1QX1BSSW8gInUiLCAqb2JqaWQpOwogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG9iamlkKys7CiAgICAgICAgICAgIG9iamlkbGVuLS07CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFRZUEVfVElNRVRJQ0tTOgogICAgICAgICAgICAvKiBJbiBhbiBpbmRleCwgdGhpcyBpcyBwcm9iYWJseSBhIHRpbWVmaWx0ZXIgKi8KICAgICAgICAgICAgaWYgKGV4dGVuZGVkX2luZGV4KSB7CiAgICAgICAgICAgICAgICB1cHRpbWVTdHJpbmcoICpvYmppZCwgaW50YnVmLCBzaXplb2YoIGludGJ1ZiApICk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiUiIE5FVFNOTVBfUFJJbyAidSIsICpvYmppZCk7CiAgICAgICAgICAgIH0gICAKICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50YnVmKSkgewogICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2JqaWQrKzsKICAgICAgICAgICAgb2JqaWRsZW4tLTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9PQkpJRDoKICAgICAgICAgICAgaWYgKGluX2RpY2VzLT5pc2ltcGxpZWQpIHsKICAgICAgICAgICAgICAgIG51bWlkcyA9IG9iamlkbGVuOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbnVtaWRzID0gKHNpemVfdCkgKiBvYmppZCArIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgIGlmIChleHRlbmRlZF9pbmRleCkgewogICAgICAgICAgICAgICAgaWYgKGluX2RpY2VzLT5pc2ltcGxpZWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZShidWYsIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1pZHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUoYnVmLCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWlkcyAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgX2dldF9yZWFsbG9jX3N5bWJvbChvYmppZCwgbnVtaWRzLCBOVUxMLCBidWYsIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2JqaWQgKz0gKG51bWlkcyk7CiAgICAgICAgICAgIG9iamlkbGVuIC09IChudW1pZHMpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBUWVBFX0lQQUREUjoKICAgICAgICAgICAgaWYgKG9iamlkbGVuIDwgNCkKICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiUiIE5FVFNOTVBfUFJJbyAidS4lIiBORVRTTk1QX1BSSW8gInUuIgogICAgICAgICAgICAgICAgICAgICIlIiBORVRTTk1QX1BSSW8gInUuJSIgTkVUU05NUF9QUklvICJ1IiwKICAgICAgICAgICAgICAgICAgICBvYmppZFswXSwgb2JqaWRbMV0sIG9iamlkWzJdLCBvYmppZFszXSk7CiAgICAgICAgICAgIG9iamlkICs9IDQ7CiAgICAgICAgICAgIG9iamlkbGVuIC09IDQ7CiAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBUWVBFX05FVEFERFI6ewogICAgICAgICAgICAgICAgb2lkICAgICAgICAgICAgIG50eXBlID0gKm9iamlkKys7CgogICAgICAgICAgICAgICAgb2JqaWRsZW4tLTsKICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJSIgTkVUU05NUF9QUklvICJ1LiIsIG50eXBlKTsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobnR5cGUgPT0gMSAmJiBvYmppZGxlbiA+PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlIiBORVRTTk1QX1BSSW8gInUuJSIgTkVUU05NUF9QUklvICJ1LiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiBORVRTTk1QX1BSSW8gInUuJSIgTkVUU05NUF9QUklvICJ1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkWzBdLCBvYmppZFsxXSwgb2JqaWRbMl0sIG9iamlkWzNdKTsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9iamlkICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgb2JqaWRsZW4gLT0gNDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9OU0FQQUREUkVTUzoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoZXh0ZW5kZWRfaW5kZXgpIHsKICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJdIikpIHsKICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIuIikpIHsKICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGluX2RpY2VzID0gaW5fZGljZXMtPm5leHQ7CiAgICB9CgogIGZpbmlzaF9pdDoKICAgIF9vaWRfZmluaXNoX3ByaW50aW5nKG9iamlkLCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIGJ1Zl9vdmVyZmxvdyk7CiAgICByZXR1cm4gTlVMTDsKfQoKc3RydWN0IHRyZWUgICAgKgpnZXRfdHJlZShjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLCBzdHJ1Y3QgdHJlZSAqc3VidHJlZSkKewogICAgc3RydWN0IHRyZWUgICAgKnJldHVybl90cmVlID0gTlVMTDsKCiAgICBmb3IgKDsgc3VidHJlZTsgc3VidHJlZSA9IHN1YnRyZWUtPm5leHRfcGVlcikgewogICAgICAgIGlmICgqb2JqaWQgPT0gc3VidHJlZS0+c3ViaWQpCiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICB9CgogICAgcmV0dXJuIE5VTEw7CgogIGZvdW5kOgogICAgd2hpbGUgKHN1YnRyZWUtPm5leHRfcGVlciAmJiBzdWJ0cmVlLT5uZXh0X3BlZXItPnN1YmlkID09ICpvYmppZCkKCXN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXI7CiAgICBpZiAob2JqaWRsZW4gPiAxKQogICAgICAgIHJldHVybl90cmVlID0KICAgICAgICAgICAgZ2V0X3RyZWUob2JqaWQgKyAxLCBvYmppZGxlbiAtIDEsIHN1YnRyZWUtPmNoaWxkX2xpc3QpOwogICAgaWYgKHJldHVybl90cmVlICE9IE5VTEwpCiAgICAgICAgcmV0dXJuIHJldHVybl90cmVlOwogICAgZWxzZQogICAgICAgIHJldHVybiBzdWJ0cmVlOwp9CgovKioKICogUHJpbnRzIG9uIG9pZCBkZXNjcmlwdGlvbiBvbiBzdGRvdXQuCiAqCiAqIEBzZWUgZnByaW50X2Rlc2NyaXB0aW9uCiAqLwp2b2lkCnByaW50X2Rlc2NyaXB0aW9uKG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sIC8qIG51bWJlciBvZiBzdWJpZGVudGlmaWVycyAqLwogICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpCnsKICAgIGZwcmludF9kZXNjcmlwdGlvbihzdGRvdXQsIG9iamlkLCBvYmppZGxlbiwgd2lkdGgpOwp9CgoKLyoqCiAqIFByaW50cyBvbiBvaWQgZGVzY3JpcHRpb24gaW50byBhIGZpbGUgZGVzY3JpcHRvci4KICogCiAqIEBwYXJhbSBmICAgICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciB0byBwcmludCB0by4KICogQHBhcmFtIG9iamlkICAgICBUaGUgb2JqZWN0IGlkZW50aWZpZXIuCiAqIEBwYXJhbSBvYmppZGxlbiAgVGhlIG9iamVjdCBpZCBsZW5ndGguCiAqIEBwYXJhbSB3aWR0aCAgICAgTnVtYmVyIG9mIHN1YmlkZW50aWZpZXJzLgogKi8Kdm9pZApmcHJpbnRfZGVzY3JpcHRpb24oRklMRSAqIGYsIG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpCnsKICAgIHVfY2hhciAgICAgICAgICpidWYgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIGJ1Zl9sZW4gPSAyNTYsIG91dF9sZW4gPSAwOwoKICAgIGlmICgoYnVmID0gKHVfY2hhciAqKSBjYWxsb2MoYnVmX2xlbiwgMSkpID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKGYsICJbVFJVTkNBVEVEXVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2Rlc2NyaXB0aW9uKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwgb2JqaWRsZW4sIHdpZHRoKSkgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlcyBbVFJVTkNBVEVEXVxuIiwgYnVmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlc1xuIiwgYnVmKTsKICAgICAgICB9CiAgICB9CgogICAgU05NUF9GUkVFKGJ1Zik7Cn0KCmludApzbnByaW50X2Rlc2NyaXB0aW9uKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwgaW50IHdpZHRoKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CgogICAgaWYgKHNwcmludF9yZWFsbG9jX2Rlc2NyaXB0aW9uKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgd2lkdGgpKSB7CiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KfQoKaW50CnNwcmludF9yZWFsbG9jX2Rlc2NyaXB0aW9uKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLCBpbnQgd2lkdGgpCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cCA9IGdldF90cmVlKG9iamlkLCBvYmppZGxlbiwgdHJlZV9oZWFkKTsKICAgIHN0cnVjdCB0cmVlICAgICpzdWJ0cmVlID0gdHJlZV9oZWFkOwogICAgaW50ICAgICAgICAgICAgIHBvcywgbGVuOwogICAgY2hhciAgICAgICAgICAgIHRtcGJ1ZlsxMjhdOwogICAgY29uc3QgY2hhciAgICAgKmNwOwoKICAgIGlmIChOVUxMID09IHRwKQogICAgICAgIHJldHVybiAwOwoKICAgIGlmICh0cC0+dHlwZSA8PSBUWVBFX1NJTVBMRV9MQVNUKQogICAgICAgIGNwID0gIiBPQkpFQ1QtVFlQRSI7CiAgICBlbHNlCiAgICAgICAgc3dpdGNoICh0cC0+dHlwZSkgewogICAgICAgIGNhc2UgVFlQRV9UUkFQVFlQRToKICAgICAgICAgICAgY3AgPSAiIFRSQVAtVFlQRSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9OT1RJRlRZUEU6CiAgICAgICAgICAgIGNwID0gIiBOT1RJRklDQVRJT04tVFlQRSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PQkpHUk9VUDoKICAgICAgICAgICAgY3AgPSAiIE9CSkVDVC1HUk9VUCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9BR0VOVENBUDoKICAgICAgICAgICAgY3AgPSAiIEFHRU5ULUNBUEFCSUxJVElFUyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9NT0RJRDoKICAgICAgICAgICAgY3AgPSAiIE1PRFVMRS1JREVOVElUWSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PQkpJREVOVElUWToKICAgICAgICAgICAgY3AgPSAiIE9CSkVDVC1JREVOVElUWSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9NT0RDT01QOgogICAgICAgICAgICBjcCA9ICIgTU9EVUxFLUNPTVBMSUFOQ0UiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBzcHJpbnRmKHRtcGJ1ZiwgIiB0eXBlXyVkIiwgdHAtPnR5cGUpOwogICAgICAgICAgICBjcCA9IHRtcGJ1ZjsKICAgICAgICB9CgogICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cC0+bGFiZWwpIHx8CiAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSB8fAogICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKCFwcmludF90cmVlX25vZGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cCwgd2lkdGgpKQogICAgICAgIHJldHVybiAwOwogICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiOjo9IHsiKSkKICAgICAgICByZXR1cm4gMDsKICAgIHBvcyA9IDU7CiAgICB3aGlsZSAob2JqaWRsZW4gPiAxKSB7CiAgICAgICAgZm9yICg7IHN1YnRyZWU7IHN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXIpIHsKICAgICAgICAgICAgaWYgKCpvYmppZCA9PSBzdWJ0cmVlLT5zdWJpZCkgewogICAgICAgICAgICAgICAgd2hpbGUgKHN1YnRyZWUtPm5leHRfcGVlciAmJiBzdWJ0cmVlLT5uZXh0X3BlZXItPnN1YmlkID09ICpvYmppZCkKICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlID0gc3VidHJlZS0+bmV4dF9wZWVyOwogICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoc3VidHJlZS0+bGFiZWwsIEFOT04sIEFOT05fTEVOKSkgewogICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZiksICIgJXMoJWx1KSIsIHN1YnRyZWUtPmxhYmVsLCBzdWJ0cmVlLT5zdWJpZCk7CiAgICAgICAgICAgICAgICAgICAgdG1wYnVmWyBzaXplb2YodG1wYnVmKS0xIF0gPSAwOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXBidWYsICIgJWx1Iiwgc3VidHJlZS0+c3ViaWQpOwogICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHRtcGJ1Zik7CiAgICAgICAgICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgIlxuICAgICAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zID0gNTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdG1wYnVmKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHBvcyArPSBsZW47CiAgICAgICAgICAgICAgICBvYmppZCsrOwogICAgICAgICAgICAgICAgb2JqaWRsZW4tLTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzdWJ0cmVlKQogICAgICAgICAgICBzdWJ0cmVlID0gc3VidHJlZS0+Y2hpbGRfbGlzdDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgd2hpbGUgKG9iamlkbGVuID4gMSkgewogICAgICAgIHNwcmludGYodG1wYnVmLCAiICUiIE5FVFNOTVBfUFJJbyAidSIsICpvYmppZCk7CiAgICAgICAgbGVuID0gc3RybGVuKHRtcGJ1Zik7CiAgICAgICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiAgICAgIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgcG9zID0gNTsKICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0bXBidWYpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBwb3MgKz0gbGVuOwogICAgICAgIG9iamlkKys7CiAgICAgICAgb2JqaWRsZW4tLTsKICAgIH0KICAgIHNwcmludGYodG1wYnVmLCAiICUiIE5FVFNOTVBfUFJJbyAidSB9IiwgKm9iamlkKTsKICAgIGxlbiA9IHN0cmxlbih0bXBidWYpOwogICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuICAgICAiKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgcG9zID0gNTsKICAgIH0KICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdG1wYnVmKSkKICAgICAgICByZXR1cm4gMDsKICAgIHJldHVybiAxOwp9CgpzdGF0aWMgaW50CnByaW50X3RyZWVfbm9kZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKnRwLCBpbnQgd2lkdGgpCnsKICAgIGNvbnN0IGNoYXIgICAgICpjcDsKICAgIGNoYXIgICAgICAgICAgICBzdHJbTUFYVE9LRU5dOwogICAgaW50ICAgICAgICAgICAgIGksIHByZXZtb2QsIHBvcywgbGVuOwoKICAgIGlmICh0cCkgewogICAgICAgIG1vZHVsZV9uYW1lKHRwLT5tb2RpZCwgc3RyKTsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgIC0tIEZST01cdCIpIHx8CiAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBwb3MgPSAxNitzdHJsZW4oc3RyKTsKICAgICAgICBmb3IgKGkgPSAxLCBwcmV2bW9kID0gdHAtPm1vZGlkOyBpIDwgdHAtPm51bWJlcl9tb2R1bGVzOyBpKyspIHsKICAgICAgICAgICAgaWYgKHByZXZtb2QgIT0gdHAtPm1vZHVsZV9saXN0W2ldKSB7CiAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSh0cC0+bW9kdWxlX2xpc3RbaV0sIHN0cik7CiAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oc3RyKTsKICAgICAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLFxuICAtLVx0XHQiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zID0gMTY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIsICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHBvcyArPSBsZW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJldm1vZCA9IHRwLT5tb2R1bGVfbGlzdFtpXTsKICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT50Y19pbmRleCAhPSAtMSkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIC0tIFRFWFRVQUwgQ09OVkVOVElPTiAiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF90Y19kZXNjcmlwdG9yKHRwLT50Y19pbmRleCkpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgc3dpdGNoICh0cC0+dHlwZSkgewogICAgICAgIGNhc2UgVFlQRV9PQkpJRDoKICAgICAgICAgICAgY3AgPSAiT0JKRUNUIElERU5USUZJRVIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT0NURVRTVFI6CiAgICAgICAgICAgIGNwID0gIk9DVEVUIFNUUklORyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgICAgICBjcCA9ICJJTlRFR0VSIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX05FVEFERFI6CiAgICAgICAgICAgIGNwID0gIk5ldHdvcmtBZGRyZXNzIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0lQQUREUjoKICAgICAgICAgICAgY3AgPSAiSXBBZGRyZXNzIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0NPVU5URVI6CiAgICAgICAgICAgIGNwID0gIkNvdW50ZXIzMiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICAgICAgY3AgPSAiR2F1Z2UzMiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9USU1FVElDS1M6CiAgICAgICAgICAgIGNwID0gIlRpbWVUaWNrcyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PUEFRVUU6CiAgICAgICAgICAgIGNwID0gIk9wYXF1ZSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9OVUxMOgogICAgICAgICAgICBjcCA9ICJOVUxMIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0NPVU5URVI2NDoKICAgICAgICAgICAgY3AgPSAiQ291bnRlcjY0IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0JJVFNUUklORzoKICAgICAgICAgICAgY3AgPSAiQklUUyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9OU0FQQUREUkVTUzoKICAgICAgICAgICAgY3AgPSAiTnNhcEFkZHJlc3MiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICAgICAgICAgIGNwID0gIlVJbnRlZ2VyMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICAgICAgY3AgPSAiVW5zaWduZWQzMiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICAgICAgICAgIGNwID0gIkludGVnZXIzMiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNwID0gTlVMTDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQojaWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICAgICAgaWYgKCFjcCAmJiAodHAtPnJhbmdlcyB8fCB0cC0+ZW51bXMpKSB7IC8qIHJhbmdlcyB3aXRob3V0IHR5cGUgPyAqLwogICAgICAgICAgICBzcHJpbnRmKHN0ciwgIj8wIHdpdGggJXMgJXMgPyIsCiAgICAgICAgICAgICAgICAgICAgdHAtPnJhbmdlcyA/ICJSYW5nZSIgOiAiIiwgdHAtPmVudW1zID8gIkVudW0iIDogIiIpOwogICAgICAgICAgICBjcCA9IHN0cjsKICAgICAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFICovCiAgICAgICAgaWYgKGNwKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgU1lOVEFYXHQiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+cmFuZ2VzKSB7CiAgICAgICAgICAgIHN0cnVjdCByYW5nZV9saXN0ICpycCA9IHRwLT5yYW5nZXM7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaXJzdCA9IDE7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAoIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgd2hpbGUgKHJwKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRwLT50eXBlKSB7CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICAgICAgICAgICAgICAgICAgaWYgKHJwLT5sb3cgPT0gcnAtPmhpZ2gpCiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJXMlZCIsIChmaXJzdCA/ICIiIDogIiB8ICIpLCBycC0+bG93ICk7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVzJWQuLiVkIiwgKGZpcnN0ID8gIiIgOiAiIHwgIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnAtPmxvdywgcnAtPmhpZ2gpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBUWVBFX1VOU0lHTkVEMzI6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfT0NURVRTVFI6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfR0FVR0U6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICAgICAgICAgICAgICAgICAgaWYgKHJwLT5sb3cgPT0gcnAtPmhpZ2gpCiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJXMldSIsIChmaXJzdCA/ICIiIDogIiB8ICIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClycC0+bG93ICk7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVzJXUuLiV1IiwgKGZpcnN0ID8gIiIgOiAiIHwgIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXJwLT5sb3csICh1bnNpZ25lZClycC0+aGlnaCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIC8qIE5vIG90aGVyIHJhbmdlIHR5cGVzIGFsbG93ZWQgKi8KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICAgICAgICBycCA9IHJwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIikgIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKHRwLT5lbnVtcykgewogICAgICAgICAgICBzdHJ1Y3QgZW51bV9saXN0ICplcCA9IHRwLT5lbnVtczsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpcnN0ID0gMTsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiIHsiKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICBwb3MgPSAxNiArIHN0cmxlbihjcCkgKyAyOwogICAgICAgICAgICB3aGlsZSAoZXApIHsKICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiLCAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiJXMoJWQpIiwgZXAtPmxhYmVsLCBlcC0+dmFsdWUpOwogICAgICAgICAgICAgICAgc3RyWyBzaXplb2Yoc3RyKS0xIF0gPSAwOwogICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHN0cik7CiAgICAgICAgICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgIlxuXHRcdCAgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHBvcyA9IDE4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgcG9zICs9IGxlbiArIDI7CiAgICAgICAgICAgICAgICBlcCA9IGVwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIn0gIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGNwKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT5oaW50KQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRElTUExBWS1ISU5UXHRcIiIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAtPmhpbnQpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+dW5pdHMpCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBVTklUU1x0XHRcIiIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAtPnVuaXRzKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBzd2l0Y2ggKHRwLT5hY2Nlc3MpIHsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfUkVBRE9OTFk6CiAgICAgICAgICAgIGNwID0gInJlYWQtb25seSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19SRUFEV1JJVEU6CiAgICAgICAgICAgIGNwID0gInJlYWQtd3JpdGUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfV1JJVEVPTkxZOgogICAgICAgICAgICBjcCA9ICJ3cml0ZS1vbmx5IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX05PQUNDRVNTOgogICAgICAgICAgICBjcCA9ICJub3QtYWNjZXNzaWJsZSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19OT1RJRlk6CiAgICAgICAgICAgIGNwID0gImFjY2Vzc2libGUtZm9yLW5vdGlmeSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19DUkVBVEU6CiAgICAgICAgICAgIGNwID0gInJlYWQtY3JlYXRlIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBjcCA9IE5VTEw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHNwcmludGYoc3RyLCAiYWNjZXNzXyVkIiwgdHAtPmFjY2Vzcyk7CiAgICAgICAgICAgIGNwID0gc3RyOwogICAgICAgIH0KICAgICAgICBpZiAoY3ApCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBNQVgtQUNDRVNTXHQiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgc3dpdGNoICh0cC0+c3RhdHVzKSB7CiAgICAgICAgY2FzZSBNSUJfU1RBVFVTX01BTkRBVE9SWToKICAgICAgICAgICAgY3AgPSAibWFuZGF0b3J5IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfU1RBVFVTX09QVElPTkFMOgogICAgICAgICAgICBjcCA9ICJvcHRpb25hbCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1NUQVRVU19PQlNPTEVURToKICAgICAgICAgICAgY3AgPSAib2Jzb2xldGUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9TVEFUVVNfREVQUkVDQVRFRDoKICAgICAgICAgICAgY3AgPSAiZGVwcmVjYXRlZCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1NUQVRVU19DVVJSRU5UOgogICAgICAgICAgICBjcCA9ICJjdXJyZW50IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBjcCA9IE5VTEw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHNwcmludGYoc3RyLCAic3RhdHVzXyVkIiwgdHAtPnN0YXR1cyk7CiAgICAgICAgICAgIGNwID0gc3RyOwogICAgICAgIH0KI2lmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgICAgIGlmICghY3AgJiYgKHRwLT5pbmRleGVzKSkgeyAgICAgLyogaW5kZXggd2l0aG91dCBzdGF0dXMgPyAqLwogICAgICAgICAgICBzcHJpbnRmKHN0ciwgIj8wIHdpdGggJXMgPyIsIHRwLT5pbmRleGVzID8gIkluZGV4IiA6ICIiKTsKICAgICAgICAgICAgY3AgPSBzdHI7CiAgICAgICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERSAqLwogICAgICAgIGlmIChjcCkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFNUQVRVU1x0IikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+YXVnbWVudHMpCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBVUdNRU5UU1x0eyAiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLT5hdWdtZW50cykgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiIH1cbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT5pbmRleGVzKSB7CiAgICAgICAgICAgIHN0cnVjdCBpbmRleF9saXN0ICppcCA9IHRwLT5pbmRleGVzOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmlyc3QgPSAxOwogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgSU5ERVhcdFx0eyAiKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICBwb3MgPSAxNiArIDI7CiAgICAgICAgICAgIHdoaWxlIChpcCkgewogICAgICAgICAgICAgICAgaWYgKGZpcnN0KQogICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gMDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIsICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIlcyVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgaXAtPmlzaW1wbGllZCA/ICJJTVBMSUVEICIgOiAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgaXAtPmlsYWJlbCk7CiAgICAgICAgICAgICAgICBzdHJbIHNpemVvZihzdHIpLTEgXSA9IDA7CiAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oc3RyKTsKICAgICAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcblx0XHQgICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBwb3MgPSAxNiArIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuICsgMjsKICAgICAgICAgICAgICAgIGlwID0gaXAtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiIH1cbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICh0cC0+dmFyYmluZHMpIHsKICAgICAgICAgICAgc3RydWN0IHZhcmJpbmRfbGlzdCAqdnAgPSB0cC0+dmFyYmluZHM7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaXJzdCA9IDE7CgogICAgICAgICAgICBpZiAodHAtPnR5cGUgPT0gVFlQRV9UUkFQVFlQRSkgewogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICIgIFZBUklBQkxFU1x0eyAiKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAiICBPQkpFQ1RTXHR7ICIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBvcyA9IDE2ICsgMjsKICAgICAgICAgICAgd2hpbGUgKHZwKSB7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiwgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgc3RybGNweShzdHIsIHZwLT52YmxhYmVsLCBzaXplb2Yoc3RyKSk7CiAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oc3RyKTsKICAgICAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcblx0XHQgICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBwb3MgPSAxNiArIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuICsgMjsKICAgICAgICAgICAgICAgIHZwID0gdnAtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiIH1cbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICh0cC0+ZGVzY3JpcHRpb24pCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgREVTQ1JJUFRJT05cdFwiIikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cC0+ZGVzY3JpcHRpb24pIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+ZGVmYXVsdFZhbHVlKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIERFRlZBTFx0eyAiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLT5kZWZhdWx0VmFsdWUpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiB9XG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgfSBlbHNlCiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiTm8gZGVzY3JpcHRpb25cbiIpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgIHJldHVybiAxOwp9CgppbnQKZ2V0X21vZHVsZV9ub2RlKGNvbnN0IGNoYXIgKmZuYW1lLAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kdWxlLCBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4pCnsKICAgIGludCAgICAgICAgICAgICBtb2RpZCwgcmMgPSAwOwogICAgc3RydWN0IHRyZWUgICAgKnRwOwogICAgY2hhciAgICAgICAgICAgKm5hbWUsICpjcDsKCiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJBTlkiKSkKICAgICAgICBtb2RpZCA9IC0xOwogICAgZWxzZSB7CiAgICAgICAgbmV0c25tcF9yZWFkX21vZHVsZShtb2R1bGUpOwogICAgICAgIG1vZGlkID0gd2hpY2hfbW9kdWxlKG1vZHVsZSk7CiAgICAgICAgaWYgKG1vZGlkID09IC0xKQogICAgICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKgogICAgICogSXNvbGF0ZSB0aGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSBuYW1lIC4uLiAKICAgICAqLwogICAgbmFtZSA9IHN0cmR1cChmbmFtZSk7CiAgICBjcCA9IHN0cmNocihuYW1lLCAnLicpOwogICAgaWYgKGNwICE9IE5VTEwpIHsKICAgICAgICAqY3AgPSAnXDAnOwogICAgICAgIGNwKys7CiAgICB9CiAgICAvKgogICAgICogLi4uIGFuZCBsb2NhdGUgaXQgaW4gdGhlIHRyZWUuIAogICAgICovCiAgICB0cCA9IGZpbmRfdHJlZV9ub2RlKG5hbWUsIG1vZGlkKTsKICAgIGlmICh0cCkgewogICAgICAgIHNpemVfdCAgICAgICAgICBtYXhsZW4gPSAqb2JqaWRsZW47CgogICAgICAgIC8qCiAgICAgICAgICogU2V0IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBvYmplY3QgSUQgCiAgICAgICAgICovCiAgICAgICAgaWYgKG5vZGVfdG9fb2lkKHRwLCBvYmppZCwgb2JqaWRsZW4pKSB7CiAgICAgICAgICAgIHJjID0gMTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIElmIHRoZSBuYW1lIHJlcXVlc3RlZCB3YXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50LAogICAgICAgICAgICAgKiB0YWcgb24gdGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoY3AgIT0gTlVMTCkKICAgICAgICAgICAgICAgIHJjID0gX2FkZF9zdHJpbmdzX3RvX29pZCh0cCwgY3AsIG9iamlkLCBvYmppZGxlbiwgbWF4bGVuKTsKICAgICAgICB9CiAgICB9CgogICAgU05NUF9GUkVFKG5hbWUpOwogICAgcmV0dXJuIChyYyk7Cn0KCgovKioKICogQGludGVybmFsCiAqCiAqIFBvcHVsYXRlcyB0aGUgb2JqZWN0IGlkZW50aWZpZXIgZnJvbSBhIG5vZGUgaW4gdGhlIE1JQiBoaWVyYXJjaHkuCiAqIEJ1aWxkcyB1cCB0aGUgb2JqZWN0IElELCB3b3JraW5nIGJhY2t3YXJkcywKICogc3RhcnRpbmcgZnJvbSB0aGUgZW5kIG9mIHRoZSBvYmppZCBidWZmZXIuCiAqIFdoZW4gdGhlIHRvcCBvZiB0aGUgTUlCIHRyZWUgaXMgcmVhY2hlZCwgdGhlIGJ1ZmZlciBpcyBhZGp1c3RlZC4KICoKICogVGhlIGJ1ZmZlciBsZW5ndGggaXMgc2V0IHRvIHRoZSBudW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMKICogZm9yIHRoZSBvYmplY3QgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIE1JQiBub2RlLgogKiAKICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHN1YmlkZW50aWZpZXJzIGNvcGllZC4KICoKICogSWYgMCBpcyByZXR1cm5lZCwgdGhlIG9iamlkIGJ1ZmZlciBpcyB0b28gc21hbGwsCiAqIGFuZCB0aGUgYnVmZmVyIGNvbnRlbnRzIGFyZSBpbmRldGVybWluYXRlLgogKiBUaGUgYnVmZmVyIGxlbmd0aCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBsYXJnZXIgYnVmZmVyLgogKi8Kc3RhdGljIGludApub2RlX3RvX29pZChzdHJ1Y3QgdHJlZSAqdHAsIG9pZCAqIG9iamlkLCBzaXplX3QgKiBvYmppZGxlbikKewogICAgaW50ICAgICAgICAgICAgIG51bWlkcywgbGVuaWRzOwogICAgb2lkICAgICAgICAgICAgKm9wOwoKICAgIGlmICghdHAgfHwgIW9iamlkIHx8ICFvYmppZGxlbikKICAgICAgICByZXR1cm4gMDsKCiAgICBsZW5pZHMgPSAoaW50KSAqb2JqaWRsZW47CiAgICBvcCA9IG9iamlkICsgbGVuaWRzOyAgICAgICAgLyogcG9pbnRzIGFmdGVyIHRoZSBsYXN0IGVsZW1lbnQgKi8KCiAgICBmb3IgKG51bWlkcyA9IDA7IHRwOyB0cCA9IHRwLT5wYXJlbnQsIG51bWlkcysrKSB7CiAgICAgICAgaWYgKG51bWlkcyA+PSBsZW5pZHMpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIC0tb3A7CiAgICAgICAgKm9wID0gdHAtPnN1YmlkOwogICAgfQoKICAgICpvYmppZGxlbiA9IChzaXplX3QpIG51bWlkczsKICAgIGlmIChudW1pZHMgPiBsZW5pZHMpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAobnVtaWRzIDwgbGVuaWRzKQogICAgICAgIG1lbW1vdmUob2JqaWQsIG9wLCBudW1pZHMgKiBzaXplb2Yob2lkKSk7CgogICAgcmV0dXJuIChudW1pZHMpOwp9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCi8qCiAqIFJlcGxhY2UgXHggd2l0aCB4IHN0b3AgYXQgZW9zX21hcmtlcgogKiByZXR1cm4gTlVMTCBpZiBlb3NfbWFya2VyIG5vdCBmb3VuZAogKi8Kc3RhdGljIGNoYXIgKl9hcHBseV9lc2NhcGVzKGNoYXIgKnNyYywgY2hhciBlb3NfbWFya2VyKQp7CiAgICBjaGFyICpkc3Q7CiAgICBpbnQgYmFja3NsYXNoID0gMDsKICAgIAogICAgZHN0ID0gc3JjOwogICAgd2hpbGUgKCpzcmMpIHsKCWlmIChiYWNrc2xhc2gpIHsKCSAgICBiYWNrc2xhc2ggPSAwOwoJICAgICpkc3QrKyA9ICpzcmM7Cgl9IGVsc2UgewoJICAgIGlmIChlb3NfbWFya2VyID09ICpzcmMpIGJyZWFrOwoJICAgIGlmICgnXFwnID09ICpzcmMpIHsKCQliYWNrc2xhc2ggPSAxOwoJICAgIH0gZWxzZSB7CgkJKmRzdCsrID0gKnNyYzsKCSAgICB9Cgl9CglzcmMrKzsKICAgIH0KICAgIGlmICghKnNyYykgewoJLyogbmV2ZXIgZm91bmQgZW9zX21hcmtlciAqLwoJcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgewoJKmRzdCA9IDA7CglyZXR1cm4gc3JjOwogICAgfQp9CgpzdGF0aWMgaW50CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCl9hZGRfc3RyaW5nc190b19vaWQoc3RydWN0IHRyZWUgKnRwLCBjaGFyICpjcCwKICAgICAgICAgICAgICAgICAgICBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4sIHNpemVfdCBtYXhsZW4pCiNlbHNlCl9hZGRfc3RyaW5nc190b19vaWQodm9pZCAqdHAsIGNoYXIgKmNwLAogICAgICAgICAgICAgICAgICAgIG9pZCAqIG9iamlkLCBzaXplX3QgKiBvYmppZGxlbiwgc2l6ZV90IG1heGxlbikKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwp7CiAgICBvaWQgICAgICAgICAgICAgc3ViaWQ7CiAgICBpbnQgICAgICAgICAgICAgbGVuX2luZGV4ID0gMTAwMDAwMDsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIHN0cnVjdCB0cmVlICAgICp0cDIgPSBOVUxMOwogICAgc3RydWN0IGluZGV4X2xpc3QgKmluX2RpY2VzID0gTlVMTDsKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgY2hhciAgICAgICAgICAgKmZjcCwgKmVjcCwgKmNwMiA9IE5VTEw7CiAgICBjaGFyICAgICAgICAgICAgZG9pbmdxdW90ZTsKICAgIGludCAgICAgICAgICAgICBsZW4gPSAtMSwgcG9zID0gLTE7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBpbnQgICAgICAgICAgICAgY2hlY2sgPQogICAgICAgICFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9DSEVDS19SQU5HRSk7CiAgICBpbnQgICAgICAgICAgICAgZG9faGludCA9ICFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTk9fRElTUExBWV9ISU5UKTsKCiAgICB3aGlsZSAoY3AgJiYgdHAgJiYgdHAtPmNoaWxkX2xpc3QpIHsKICAgICAgICBmY3AgPSBjcDsKICAgICAgICB0cDIgPSB0cC0+Y2hpbGRfbGlzdDsKICAgICAgICAvKgogICAgICAgICAqIElzb2xhdGUgdGhlIG5leHQgZW50cnkgCiAgICAgICAgICovCiAgICAgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwogICAgICAgIGlmIChjcDIpCiAgICAgICAgICAgICpjcDIrKyA9ICdcMCc7CgogICAgICAgIC8qCiAgICAgICAgICogU2VhcmNoIGZvciB0aGUgYXBwcm9wcmlhdGUgY2hpbGQgCiAgICAgICAgICovCiAgICAgICAgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKCpjcCkpKSB7CiAgICAgICAgICAgIHN1YmlkID0gc3RydG91bChjcCwgJmVjcCwgMCk7CiAgICAgICAgICAgIGlmICgqZWNwKQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIHdoaWxlICh0cDIgJiYgdHAyLT5zdWJpZCAhPSBzdWJpZCkKICAgICAgICAgICAgICAgIHRwMiA9IHRwMi0+bmV4dF9wZWVyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHdoaWxlICh0cDIgJiYgc3RyY21wKHRwMi0+bGFiZWwsIGZjcCkpCiAgICAgICAgICAgICAgICB0cDIgPSB0cDItPm5leHRfcGVlcjsKICAgICAgICAgICAgaWYgKCF0cDIpCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgc3ViaWQgPSB0cDItPnN1YmlkOwogICAgICAgIH0KICAgICAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikKICAgICAgICAgICAgZ290byBiYWRfaWQ7Cgl3aGlsZSAodHAyICYmIHRwMi0+bmV4dF9wZWVyICYmIHRwMi0+bmV4dF9wZWVyLT5zdWJpZCA9PSBzdWJpZCkKCSAgICB0cDIgPSB0cDItPm5leHRfcGVlcjsKICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gc3ViaWQ7CiAgICAgICAgKCpvYmppZGxlbikrKzsKCiAgICAgICAgY3AgPSBjcDI7CiAgICAgICAgaWYgKCF0cDIpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIHRwID0gdHAyOwogICAgfQoKICAgIGlmICh0cCAmJiAhdHAtPmNoaWxkX2xpc3QpIHsKICAgICAgICBpZiAoKHRwMiA9IHRwLT5wYXJlbnQpKSB7CiAgICAgICAgICAgIGlmICh0cDItPmluZGV4ZXMpCiAgICAgICAgICAgICAgICBpbl9kaWNlcyA9IHRwMi0+aW5kZXhlczsKICAgICAgICAgICAgZWxzZSBpZiAodHAyLT5hdWdtZW50cykgewogICAgICAgICAgICAgICAgdHAyID0gZmluZF90cmVlX25vZGUodHAyLT5hdWdtZW50cywgLTEpOwogICAgICAgICAgICAgICAgaWYgKHRwMikKICAgICAgICAgICAgICAgICAgICBpbl9kaWNlcyA9IHRwMi0+aW5kZXhlczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0cCA9IE5VTEw7CiAgICB9CgogICAgd2hpbGUgKGNwICYmIGluX2RpY2VzKSB7CiAgICAgICAgZmNwID0gY3A7CgogICAgICAgIHRwID0gZmluZF90cmVlX25vZGUoaW5fZGljZXMtPmlsYWJlbCwgLTEpOwogICAgICAgIGlmICghdHApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIHN3aXRjaCAodHAtPnR5cGUpIHsKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICBjYXNlIFRZUEVfVElNRVRJQ0tTOgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBJc29sYXRlIHRoZSBuZXh0IGVudHJ5IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwogICAgICAgICAgICBpZiAoY3AyKQogICAgICAgICAgICAgICAgKmNwMisrID0gJ1wwJzsKICAgICAgICAgICAgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKCpjcCkpKSB7CiAgICAgICAgICAgICAgICBzdWJpZCA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwogICAgICAgICAgICAgICAgaWYgKCplY3ApCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAodHAtPmVudW1zKSB7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGVudW1fbGlzdCAqZXAgPSB0cC0+ZW51bXM7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGVwICYmIHN0cmNtcChlcC0+bGFiZWwsIGNwKSkKICAgICAgICAgICAgICAgICAgICAgICAgZXAgPSBlcC0+bmV4dDsKICAgICAgICAgICAgICAgICAgICBpZiAoIWVwKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICBzdWJpZCA9IGVwLT52YWx1ZTsKICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjaGVjayAmJiB0cC0+cmFuZ2VzKSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFuZ2VfbGlzdCAqcnAgPSB0cC0+cmFuZ2VzOwogICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG9rID0gMDsKICAgICAgICAgICAgICAgIGlmICh0cC0+dHlwZSA9PSBUWVBFX0lOVEVHRVIgfHwKICAgICAgICAgICAgICAgICAgICB0cC0+dHlwZSA9PSBUWVBFX0lOVEVHRVIzMikgewogICAgICAgICAgICAgICAgICB3aGlsZSAoIW9rICYmIHJwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKChycC0+bG93IDw9IChpbnQpIHN1YmlkKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAoKGludCkgc3ViaWQgPD0gcnAtPmhpZ2gpKQogICAgICAgICAgICAgICAgICAgICAgICBvayA9IDE7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBycCA9IHJwLT5uZXh0OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiBjaGVjayB1bnNpZ25lZCByYW5nZSAqLwogICAgICAgICAgICAgICAgICB3aGlsZSAoIW9rICYmIHJwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCgodW5zaWduZWQgaW50KXJwLT5sb3cgPD0gc3ViaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICYmIChzdWJpZCA8PSAodW5zaWduZWQgaW50KXJwLT5oaWdoKSkKICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSAxOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcnAgPSBycC0+bmV4dDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFvaykKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gc3ViaWQ7CiAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JUEFERFI6CiAgICAgICAgICAgIGlmICgqb2JqaWRsZW4gKyA0ID4gbWF4bGVuKQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIGZvciAoc3ViaWQgPSAwOyBjcCAmJiBzdWJpZCA8IDQ7IHN1YmlkKyspIHsKICAgICAgICAgICAgICAgIGZjcCA9IGNwOwogICAgICAgICAgICAgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwogICAgICAgICAgICAgICAgaWYgKGNwMikKICAgICAgICAgICAgICAgICAgICAqY3AyKysgPSAwOwogICAgICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwogICAgICAgICAgICAgICAgaWYgKCplY3ApCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICBpZiAoY2hlY2sgJiYgb2JqaWRbKm9iamlkbGVuXSA+IDI1NSkKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgICAgICBjcCA9IGNwMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT0NURVRTVFI6CiAgICAgICAgICAgIGlmICh0cC0+cmFuZ2VzICYmICF0cC0+cmFuZ2VzLT5uZXh0CiAgICAgICAgICAgICAgICAmJiB0cC0+cmFuZ2VzLT5sb3cgPT0gdHAtPnJhbmdlcy0+aGlnaCkKICAgICAgICAgICAgICAgIGxlbiA9IHRwLT5yYW5nZXMtPmxvdzsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgbGVuID0gLTE7CiAgICAgICAgICAgIHBvcyA9IDA7CiAgICAgICAgICAgIGlmICgqY3AgPT0gJyInIHx8ICpjcCA9PSAnXCcnKSB7CiAgICAgICAgICAgICAgICBkb2luZ3F1b3RlID0gKmNwKys7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogaW5zZXJ0IGxlbmd0aCBpZiByZXF1ZXN0ZWQgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmICghaW5fZGljZXMtPmlzaW1wbGllZCAmJiBsZW4gPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZG9pbmdxdW90ZSA9PSAnXCcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNubXBfc2V0X2RldGFpbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCInLXF1b3RlIGlzIGZvciBmaXhlZCBsZW5ndGggc3RyaW5ncyIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgICAgIGxlbl9pbmRleCA9ICpvYmppZGxlbjsKICAgICAgICAgICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkb2luZ3F1b3RlID09ICciJykgewogICAgICAgICAgICAgICAgICAgIHNubXBfc2V0X2RldGFpbAogICAgICAgICAgICAgICAgICAgICAgICAoIlwiLXF1b3RlIGlzIGZvciB2YXJpYWJsZSBsZW5ndGggc3RyaW5ncyIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQoKCQljcDIgPSBfYXBwbHlfZXNjYXBlcyhjcCwgZG9pbmdxdW90ZSk7CgkJaWYgKCFjcDIpIGdvdG8gYmFkX2lkOwoJCWVsc2UgewoJCSAgICB1bnNpZ25lZCBjaGFyICpuZXdfdmFsOwoJCSAgICBpbnQgbmV3X3ZhbF9sZW47CgkJICAgIGludCBwYXJzZWRfaGludCA9IDA7CgkJICAgIGNvbnN0IGNoYXIgKnBhcnNlZF92YWx1ZTsKCgkJICAgIGlmIChkb19oaW50ICYmIHRwLT5oaW50KSB7CgkJCXBhcnNlZF92YWx1ZSA9IHBhcnNlX29jdGV0X2hpbnQodHAtPmhpbnQsIGNwLAoJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfdmFsLCAmbmV3X3ZhbF9sZW4pOwoJCQlwYXJzZWRfaGludCA9IHBhcnNlZF92YWx1ZSA9PSBOVUxMOwoJCSAgICB9CgkJICAgIGlmIChwYXJzZWRfaGludCkgewoJCQlpbnQgaTsKCQkJZm9yIChpID0gMDsgaSA8IG5ld192YWxfbGVuOyBpKyspIHsKCQkJICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKSBnb3RvIGJhZF9pZDsKCQkJICAgIG9iamlkWyAqb2JqaWRsZW4gXSA9IG5ld192YWxbaV07CgkJCSAgICAoKm9iamlkbGVuKSsrOwoJCQkgICAgcG9zKys7CgkJCX0KCQkJU05NUF9GUkVFKG5ld192YWwpOwoJCSAgICB9IGVsc2UgewoJCQl3aGlsZSgqY3ApIHsKCQkJICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKSBnb3RvIGJhZF9pZDsKCQkJICAgIG9iamlkWyAqb2JqaWRsZW4gXSA9ICpjcCsrOwoJCQkgICAgKCpvYmppZGxlbikrKzsKCQkJICAgIHBvcysrOwoJCQl9CgkJICAgIH0KCQl9CgkJCgkJY3AyKys7CiAgICAgICAgICAgICAgICBpZiAoISpjcDIpCiAgICAgICAgICAgICAgICAgICAgY3AyID0gTlVMTDsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKCpjcDIgIT0gJy4nKQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGNwMisrOwoJCWlmIChjaGVjaykgewogICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJhbmdlX2xpc3QgKnJwID0gdHAtPnJhbmdlczsKICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG9rID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJwICYmICFvaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChycC0+bG93IDw9IHBvcyAmJiBwb3MgPD0gcnAtPmhpZ2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwID0gcnAtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbl9kaWNlcy0+aXNpbXBsaWVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWRbbGVuX2luZGV4XSA9IHBvczsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvcyAhPSBsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwoJCX0KCQllbHNlIGlmIChsZW4gPT0gLTEgJiYgIWluX2RpY2VzLT5pc2ltcGxpZWQpCgkJICAgIG9iamlkW2xlbl9pbmRleF0gPSBwb3M7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIWluX2RpY2VzLT5pc2ltcGxpZWQgJiYgbGVuID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgZmNwID0gY3A7CiAgICAgICAgICAgICAgICAgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwogICAgICAgICAgICAgICAgICAgIGlmIChjcDIpCiAgICAgICAgICAgICAgICAgICAgICAgICpjcDIrKyA9IDA7CiAgICAgICAgICAgICAgICAgICAgbGVuID0gc3RydG91bChjcCwgJmVjcCwgMCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCplY3ApCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgICAgIGlmICgqb2JqaWRsZW4gKyBsZW4gKyAxID49IG1heGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IGxlbjsKICAgICAgICAgICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICAgICAgICAgIGNwID0gY3AyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGxlbiAmJiBjcCkgewogICAgICAgICAgICAgICAgICAgIGZjcCA9IGNwOwogICAgICAgICAgICAgICAgICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY3AyKQogICAgICAgICAgICAgICAgICAgICAgICAqY3AyKysgPSAwOwogICAgICAgICAgICAgICAgICAgIG9iamlkWypvYmppZGxlbl0gPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKmVjcCkKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrICYmIG9iamlkWypvYmppZGxlbl0gPiAyNTUpCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgICAgICAgICAgbGVuLS07CiAgICAgICAgICAgICAgICAgICAgY3AgPSBjcDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09CSklEOgogICAgICAgICAgICBpbl9kaWNlcyA9IE5VTEw7CiAgICAgICAgICAgIGNwMiA9IGNwOwogICAgICAgICAgICBicmVhazsKCWNhc2UgVFlQRV9ORVRBRERSOgoJICAgIGZjcCA9IGNwOwoJICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKCSAgICBpZiAoY3AyKQoJCSpjcDIrKyA9IDA7CgkgICAgc3ViaWQgPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKCSAgICBpZiAoKmVjcCkKCQlnb3RvIGJhZF9pZDsKCSAgICBpZiAoKm9iamlkbGVuICsgMSA+PSBtYXhsZW4pCgkJZ290byBiYWRfaWQ7CgkgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN1YmlkOwoJICAgICgqb2JqaWRsZW4pKys7CgkgICAgY3AgPSBjcDI7CgkgICAgaWYgKHN1YmlkID09IDEpIHsKCQlmb3IgKGxlbiA9IDA7IGNwICYmIGxlbiA8IDQ7IGxlbisrKSB7CgkJICAgIGZjcCA9IGNwOwoJCSAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CgkJICAgIGlmIChjcDIpCgkJCSpjcDIrKyA9IDA7CgkJICAgIHN1YmlkID0gc3RydG91bChjcCwgJmVjcCwgMCk7CgkJICAgIGlmICgqZWNwKQoJCQlnb3RvIGJhZF9pZDsKCQkgICAgaWYgKCpvYmppZGxlbiArIDEgPj0gbWF4bGVuKQoJCQlnb3RvIGJhZF9pZDsKCQkgICAgaWYgKGNoZWNrICYmIHN1YmlkID4gMjU1KQoJCQlnb3RvIGJhZF9pZDsKCQkgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN1YmlkOwoJCSAgICAoKm9iamlkbGVuKSsrOwoJCSAgICBjcCA9IGNwMjsKCQl9CgkgICAgfQoJICAgIGVsc2UgewoJCWluX2RpY2VzID0gTlVMTDsKCSAgICB9CgkgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIlVuZXhwZWN0ZWQgaW5kZXggdHlwZTogJWQgJXMgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgIHRwLT50eXBlLCBpbl9kaWNlcy0+aWxhYmVsLCBjcCk7CiAgICAgICAgICAgIGluX2RpY2VzID0gTlVMTDsKICAgICAgICAgICAgY3AyID0gY3A7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjcCA9IGNwMjsKICAgICAgICBpZiAoaW5fZGljZXMpCiAgICAgICAgICAgIGluX2RpY2VzID0gaW5fZGljZXMtPm5leHQ7CiAgICB9CgojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICB3aGlsZSAoY3ApIHsKICAgICAgICBmY3AgPSBjcDsKICAgICAgICBzd2l0Y2ggKCpjcCkgewogICAgICAgIGNhc2UgJzAnOgogICAgICAgIGNhc2UgJzEnOgogICAgICAgIGNhc2UgJzInOgogICAgICAgIGNhc2UgJzMnOgogICAgICAgIGNhc2UgJzQnOgogICAgICAgIGNhc2UgJzUnOgogICAgICAgIGNhc2UgJzYnOgogICAgICAgIGNhc2UgJzcnOgogICAgICAgIGNhc2UgJzgnOgogICAgICAgIGNhc2UgJzknOgogICAgICAgICAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CiAgICAgICAgICAgIGlmIChjcDIpCiAgICAgICAgICAgICAgICAqY3AyKysgPSAwOwogICAgICAgICAgICBzdWJpZCA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwogICAgICAgICAgICBpZiAoKmVjcCkKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gc3ViaWQ7CiAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJyInOgogICAgICAgIGNhc2UgJ1wnJzoKICAgICAgICAgICAgZG9pbmdxdW90ZSA9ICpjcCsrOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBpbnNlcnQgbGVuZ3RoIGlmIHJlcXVlc3RlZCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChkb2luZ3F1b3RlID09ICciJykgewogICAgICAgICAgICAgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gbGVuID0gc3RyY2hyKGNwLCBkb2luZ3F1b3RlKSAtIGNwOwogICAgICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFjcCkKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICB3aGlsZSAoKmNwICYmICpjcCAhPSBkb2luZ3F1b3RlKSB7CiAgICAgICAgICAgICAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgIG9iamlkWypvYmppZGxlbl0gPSAqY3ArKzsKICAgICAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3AyID0gY3AgKyAxOwogICAgICAgICAgICBpZiAoISpjcDIpCiAgICAgICAgICAgICAgICBjcDIgPSBOVUxMOwogICAgICAgICAgICBlbHNlIGlmICgqY3AyID09ICcuJykKICAgICAgICAgICAgICAgIGNwMisrOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgfQogICAgICAgIGNwID0gY3AyOwogICAgfQogICAgcmV0dXJuIDE7CgogIGJhZF9pZDoKICAgIHsKICAgICAgICBjaGFyICAgICAgICAgICAgYnVmWzI1Nl07CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICAgICAgaWYgKGluX2RpY2VzKQogICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiSW5kZXggb3V0IG9mIHJhbmdlOiAlcyAoJXMpIiwKICAgICAgICAgICAgICAgICAgICBmY3AsIGluX2RpY2VzLT5pbGFiZWwpOwogICAgICAgIGVsc2UgaWYgKHRwKQogICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiU3ViLWlkIG5vdCBmb3VuZDogJXMgLT4gJXMiLCB0cC0+bGFiZWwsIGZjcCk7CiAgICAgICAgZWxzZQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyIsIGZjcCk7CiAgICAgICAgYnVmWyBzaXplb2YoYnVmKS0xIF0gPSAwOwoKICAgICAgICBzbm1wX3NldF9kZXRhaWwoYnVmKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKLyoqCiAqIEBzZWUgY29tbWVudHMgb24gZmluZF9iZXN0X3RyZWVfbm9kZSBmb3IgdXNhZ2UgYWZ0ZXIgZmlyc3QgdGltZS4KICovCmludApnZXRfd2lsZF9ub2RlKGNvbnN0IGNoYXIgKm5hbWUsIG9pZCAqIG9iamlkLCBzaXplX3QgKiBvYmppZGxlbikKewogICAgc3RydWN0IHRyZWUgICAgKnRwID0gZmluZF9iZXN0X3RyZWVfbm9kZShuYW1lLCB0cmVlX2hlYWQsIE5VTEwpOwogICAgaWYgKCF0cCkKICAgICAgICByZXR1cm4gMDsKICAgIHJldHVybiBnZXRfbm9kZSh0cC0+bGFiZWwsIG9iamlkLCBvYmppZGxlbik7Cn0KCmludApnZXRfbm9kZShjb25zdCBjaGFyICpuYW1lLCBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4pCnsKICAgIGNvbnN0IGNoYXIgICAgICpjcDsKICAgIGNoYXIgICAgICAgICAgICBjaDsKICAgIGludCAgICAgICAgICAgICByZXM7CgogICAgY3AgPSBuYW1lOwogICAgd2hpbGUgKChjaCA9ICpjcCkpCiAgICAgICAgaWYgKCgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKQogICAgICAgICAgICB8fCAoJ2EnIDw9IGNoICYmIGNoIDw9ICd6JykKICAgICAgICAgICAgfHwgKCdBJyA8PSBjaCAmJiBjaCA8PSAnWicpCiAgICAgICAgICAgIHx8IGNoID09ICctJykKICAgICAgICAgICAgY3ArKzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGJyZWFrOwogICAgaWYgKGNoICE9ICc6JykKICAgICAgICBpZiAoKm5hbWUgPT0gJy4nKQogICAgICAgICAgICByZXMgPSBnZXRfbW9kdWxlX25vZGUobmFtZSArIDEsICJBTlkiLCBvYmppZCwgb2JqaWRsZW4pOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmVzID0gZ2V0X21vZHVsZV9ub2RlKG5hbWUsICJBTlkiLCBvYmppZCwgb2JqaWRsZW4pOwogICAgZWxzZSB7CiAgICAgICAgY2hhciAgICAgICAgICAgKm1vZHVsZTsKICAgICAgICAvKgogICAgICAgICAqICByZXF1ZXN0ZWQgbmFtZSBpcyBvZiB0aGUgZm9ybQogICAgICAgICAqICAgICAgIm1vZHVsZTpzdWJpZGVudGlmaWVyIgogICAgICAgICAqLwogICAgICAgIG1vZHVsZSA9IChjaGFyICopIG1hbGxvYygoc2l6ZV90KSAoY3AgLSBuYW1lICsgMSkpOwogICAgICAgIGlmICghbW9kdWxlKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgc3ByaW50Zihtb2R1bGUsICIlLipzIiwgKGludCkgKGNwIC0gbmFtZSksIG5hbWUpOwogICAgICAgIGNwKys7ICAgICAgICAgICAgICAgICAgIC8qIGNwIG5vdyBwb2ludCB0byB0aGUgc3ViaWRlbnRpZmllciAqLwogICAgICAgIGlmICgqY3AgPT0gJzonKQogICAgICAgICAgICBjcCsrOwoKICAgICAgICAvKgogICAgICAgICAqICdjcCcgYW5kICduYW1lJyAqZG8qIGdvIHRoYXQgd2F5IHJvdW5kISAKICAgICAgICAgKi8KICAgICAgICByZXMgPSBnZXRfbW9kdWxlX25vZGUoY3AsIG1vZHVsZSwgb2JqaWQsIG9iamlkbGVuKTsKICAgICAgICBTTk1QX0ZSRUUobW9kdWxlKTsKICAgIH0KICAgIGlmIChyZXMgPT0gMCkgewogICAgICAgIFNFVF9TTk1QX0VSUk9SKFNOTVBFUlJfVU5LTk9XTl9PQkpJRCk7CiAgICB9CgogICAgcmV0dXJuIHJlczsKfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgojaWZkZWYgdGVzdGluZwoKbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CiAgICBvaWQgICAgICAgICAgICAgb2JqaWRbTUFYX09JRF9MRU5dOwogICAgaW50ICAgICAgICAgICAgIG9iamlkbGVuID0gTUFYX09JRF9MRU47CiAgICBpbnQgICAgICAgICAgICAgY291bnQ7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgdmFyaWFibGU7CgogICAgbmV0c25tcF9pbml0X21pYigpOwogICAgaWYgKGFyZ2MgPCAyKQogICAgICAgIHByaW50X3N1YnRyZWUoc3Rkb3V0LCB0cmVlX2hlYWQsIDApOwogICAgdmFyaWFibGUudHlwZSA9IEFTTl9JTlRFR0VSOwogICAgdmFyaWFibGUudmFsLmludGVnZXIgPSAzOwogICAgdmFyaWFibGUudmFsX2xlbiA9IDQ7CiAgICBmb3IgKGFyZ2MtLTsgYXJnYzsgYXJnYy0tLCBhcmd2KyspIHsKICAgICAgICBvYmppZGxlbiA9IE1BWF9PSURfTEVOOwogICAgICAgIHByaW50ZigicmVhZF9vYmppZCglcykgPSAlZFxuIiwKICAgICAgICAgICAgICAgYXJndlsxXSwgcmVhZF9vYmppZChhcmd2WzFdLCBvYmppZCwgJm9iamlkbGVuKSk7CiAgICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgb2JqaWRsZW47IGNvdW50KyspCiAgICAgICAgICAgIHByaW50ZigiJWQuIiwgb2JqaWRbY291bnRdKTsKICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgcHJpbnRfdmFyaWFibGUob2JqaWQsIG9iamlkbGVuLCAmdmFyaWFibGUpOwogICAgfQp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlc3RpbmcgKi8KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCi8qCiAqIGluaXRpYWxpemU6IG5vIHBlZXJzIGluY2x1ZGVkIGluIHRoZSByZXBvcnQuIAogKi8Kdm9pZApjbGVhcl90cmVlX2ZsYWdzKHJlZ2lzdGVyIHN0cnVjdCB0cmVlICp0cCkKewogICAgZm9yICg7IHRwOyB0cCA9IHRwLT5uZXh0X3BlZXIpIHsKICAgICAgICB0cC0+cmVwb3J0ZWQgPSAwOwogICAgICAgIGlmICh0cC0+Y2hpbGRfbGlzdCkKICAgICAgICAgICAgY2xlYXJfdHJlZV9mbGFncyh0cC0+Y2hpbGRfbGlzdCk7CiAgICAgLypSRUNVUlNFKi99Cn0KCi8qCiAqIFVwZGF0ZTogMTk5OC0wNy0xNyA8amh5QGdzdS5lZHU+CiAqIEFkZGVkIHByaW50X29pZF9yZXBvcnQqIGZ1bmN0aW9ucy4KICovCnN0YXRpYyBpbnQgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfbGFiZWxlZG9pZCA9IDA7CnN0YXRpYyBpbnQgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfb2lkID0gMDsKc3RhdGljIGludCAgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9zeW1ib2xpYyA9IDA7CnN0YXRpYyBpbnQgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfbWliY2hpbGRvaWQgPSAwOwpzdGF0aWMgaW50ICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X3N1ZmZpeCA9IDA7CgovKgogKiBUaGVzZSBtZXRob2RzIHJlY3Vyc2UuIAogKi8Kc3RhdGljIHZvaWQgICAgIHByaW50X3BhcmVudF9sYWJlbGVkb2lkKEZJTEUgKiwgc3RydWN0IHRyZWUgKik7CnN0YXRpYyB2b2lkICAgICBwcmludF9wYXJlbnRfb2lkKEZJTEUgKiwgc3RydWN0IHRyZWUgKik7CnN0YXRpYyB2b2lkICAgICBwcmludF9wYXJlbnRfbWliY2hpbGRvaWQoRklMRSAqLCBzdHJ1Y3QgdHJlZSAqKTsKc3RhdGljIHZvaWQgICAgIHByaW50X3BhcmVudF9sYWJlbChGSUxFICosIHN0cnVjdCB0cmVlICopOwpzdGF0aWMgdm9pZCAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0KEZJTEUgKiwgc3RydWN0IHRyZWUgKiwgaW50KTsKCgp2b2lkCnByaW50X29pZF9yZXBvcnQoRklMRSAqIGZwKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CiAgICBjbGVhcl90cmVlX2ZsYWdzKHRyZWVfaGVhZCk7CiAgICBmb3IgKHRwID0gdHJlZV9oZWFkOyB0cDsgdHAgPSB0cC0+bmV4dF9wZWVyKQogICAgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydChmcCwgdHAsIDApOwp9Cgp2b2lkCnByaW50X29pZF9yZXBvcnRfZW5hYmxlX2xhYmVsZWRvaWQodm9pZCkKewogICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X2xhYmVsZWRvaWQgPSAxOwp9Cgp2b2lkCnByaW50X29pZF9yZXBvcnRfZW5hYmxlX29pZCh2b2lkKQp7CiAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfb2lkID0gMTsKfQoKdm9pZApwcmludF9vaWRfcmVwb3J0X2VuYWJsZV9zdWZmaXgodm9pZCkKewogICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X3N1ZmZpeCA9IDE7Cn0KCnZvaWQKcHJpbnRfb2lkX3JlcG9ydF9lbmFibGVfc3ltYm9saWModm9pZCkKewogICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X3N5bWJvbGljID0gMTsKfQoKdm9pZApwcmludF9vaWRfcmVwb3J0X2VuYWJsZV9taWJjaGlsZG9pZCh2b2lkKQp7CiAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfbWliY2hpbGRvaWQgPSAxOwp9CgovKgogKiBoZWxwZXIgbWV0aG9kcyBmb3IgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0KCkKICogZWFjaCBvbmUgdHJhdmVyc2VzIGJhY2sgdXAgdGhlIG5vZGUgdHJlZQogKiB1bnRpbCB0aGVyZSBpcyBubyBwYXJlbnQuICBUaGVuLCB0aGUgbGFiZWwgY29tYmluYXRpb24KICogaXMgb3V0cHV0LCBzdWNoIHRoYXQgdGhlIHBhcmVudCBpcyBkaXNwbGF5ZWQgZmlyc3QuCiAqCiAqIFdhcm5pbmc6IHRoZXNlIG1ldGhvZHMgYXJlIGFsbCByZWN1cnNpdmUuCiAqLwoKc3RhdGljIHZvaWQKcHJpbnRfcGFyZW50X2xhYmVsZWRvaWQoRklMRSAqIGYsIHN0cnVjdCB0cmVlICp0cCkKewogICAgaWYgKHRwKSB7CiAgICAgICAgaWYgKHRwLT5wYXJlbnQpIHsKICAgICAgICAgICAgcHJpbnRfcGFyZW50X2xhYmVsZWRvaWQoZiwgdHAtPnBhcmVudCk7CiAgICAgICAgIC8qUkVDVVJTRSovfQogICAgICAgIGZwcmludGYoZiwgIi4lcyglbHUpIiwgdHAtPmxhYmVsLCB0cC0+c3ViaWQpOwogICAgfQp9CgpzdGF0aWMgdm9pZApwcmludF9wYXJlbnRfb2lkKEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHApCnsKICAgIGlmICh0cCkgewogICAgICAgIGlmICh0cC0+cGFyZW50KSB7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9vaWQoZiwgdHAtPnBhcmVudCk7CiAgICAgICAgIC8qUkVDVVJTRSovfQogICAgICAgIGZwcmludGYoZiwgIi4lbHUiLCB0cC0+c3ViaWQpOwogICAgfQp9CgoKc3RhdGljIHZvaWQgcHJpbnRfcGFyZW50X21pYmNoaWxkb2lkKEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHApCnsKICAgIHN0YXRpYyBzdHJ1Y3QgdHJlZSAqdGVtcDsKICAgIHVuc2lnbmVkIGxvbmcgZWxlbXNbMTAwXTsKICAgIGludCBlbGVtX2NudCA9IDA7CiAgICBpbnQgaSA9IDA7CiAgICB0ZW1wID0gdHA7CiAgICBpZiAodGVtcCkgewogICAgICAgIHdoaWxlICh0ZW1wLT5wYXJlbnQpIHsKICAgICAgICAgICAgICAgIGVsZW1zW2VsZW1fY250KytdID0gdGVtcC0+c3ViaWQ7CiAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcC0+cGFyZW50OwogICAgICAgIH0KICAgICAgICBlbGVtc1tlbGVtX2NudCsrXSA9IHRlbXAtPnN1YmlkOwogICAgfQogICAgZm9yIChpID0gZWxlbV9jbnQgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgIGlmIChpID09IGVsZW1fY250IC0gMSkgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlbHUiLCBlbGVtc1tpXSk7ICAgICAgICAgICAKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiLiVsdSIsIGVsZW1zW2ldKTsgICAgICAgICAgCiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZApwcmludF9wYXJlbnRfbGFiZWwoRklMRSAqIGYsIHN0cnVjdCB0cmVlICp0cCkKewogICAgaWYgKHRwKSB7CiAgICAgICAgaWYgKHRwLT5wYXJlbnQpIHsKICAgICAgICAgICAgcHJpbnRfcGFyZW50X2xhYmVsKGYsIHRwLT5wYXJlbnQpOwogICAgICAgICAvKlJFQ1VSU0UqL30KICAgICAgICBmcHJpbnRmKGYsICIuJXMiLCB0cC0+bGFiZWwpOwogICAgfQp9CgovKioKICogQGludGVybmFsCiAqIFRoaXMgbWV0aG9kcyBnZW5lcmF0ZXMgdmFyaWF0aW9ucyBvbiB0aGUgb3JpZ2luYWwgcHJpbnRfc3VidHJlZSgpIHJlcG9ydC4KICogVHJhdmVyc2UgdGhlIHRyZWUgZGVwdGggZmlyc3QsIGZyb20gbGVhc3QgdG8gZ3JlYXRlc3Qgc3ViLWlkZW50aWZpZXIuCiAqIFdhcm5pbmc6IHRoaXMgbWV0aG9kcyByZWN1cnNlcyBhbmQgY2FsbHMgbWV0aG9kcyB0aGF0IHJlY3Vyc2UuCiAqCiAqIEBwYXJhbSBmICAgICAgIEZpbGUgZGVzY3JpcHRvciB0byBwcmludCB0by4KICogQHBhcmFtIHRyZWUgICAgPz8/CiAqIEBwYXJhbSBjb3VudCAgID8/PwogKi8KCnN0YXRpYyB2b2lkCnByaW50X3N1YnRyZWVfb2lkX3JlcG9ydChGSUxFICogZiwgc3RydWN0IHRyZWUgKnRyZWUsIGludCBjb3VudCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwOwoKICAgIGNvdW50Kys7CgogICAgLyoKICAgICAqIHNhbml0eSBjaGVjayAKICAgICAqLwogICAgaWYgKCF0cmVlKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qCiAgICAgKiBmaW5kIHRoZSBub3QgcmVwb3J0ZWQgcGVlciB3aXRoIHRoZSBsb3dlc3Qgc3ViLWlkZW50aWZpZXIuCiAgICAgKiBpZiBubyBtb3JlLCBicmVhayB0aGUgbG9vcCBhbmQgY2xlYW51cC4KICAgICAqIHNldCAicmVwb3J0ZWQiIGZsYWcsIGFuZCBjcmVhdGUgcmVwb3J0IGZvciB0aGlzIHBlZXIuCiAgICAgKiByZWN1cnNlIHVzaW5nIHRoZSBjaGlsZHJlbiBvZiB0aGlzIHBlZXIsIGlmIGFueS4KICAgICAqLwogICAgd2hpbGUgKDEpIHsKICAgICAgICByZWdpc3RlciBzdHJ1Y3QgdHJlZSAqbnRwOwoKICAgICAgICB0cCA9IE5VTEw7CiAgICAgICAgZm9yIChudHAgPSB0cmVlLT5jaGlsZF9saXN0OyBudHA7IG50cCA9IG50cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgICAgIGlmIChudHAtPnJlcG9ydGVkKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBpZiAoIXRwIHx8ICh0cC0+c3ViaWQgPiBudHAtPnN1YmlkKSkKICAgICAgICAgICAgICAgIHRwID0gbnRwOwogICAgICAgIH0KICAgICAgICBpZiAoIXRwKQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgdHAtPnJlcG9ydGVkID0gMTsKCiAgICAgICAgaWYgKHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9sYWJlbGVkb2lkKSB7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9sYWJlbGVkb2lkKGYsIHRwKTsKICAgICAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9vaWQpIHsKICAgICAgICAgICAgcHJpbnRfcGFyZW50X29pZChmLCB0cCk7CiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgfQogICAgICAgIGlmIChwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfc3ltYm9saWMpIHsKICAgICAgICAgICAgcHJpbnRfcGFyZW50X2xhYmVsKGYsIHRwKTsKICAgICAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9taWJjaGlsZG9pZCkgewoJICAgIGZwcmludGYoZiwgIlwiJXNcIlx0IiwgdHAtPmxhYmVsKTsKICAgICAgICAgICAgZnByaW50ZihmLCAiXHRcdFwiIik7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9taWJjaGlsZG9pZChmLCB0cCk7CiAgICAgICAgICAgIGZwcmludGYoZiwgIlwiXG4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9zdWZmaXgpIHsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGk7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQogICAgICAgICAgICAgICAgZnByaW50ZihmLCAiICAiKTsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMoJWxkKSB0eXBlPSVkIiwgdHAtPmxhYmVsLCB0cC0+c3ViaWQsIHRwLT50eXBlKTsKICAgICAgICAgICAgaWYgKHRwLT50Y19pbmRleCAhPSAtMSkKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiB0Yz0lZCIsIHRwLT50Y19pbmRleCk7CiAgICAgICAgICAgIGlmICh0cC0+aGludCkKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiBoaW50PSVzIiwgdHAtPmhpbnQpOwogICAgICAgICAgICBpZiAodHAtPnVuaXRzKQogICAgICAgICAgICAgICAgZnByaW50ZihmLCAiIHVuaXRzPSVzIiwgdHAtPnVuaXRzKTsKCiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgfQogICAgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydChmLCB0cCwgY291bnQpOwogICAgIC8qUkVDVVJTRSovfQp9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCgovKioKICogQ29udmVydHMgdGltZXRpY2tzIHRvIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzIHN0cmluZy4KICogQ01VIGNvbXBhdGlibGUgZG9lcyBub3Qgc2hvdyBjZW50aXNlY29uZHMuCiAqCiAqIEBwYXJhbSB0aW1ldGlja3MgICAgVGhlIHRpbWV0aWNrcyB0byBjb252ZXJ0LgogKiBAcGFyYW0gYnVmICAgICAgICAgIEJ1ZmZlciB0byB3cml0ZSB0bywgaGFzIHRvIGJlIGF0IAogKiAgICAgICAgICAgICAgICAgICAgIGxlYXN0IDQwIEJ5dGVzIGxhcmdlLgogKiAgICAgICAKICogQHJldHVybiBUaGUgYnVmZmVyCiAqCiAqIEBzZWUgdXB0aW1lU3RyaW5nCiAqLwpjaGFyICAgICAgICAgICAqCnVwdGltZV9zdHJpbmcodV9sb25nIHRpbWV0aWNrcywgY2hhciAqYnVmKQp7CiAgICByZXR1cm4gdXB0aW1lX3N0cmluZ19uKCB0aW1ldGlja3MsIGJ1ZiwgNDApOwp9CgpjaGFyICAgICAgICAgICAqCnVwdGltZV9zdHJpbmdfbih1X2xvbmcgdGltZXRpY2tzLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCnsKICAgIHVwdGltZVN0cmluZyh0aW1ldGlja3MsIGJ1ZiwgYnVmbGVuKTsKI2lmZGVmIENNVV9DT01QQVRJQkxFCiAgICB7CiAgICBjaGFyICpjcCA9IHN0cnJjaHIoYnVmLCAnLicpOwogICAgaWYgKGNwKQogICAgICAgICpjcCA9ICdcMCc7CiAgICB9CiNlbmRpZgogICAgcmV0dXJuIGJ1ZjsKfQoKLyoqCiAqIEdpdmVuIGEgc3RyaW5nLCBwYXJzZXMgYW4gb2lkIG91dCBvZiBpdCAoaWYgcG9zc2libGUpLgogKiBJdCB3aWxsIHRyeSB0byBwYXJzZSBpdCBiYXNlZCBvbiBwcmVkZXRlcm1pbmVkIGNvbmZpZ3VyYXRpb24gaWYKICogcHJlc2VudCBvciBieSBldmVyeSBtZXRob2QgcG9zc2libGUgb3RoZXJ3aXNlLgogKiBJZiBhIHN1ZmZpeCBoYXMgYmVlbiByZWdpc3RlcmVkIHVzaW5nIE5FVFNOTVBfRFNfTElCX09JRFNVRkZJWCwgaXQKICogd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgaW5wdXQgc3RyaW5nIGJlZm9yZSBwcm9jZXNzaW5nLgogKgogKiBAcGFyYW0gYXJndiAgICBUaGUgT0lEIHRvIHN0cmluZyBwYXJzZQogKiBAcGFyYW0gcm9vdCAgICBBbiBPSUQgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdHMgYXJlIHN0b3JlZC4KICogQHBhcmFtIHJvb3RsZW4gVGhlIG1heCBsZW5ndGggb2YgdGhlIGFycmF5IGdvaW5nIGluIGFuZCB0aGUgZGF0YQogKiAgICAgICAgICAgICAgICBsZW5ndGggY29taW5nIG91dC4KICoKICogQHJldHVybiAgICAgICAgVGhlIHJvb3Qgb2lkIHBvaW50ZXIgaWYgc3VjY2Vzc2Z1bCwgb3IgTlVMTCBvdGhlcndpc2UuCiAqLwogCm9pZCAgICAgICAgICAgICoKc25tcF9wYXJzZV9vaWQoY29uc3QgY2hhciAqYXJndiwgb2lkICogcm9vdCwgc2l6ZV90ICogcm9vdGxlbikKewogICAgc2l6ZV90ICAgICAgICAgIHNhdmxlbiA9ICpyb290bGVuOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGJ1Zl9sZW4gPSAwOwogICAgc3RhdGljIGNoYXIgICAgKnRtcGJ1ZjsKICAgIGNvbnN0IGNoYXIgICAgICpzdWZmaXgsICpwcmVmaXg7CgogICAgc3VmZml4ID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9PSURTVUZGSVgpOwogICAgcHJlZml4ID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9PSURQUkVGSVgpOwogICAgaWYgKChzdWZmaXggJiYgc3VmZml4WzBdKSB8fCAocHJlZml4ICYmIHByZWZpeFswXSkpIHsKICAgICAgICBpZiAoIXN1ZmZpeCkKICAgICAgICAgICAgc3VmZml4ID0gIiI7CiAgICAgICAgaWYgKCFwcmVmaXgpCiAgICAgICAgICAgIHByZWZpeCA9ICIiOwogICAgICAgIGlmICgoc3RybGVuKHN1ZmZpeCkgKyBzdHJsZW4ocHJlZml4KSArIHN0cmxlbihhcmd2KSArIDIpID4gdG1wYnVmX2xlbikgewogICAgICAgICAgICB0bXBidWZfbGVuID0gc3RybGVuKHN1ZmZpeCkgKyBzdHJsZW4oYXJndikgKyBzdHJsZW4ocHJlZml4KSArIDI7CiAgICAgICAgICAgIHRtcGJ1ZiA9IChjaGFyICopcmVhbGxvYyh0bXBidWYsIHRtcGJ1Zl9sZW4pOwogICAgICAgIH0KICAgICAgICBzbnByaW50Zih0bXBidWYsIHRtcGJ1Zl9sZW4sICIlcyVzJXMlcyIsIHByZWZpeCwgYXJndiwKICAgICAgICAgICAgICAgICAoKHN1ZmZpeFswXSA9PSAnLicgfHwgc3VmZml4WzBdID09ICdcMCcpID8gIiIgOiAiLiIpLAogICAgICAgICAgICAgICAgIHN1ZmZpeCk7CiAgICAgICAgYXJndiA9IHRtcGJ1ZjsKICAgICAgICBERUJVR01TR1RMKCgic25tcF9wYXJzZV9vaWQiLCJQYXJzaW5nOiAlc1xuIixhcmd2KSk7CiAgICB9CgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SQU5ET01fQUNDRVNTKQogICAgICAgIHx8IHN0cmNocihhcmd2LCAnOicpKSB7CiAgICAgICAgaWYgKGdldF9ub2RlKGFyZ3YsIHJvb3QsIHJvb3RsZW4pKSB7CiAgICAgICAgICAgIHJldHVybiByb290OwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JFR0VYX0FDQ0VTUykpIHsKCWNsZWFyX3RyZWVfZmxhZ3ModHJlZV9oZWFkKTsKICAgICAgICBpZiAoZ2V0X3dpbGRfbm9kZShhcmd2LCByb290LCByb290bGVuKSkgewogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CiAgICB9IGVsc2UgewojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICAgICAgaWYgKHJlYWRfb2JqaWQoYXJndiwgcm9vdCwgcm9vdGxlbikpIHsKICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgICAgfQojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgICAgICpyb290bGVuID0gc2F2bGVuOwogICAgICAgIGlmIChnZXRfbm9kZShhcmd2LCByb290LCByb290bGVuKSkgewogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CiAgICAgICAgKnJvb3RsZW4gPSBzYXZsZW47CiAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZCIsICJ3aWxkbHkgcGFyc2luZ1xuIikpOwoJY2xlYXJfdHJlZV9mbGFncyh0cmVlX2hlYWQpOwogICAgICAgIGlmIChnZXRfd2lsZF9ub2RlKGFyZ3YsIHJvb3QsIHJvb3RsZW4pKSB7CiAgICAgICAgICAgIHJldHVybiByb290OwogICAgICAgIH0KICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgcmV0dXJuIE5VTEw7Cn0KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCi8qCiAqIFVzZSBESVNQTEFZLUhJTlQgdG8gcGFyc2UgYSB2YWx1ZSBpbnRvIGFuIG9jdGV0IHN0cmluZy4KICoKICogbm90ZSB0aGF0ICIxZDFkIiwgIjExIiBjb3VsZCBoYXZlIGNvbWUgZnJvbSBhbiBvY3RldCBzdHJpbmcgdGhhdAogKiBsb29rZWQgbGlrZSB7IDEsIDEgfSBvciBhbiBvY3RldCBzdHJpbmcgdGhhdCBsb29rZWQgbGlrZSB7IDExIH0KICogYmVjYXVzZSBvZiB0aGlzLCBpdCdzIGRvdWJ0ZnVsIHRoYXQgYW55b25lIHdvdWxkIHVzZSBzdWNoIGEgZGlzcGxheQogKiBzdHJpbmcuIFRoZXJlZm9yZSwgdGhlIHBhcnNlciBpZ25vcmVzIHRoaXMgY2FzZS4KICovCgpzdHJ1Y3QgcGFyc2VfaGludHMgewogICAgaW50IGxlbmd0aDsKICAgIGludCByZXBlYXQ7CiAgICBpbnQgZm9ybWF0OwogICAgaW50IHNlcGFyYXRvcjsKICAgIGludCB0ZXJtaW5hdG9yOwogICAgdW5zaWduZWQgY2hhciAqcmVzdWx0OwogICAgaW50IHJlc3VsdF9tYXg7CiAgICBpbnQgcmVzdWx0X2xlbjsKfTsKCnN0YXRpYyB2b2lkIHBhcnNlX2hpbnRzX3Jlc2V0KHN0cnVjdCBwYXJzZV9oaW50cyAqcGgpCnsKICAgIHBoLT5sZW5ndGggPSAwOwogICAgcGgtPnJlcGVhdCA9IDA7CiAgICBwaC0+Zm9ybWF0ID0gMDsKICAgIHBoLT5zZXBhcmF0b3IgPSAwOwogICAgcGgtPnRlcm1pbmF0b3IgPSAwOwp9CgpzdGF0aWMgdm9pZCBwYXJzZV9oaW50c19jdG9yKHN0cnVjdCBwYXJzZV9oaW50cyAqcGgpCnsKICAgIHBhcnNlX2hpbnRzX3Jlc2V0KHBoKTsKICAgIHBoLT5yZXN1bHQgPSBOVUxMOwogICAgcGgtPnJlc3VsdF9tYXggPSAwOwogICAgcGgtPnJlc3VsdF9sZW4gPSAwOwp9CgpzdGF0aWMgaW50IHBhcnNlX2hpbnRzX2FkZF9yZXN1bHRfb2N0ZXQoc3RydWN0IHBhcnNlX2hpbnRzICpwaCwgdW5zaWduZWQgY2hhciBvY3RldCkKewogICAgaWYgKCEocGgtPnJlc3VsdF9sZW4gPCBwaC0+cmVzdWx0X21heCkpIHsKCXBoLT5yZXN1bHRfbWF4ID0gcGgtPnJlc3VsdF9sZW4gKyAzMjsKCWlmICghcGgtPnJlc3VsdCkgewoJICAgIHBoLT5yZXN1bHQgPSAodW5zaWduZWQgY2hhciAqKW1hbGxvYyhwaC0+cmVzdWx0X21heCk7Cgl9IGVsc2UgewoJICAgIHBoLT5yZXN1bHQgPSAodW5zaWduZWQgY2hhciAqKXJlYWxsb2MocGgtPnJlc3VsdCwgcGgtPnJlc3VsdF9tYXgpOwoJfQogICAgfQogICAgCiAgICBpZiAoIXBoLT5yZXN1bHQpIHsKCXJldHVybiAwOwkJLyogZmFpbGVkICovCiAgICB9CgogICAgcGgtPnJlc3VsdFtwaC0+cmVzdWx0X2xlbisrXSA9IG9jdGV0OwogICAgcmV0dXJuIDE7CQkJLyogc3VjY2VzcyAqLwp9CgpzdGF0aWMgaW50IHBhcnNlX2hpbnRzX3BhcnNlKHN0cnVjdCBwYXJzZV9oaW50cyAqcGgsIGNvbnN0IGNoYXIgKip2X2luX291dCkKewogICAgY29uc3QgY2hhciAqdiA9ICp2X2luX291dDsKICAgIGNoYXIgKm52OwogICAgaW50IGJhc2U7CiAgICBpbnQgcmVwZWF0cyA9IDA7CiAgICBpbnQgcmVwZWF0X2ZpeHVwID0gcGgtPnJlc3VsdF9sZW47CiAgICAKICAgIGlmIChwaC0+cmVwZWF0KSB7CglpZiAoIXBhcnNlX2hpbnRzX2FkZF9yZXN1bHRfb2N0ZXQocGgsIDApKSB7CgkgICAgcmV0dXJuIDA7Cgl9CiAgICB9CiAgICBkbyB7CgliYXNlID0gMDsKCXN3aXRjaCAocGgtPmZvcm1hdCkgewoJY2FzZSAneCc6IGJhc2UgKz0gNjsJLyogZmFsbCB0aHJvdWdoICovCgljYXNlICdkJzogYmFzZSArPSAyOwkvKiBmYWxsIHRocm91Z2ggKi8KCWNhc2UgJ28nOiBiYXNlICs9IDg7CS8qIGZhbGwgdGhyb3VnaCAqLwoJICAgIHsKCQlpbnQgaTsKCQl1bnNpZ25lZCBsb25nIG51bWJlciA9IHN0cnRvbCh2LCAmbnYsIGJhc2UpOwoJCWlmIChudiA9PSB2KSByZXR1cm4gMDsKCQl2ID0gbnY7CgkJZm9yIChpID0gMDsgaSA8IHBoLT5sZW5ndGg7IGkrKykgewoJCSAgICBpbnQgc2hpZnQgPSA4ICogKHBoLT5sZW5ndGggLSAxIC0gaSk7CgkJICAgIGlmICghcGFyc2VfaGludHNfYWRkX3Jlc3VsdF9vY3RldChwaCwgKHVfY2hhcikobnVtYmVyID4+IHNoaWZ0KSApKSB7CgkJCXJldHVybiAwOyAvKiBmYWlsZWQgKi8KCQkgICAgfQoJCX0KCSAgICB9CgkgICAgYnJlYWs7CgoJY2FzZSAnYSc6CgkgICAgewoJCWludCBpOwoJCSAgICAKCQlmb3IgKGkgPSAwOyBpIDwgcGgtPmxlbmd0aCAmJiAqdjsgaSsrKSB7CgkJICAgIGlmICghcGFyc2VfaGludHNfYWRkX3Jlc3VsdF9vY3RldChwaCwgKnYrKykpIHsKCQkJcmV0dXJuIDA7CS8qIGZhaWxlZCAqLwoJCSAgICB9CgkJfQoJICAgIH0KCSAgICBicmVhazsKCX0KCglyZXBlYXRzKys7CgoJaWYgKHBoLT5zZXBhcmF0b3IgJiYgKnYpIHsKCSAgICBpZiAoKnYgPT0gcGgtPnNlcGFyYXRvcikgewoJCXYrKzsKCSAgICB9IGVsc2UgewoJCXJldHVybiAwOwkJLyogZmFpbGVkICovCgkgICAgfQoJfQoKCWlmIChwaC0+dGVybWluYXRvcikgewoJICAgIGlmICgqdiA9PSBwaC0+dGVybWluYXRvcikgewoJCXYrKzsKCQlicmVhazsKCSAgICB9Cgl9CiAgICB9IHdoaWxlIChwaC0+cmVwZWF0ICYmICp2KTsKICAgIGlmIChwaC0+cmVwZWF0KSB7CglwaC0+cmVzdWx0W3JlcGVhdF9maXh1cF0gPSByZXBlYXRzOwogICAgfQoKICAgICp2X2luX291dCA9IHY7CiAgICByZXR1cm4gMTsKfQoKc3RhdGljIHZvaWQgcGFyc2VfaGludHNfbGVuZ3RoX2FkZF9kaWdpdChzdHJ1Y3QgcGFyc2VfaGludHMgKnBoLCBpbnQgZGlnaXQpCnsKICAgIHBoLT5sZW5ndGggKj0gMTA7CiAgICBwaC0+bGVuZ3RoICs9IGRpZ2l0IC0gJzAnOwp9Cgpjb25zdCBjaGFyICpwYXJzZV9vY3RldF9oaW50KGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnZhbHVlLCB1bnNpZ25lZCBjaGFyICoqbmV3X3ZhbCwgaW50ICpuZXdfdmFsX2xlbikKewogICAgY29uc3QgY2hhciAqaCA9IGhpbnQ7CiAgICBjb25zdCBjaGFyICp2ID0gdmFsdWU7CiAgICBzdHJ1Y3QgcGFyc2VfaGludHMgcGg7CiAgICBpbnQgcmV0dmFsID0gMTsKICAgIC8qIFNlZSBSRkMgMTQ0MyAqLwogICAgZW51bSB7CglISU5UXzFfMiwKCUhJTlRfMl8zLAoJSElOVF8xXzJfNCwKCUhJTlRfMV8yXzUKICAgIH0gc3RhdGUgPSBISU5UXzFfMjsKCiAgICBwYXJzZV9oaW50c19jdG9yKCZwaCk7CiAgICB3aGlsZSAoKmggJiYgKnYgJiYgcmV0dmFsKSB7Cglzd2l0Y2ggKHN0YXRlKSB7CgljYXNlIEhJTlRfMV8yOgoJICAgIGlmICgnKicgPT0gKmgpIHsKCQlwaC5yZXBlYXQgPSAxOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSgqaCkpKSB7CgkJcGFyc2VfaGludHNfbGVuZ3RoX2FkZF9kaWdpdCgmcGgsICpoKTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSB7CgkJcmV0dXJuIHY7CS8qIGZhaWxlZCAqLwoJICAgIH0KCSAgICBicmVhazsKCgljYXNlIEhJTlRfMl8zOgoJICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSgqaCkpKSB7CgkJcGFyc2VfaGludHNfbGVuZ3RoX2FkZF9kaWdpdCgmcGgsICpoKTsKCQkvKiBzdGF0ZSA9IEhJTlRfMl8zICovCgkgICAgfSBlbHNlIGlmICgneCcgPT0gKmggfHwgJ2QnID09ICpoIHx8ICdvJyA9PSAqaCB8fCAnYScgPT0gKmgpIHsKCQlwaC5mb3JtYXQgPSAqaDsKCQlzdGF0ZSA9IEhJTlRfMV8yXzQ7CgkgICAgfSBlbHNlIHsKCQlyZXR1cm4gdjsJLyogZmFpbGVkICovCgkgICAgfQoJICAgIGJyZWFrOwoKCWNhc2UgSElOVF8xXzJfNDoKCSAgICBpZiAoJyonID09ICpoKSB7CgkJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CgkJcGFyc2VfaGludHNfcmVzZXQoJnBoKTsKCQkKCQlwaC5yZXBlYXQgPSAxOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSgqaCkpKSB7CgkJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CgkJcGFyc2VfaGludHNfcmVzZXQoJnBoKTsKCQkKCQlwYXJzZV9oaW50c19sZW5ndGhfYWRkX2RpZ2l0KCZwaCwgKmgpOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIHsKCQlwaC5zZXBhcmF0b3IgPSAqaDsKCQlzdGF0ZSA9IEhJTlRfMV8yXzU7CgkgICAgfQoJICAgIGJyZWFrOwoKCWNhc2UgSElOVF8xXzJfNToKCSAgICBpZiAoJyonID09ICpoKSB7CgkJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CgkJcGFyc2VfaGludHNfcmVzZXQoJnBoKTsKCQkKCQlwaC5yZXBlYXQgPSAxOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSgqaCkpKSB7CgkJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CgkJcGFyc2VfaGludHNfcmVzZXQoJnBoKTsKCQkKCQlwYXJzZV9oaW50c19sZW5ndGhfYWRkX2RpZ2l0KCZwaCwgKmgpOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIHsKCQlwaC50ZXJtaW5hdG9yID0gKmg7CgoJCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwoJCXBhcnNlX2hpbnRzX3Jlc2V0KCZwaCk7CgoJCXN0YXRlID0gSElOVF8xXzI7CgkgICAgfQoJICAgIGJyZWFrOwoJfQoJaCsrOwogICAgfQogICAgd2hpbGUgKCp2ICYmIHJldHZhbCkgewoJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CiAgICB9CiAgICBpZiAocmV0dmFsKSB7CgkqbmV3X3ZhbCA9IHBoLnJlc3VsdDsKCSpuZXdfdmFsX2xlbiA9IHBoLnJlc3VsdF9sZW47CiAgICB9IGVsc2UgewoJaWYgKHBoLnJlc3VsdCkgewoJICAgIFNOTVBfRlJFRShwaC5yZXN1bHQpOwoJfQoJKm5ld192YWwgPSBOVUxMOwoJKm5ld192YWxfbGVuID0gMDsKICAgIH0KICAgIHJldHVybiByZXR2YWwgPyBOVUxMIDogdjsKfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgojaWZkZWYgdGVzdF9kaXNwbGF5X2hpbnQKCmludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKewogICAgY29uc3QgY2hhciAqaGludDsKICAgIGNvbnN0IGNoYXIgKnZhbHVlOwogICAgdW5zaWduZWQgY2hhciAqbmV3X3ZhbDsKICAgIGludCBuZXdfdmFsX2xlbjsKICAgIGNoYXIgKnI7CiAgICAKICAgIGlmIChhcmdjIDwgMykgewoJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogZGggPGhpbnQ+IDx2YWx1ZT5cbiIpOwoJZXhpdCgyKTsKICAgIH0KICAgIGhpbnQgPSBhcmd2WzFdOwogICAgdmFsdWUgPSBhcmd2WzJdOwogICAgciA9IHBhcnNlX29jdGV0X2hpbnQoaGludCwgdmFsdWUsICZuZXdfdmFsLCAmbmV3X3ZhbF9sZW4pOwogICAgcHJpbnRmKCJ7XCIlc1wiLCBcIiVzXCJ9OiBcblx0IiwgaGludCwgdmFsdWUpOwogICAgaWYgKHIpIHsKICAgICAgICAqciA9IDA7CiAgICAJcHJpbnRmKCJyZXR1cm5lZCBmYWlsZWRcbiIpOwoJcHJpbnRmKCJ2YWx1ZSBzeW50YXggZXJyb3IgYXQ6ICVzXG4iLCB2YWx1ZSk7CiAgICB9CiAgICBlbHNlIHsKCWludCBpOwoJcHJpbnRmKCJyZXR1cm5lZCBzdWNjZXNzXG4iKTsKCWZvciAoaSA9IDA7IGkgPCBuZXdfdmFsX2xlbjsgaSsrKSB7CgkgICAgaW50IGMgPSBuZXdfdmFsW2ldICYgMHhGRjsKCSAgICBwcmludGYoIiUwMlgoJWMpICIsIGMsIGlzcHJpbnQoYykgPyBjIDogJyAnKTsKCX0KCVNOTVBfRlJFRShuZXdfdmFsKTsKICAgIH0KICAgIHByaW50ZigiXG4iKTsKICAgIGV4aXQoMCk7Cn0KCiNlbmRpZiAvKiB0ZXN0X2Rpc3BsYXlfaGludCAqLwoKdV9jaGFyCm1pYl90b19hc25fdHlwZShpbnQgbWliX3R5cGUpCnsKICAgIHN3aXRjaCAobWliX3R5cGUpIHsKICAgIGNhc2UgVFlQRV9PQkpJRDoKICAgICAgICByZXR1cm4gQVNOX09CSkVDVF9JRDsKCiAgICBjYXNlIFRZUEVfT0NURVRTVFI6CiAgICAgICAgcmV0dXJuIEFTTl9PQ1RFVF9TVFI7CgogICAgY2FzZSBUWVBFX05FVEFERFI6CiAgICBjYXNlIFRZUEVfSVBBRERSOgogICAgICAgIHJldHVybiBBU05fSVBBRERSRVNTOwoKICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICByZXR1cm4gQVNOX0lOVEVHRVI7CgogICAgY2FzZSBUWVBFX0NPVU5URVI6CiAgICAgICAgcmV0dXJuIEFTTl9DT1VOVEVSOwoKICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICByZXR1cm4gQVNOX0dBVUdFOwoKICAgIGNhc2UgVFlQRV9USU1FVElDS1M6CiAgICAgICAgcmV0dXJuIEFTTl9USU1FVElDS1M7CgogICAgY2FzZSBUWVBFX09QQVFVRToKICAgICAgICByZXR1cm4gQVNOX09QQVFVRTsKCiAgICBjYXNlIFRZUEVfTlVMTDoKICAgICAgICByZXR1cm4gQVNOX05VTEw7CgogICAgY2FzZSBUWVBFX0NPVU5URVI2NDoKICAgICAgICByZXR1cm4gQVNOX0NPVU5URVI2NDsKCiAgICBjYXNlIFRZUEVfQklUU1RSSU5HOgogICAgICAgIHJldHVybiBBU05fQklUX1NUUjsKCiAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICByZXR1cm4gQVNOX1VOU0lHTkVEOwoKICAgIGNhc2UgVFlQRV9OU0FQQUREUkVTUzoKICAgICAgICByZXR1cm4gQVNOX05TQVA7CgogICAgfQogICAgcmV0dXJuIC0xOwp9CgovKioKICogQ29udmVydHMgYSBzdHJpbmcgdG8gaXRzIE9JRCBmb3JtLgogKiBpbiBleGFtcGxlICAiaGVsbG8iID0gNSAuICdoJyAuICdlJyAuICdsJyAuICdsJyAuICdvJwogKgogKiBAcGFyYW0gUyAgIFRoZSBzdHJpbmcuCiAqIEBwYXJhbSBPICAgVGhlIG9pZC4KICogQHBhcmFtIEwgICBUaGUgbGVuZ3RoIG9mIHRoZSBvaWQuCiAqCiAqIEByZXR1cm4gMCBvbiBTdWNlc3MsIDEgb24gZmFpbHVyZS4KICovCmludApuZXRzbm1wX3N0cjJvaWQoY29uc3QgY2hhciAqUywgb2lkICogTywgaW50IEwpCnsKICAgIGNvbnN0IGNoYXIgICAgICpjID0gUzsKICAgIG9pZCAgICAgICAgICAgICpvID0gJk9bMV07CgogICAgLS1MOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlYXZlIHJvb20gZm9yIGxlbmd0aCBwcmVmaXggKi8KCiAgICBmb3IgKDsgKmMgJiYgTDsgLS1MLCArK28sICsrYykKICAgICAgICAqbyA9ICpjOwoKICAgIC8qCiAgICAgKiBtYWtlIHN1cmUgd2UgZ290IHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAKICAgICAqLwogICAgaWYgKCpjICE9IDApCiAgICAgICAgcmV0dXJuIDE7CgogICAgLyoKICAgICAqIHNldCB0aGUgbGVuZ3RoIG9mIHRoZSBvaWQgCiAgICAgKi8KICAgICpPID0gYyAtIFM7CgogICAgcmV0dXJuIDA7Cn0KCi8qKgogKiBDb252ZXJ0cyBhbiBPSUQgdG8gaXRzIGNoYXJhY3RlciBmb3JtLgogKiBpbiBleGFtcGxlICA1IC4gMSAuIDIgLiAzIC4gNCAuIDUgPSAxMjM0NQogKgogKiBAcGFyYW0gQyAgIFRoZSBjaGFyYWN0ZXIgYnVmZmVyLgogKiBAcGFyYW0gTCAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlci4KICogQHBhcmFtIE8gICBUaGUgb2lkLgogKgogKiBAcmV0dXJuIDAgb24gU3VjZXNzLCAxIG9uIGZhaWx1cmUuCiAqLwppbnQKbmV0c25tcF9vaWQyY2hhcnMoY2hhciAqQywgaW50IEwsIGNvbnN0IG9pZCAqIE8pCnsKICAgIGNoYXIgICAgICAgICAgICpjID0gQzsKICAgIGNvbnN0IG9pZCAgICAgICpvID0gJk9bMV07CgogICAgaWYgKEwgPCAoaW50KSpPKQogICAgICAgIHJldHVybiAxOwoKICAgIEwgPSAqTzsgLyoqIGxlbmd0aCAqLwogICAgZm9yICg7IEw7IC0tTCwgKytvLCArK2MpIHsKICAgICAgICBpZiAoKm8gPiAweEZGKQogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAqYyA9IChjaGFyKSpvOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKgogKiBDb252ZXJ0cyBhbiBPSUQgdG8gaXRzIHN0cmluZyBmb3JtLgogKiBpbiBleGFtcGxlICA1IC4gJ2gnIC4gJ2UnIC4gJ2wnIC4gJ2wnIC4gJ28nID0gImhlbGxvXDAiIChudWxsIHRlcm1pbmF0ZWQpCiAqCiAqIEBwYXJhbSBTICAgVGhlIGNoYXJhY3RlciBzdHJpbmcgYnVmZmVyLgogKiBAcGFyYW0gTCAgIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBidWZmZXIuCiAqIEBwYXJhbSBPICAgVGhlIG9pZC4KICoKICogQHJldHVybiAwIG9uIFN1Y2VzcywgMSBvbiBmYWlsdXJlLgogKi8KaW50Cm5ldHNubXBfb2lkMnN0cihjaGFyICpTLCBpbnQgTCwgb2lkICogTykKewogICAgaW50ICAgICAgICAgICAgcmM7CgogICAgaWYgKEwgPD0gKGludCkqTykKICAgICAgICByZXR1cm4gMTsKCiAgICByYyA9IG5ldHNubXBfb2lkMmNoYXJzKFMsIEwsIE8pOwogICAgaWYgKHJjKQogICAgICAgIHJldHVybiAxOwoKICAgIFNbICpPIF0gPSAwOwoKICAgIHJldHVybiAwOwp9CgppbnQKc25wcmludF9ieV90eXBlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfYnlfdHlwZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfaGV4c3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sIGNvbnN0IHVfY2hhciAqIGNwLCBzaXplX3QgbGVuKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLCBsZW4pKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfYXNjaWlzdHJpbmcoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICBjb25zdCB1X2NoYXIgKiBjcCwgc2l6ZV90IGxlbikKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2FzY2lpc3RyaW5nCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIGNwLCBsZW4pKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfb2N0ZXRfc3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2Nfb2N0ZXRfc3RyaW5nCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X29wYXF1ZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX29wYXF1ZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9vYmplY3RfaWRlbnRpZmllcihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywgY29uc3QgY2hhciAqaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX29iamVjdF9pZGVudGlmaWVyCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X3RpbWV0aWNrcyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX3RpbWV0aWNrcygodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9oaW50ZWRfaW50ZWdlcihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdmFsLCBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2hpbnRlZF9pbnRlZ2VyCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIHZhbCwgJ2QnLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9pbnRlZ2VyKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19pbnRlZ2VyKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF91aW50ZWdlcihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY191aW50ZWdlcigodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2dhdWdlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2dhdWdlKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfY291bnRlcihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfY291bnRlcigodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfbmV0d29ya2FkZHJlc3MoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsIGNvbnN0IGNoYXIgKmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19uZXR3b3JrYWRkcmVzcwogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9pcGFkZHJlc3MoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19pcGFkZHJlc3MoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfbnVsbChjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfbnVsbCgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfYml0c3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfYml0c3RyaW5nKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X25zYXBhZGRyZXNzKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX25zYXBhZGRyZXNzCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2NvdW50ZXI2NChjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2NvdW50ZXI2NCgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9iYWR0eXBlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19iYWR0eXBlKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCmludApzbnByaW50X2Zsb2F0KGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2Zsb2F0KCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfZG91YmxlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfZG91YmxlKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KI2VuZGlmCi8qKiBAfSAqLwoK