LyoKICogQ29weXJpZ2h0IChjKSAxOTgwIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCiAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgogKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAogKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCiAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQogKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCiAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqLwoKLyoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICoKICogMjAwMC0wNy0zMCBQZXIgQW5kcmVhcyBCdWVyIDxwZXJAbGlucHJvLm5vPiAtIGFkZGVkICJxIi1vcHRpb24KICovCgovKgogKiBzY3JpcHQKICovCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxwYXRocy5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8dGVybWlvcy5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3lzL2ZpbGUuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Z2V0b3B0Lmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KCiNpbmNsdWRlICJubHMuaCIKCgojaWZkZWYgSEFWRV9MSUJVVElMCiNpbmNsdWRlIDxwdHkuaD4KI2VuZGlmCgp2b2lkIGZpbmlzaChpbnQpOwp2b2lkIGRvbmUodm9pZCk7CnZvaWQgZmFpbCh2b2lkKTsKdm9pZCByZXNpemUoaW50KTsKdm9pZCBmaXh0dHkodm9pZCk7CnZvaWQgZ2V0bWFzdGVyKHZvaWQpOwp2b2lkIGdldHNsYXZlKHZvaWQpOwp2b2lkIGRvaW5wdXQodm9pZCk7CnZvaWQgZG9vdXRwdXQodm9pZCk7CnZvaWQgZG9zaGVsbCh2b2lkKTsKCmNoYXIJKnNoZWxsOwpGSUxFCSpmc2NyaXB0OwppbnQJbWFzdGVyOwppbnQJc2xhdmU7CmludAljaGlsZDsKaW50CXN1YmNoaWxkOwpjaGFyCSpmbmFtZTsKCnN0cnVjdAl0ZXJtaW9zIHR0OwpzdHJ1Y3QJd2luc2l6ZSB3aW47CmludAlsYjsKaW50CWw7CiNpZm5kZWYgSEFWRV9MSUJVVElMCmNoYXIJbGluZVtdID0gIi9kZXYvcHR5WFgiOwojZW5kaWYKaW50CWFmbGcgPSAwOwpjaGFyCSpjZmxnID0gTlVMTDsKaW50CWZmbGcgPSAwOwppbnQJcWZsZyA9IDA7CmludAl0ZmxnID0gMDsKCnN0YXRpYyBjaGFyICpwcm9nbmFtZTsKCmludCBkaWU7CmludCByZXNpemVkOwoKc3RhdGljIHZvaWQKZGllX2lmX2xpbmsoY2hhciAqZm4pIHsKCXN0cnVjdCBzdGF0IHM7CgoJaWYgKGxzdGF0KGZuLCAmcykgPT0gMCAmJiAoU19JU0xOSyhzLnN0X21vZGUpIHx8IHMuc3RfbmxpbmsgPiAxKSkgewoJCWZwcmludGYoc3RkZXJyLAoJCQlfKCJXYXJuaW5nOiBgJXMnIGlzIGEgbGluay5cbiIKCQkJICAiVXNlIGAlcyBbb3B0aW9uc10gJXMnIGlmIHlvdSByZWFsbHkgIgoJCQkgICJ3YW50IHRvIHVzZSBpdC5cbiIKCQkJICAiU2NyaXB0IG5vdCBzdGFydGVkLlxuIiksCgkJCWZuLCBwcm9nbmFtZSwgZm4pOwoJCWV4aXQoMSk7Cgl9Cn0KCi8qCiAqIHNjcmlwdCAtdCBwcmludHMgdGltZSBkZWxheXMgYXMgZmxvYXRpbmcgcG9pbnQgbnVtYmVycwogKiBUaGUgZXhhbXBsZSBwcm9ncmFtIChzY3JpcHRyZXBsYXkpIHRoYXQgd2UgcHJvdmlkZSB0byBoYW5kbGUgdGhpcwogKiB0aW1pbmcgb3V0cHV0IGlzIGEgcGVybCBzY3JpcHQsIGFuZCBkb2VzIG5vdCBoYW5kbGUgbnVtYmVycyBpbgogKiBsb2NhbGUgZm9ybWF0IChub3QgZXZlbiB3aGVuICJ1c2UgbG9jYWxlOyIgaXMgYWRkZWQpLgogKiBTbywgc2luY2UgdGhlc2UgbnVtYmVycyBhcmUgbm90IGZvciBodW1hbiBjb25zdW1wdGlvbiwgaXQgc2VlbXMKICogZWFzaWVzdCB0byBzZXQgTENfTlVNRVJJQyBoZXJlLgogKi8KCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewoJc3RydWN0IHNpZ2FjdGlvbiBzYTsKCWV4dGVybiBpbnQgb3B0aW5kOwoJY2hhciAqcDsKCWludCBjaDsKCglwcm9nbmFtZSA9IGFyZ3ZbMF07CglpZiAoKHAgPSBzdHJyY2hyKHByb2duYW1lLCAnLycpKSAhPSBOVUxMKQoJCXByb2duYW1lID0gcCsxOwoKCglzZXRsb2NhbGUoTENfQUxMLCAiIik7CglzZXRsb2NhbGUoTENfTlVNRVJJQywgIkMiKTsJLyogc2VlIGNvbW1lbnQgYWJvdmUgKi8KCWJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FMRURJUik7Cgl0ZXh0ZG9tYWluKFBBQ0tBR0UpOwoKCWlmIChhcmdjID09IDIpIHsKCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLVYiKSB8fCAhc3RyY21wKGFyZ3ZbMV0sICItLXZlcnNpb24iKSkgewoJCQlwcmludGYoXygiJXMgKCVzKVxuIiksCgkJCSAgICAgICBwcm9nbmFtZSwgUEFDS0FHRV9TVFJJTkcpOwoJCQlyZXR1cm4gMDsKCQl9Cgl9CgoJd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiYWM6ZnF0IikpICE9IC0xKQoJCXN3aXRjaCgoY2hhciljaCkgewoJCWNhc2UgJ2EnOgoJCQlhZmxnKys7CgkJCWJyZWFrOwoJCWNhc2UgJ2MnOgoJCQljZmxnID0gb3B0YXJnOwoJCQlicmVhazsKCQljYXNlICdmJzoKCQkJZmZsZysrOwoJCQlicmVhazsKCQljYXNlICdxJzoKCQkJcWZsZysrOwoJCQlicmVhazsKCQljYXNlICd0JzoKCQkJdGZsZysrOwoJCQlicmVhazsKCQljYXNlICc/JzoKCQlkZWZhdWx0OgoJCQlmcHJpbnRmKHN0ZGVyciwKCQkJCV8oInVzYWdlOiBzY3JpcHQgWy1hXSBbLWZdIFstcV0gWy10XSBbZmlsZV1cbiIpKTsKCQkJZXhpdCgxKTsKCQl9CglhcmdjIC09IG9wdGluZDsKCWFyZ3YgKz0gb3B0aW5kOwoKCWlmIChhcmdjID4gMCkKCQlmbmFtZSA9IGFyZ3ZbMF07CgllbHNlIHsKCQlmbmFtZSA9ICJ0eXBlc2NyaXB0IjsKCQlkaWVfaWZfbGluayhmbmFtZSk7Cgl9CglpZiAoKGZzY3JpcHQgPSBmb3BlbihmbmFtZSwgYWZsZyA/ICJhIiA6ICJ3IikpID09IE5VTEwpIHsKCQlwZXJyb3IoZm5hbWUpOwoJCWZhaWwoKTsKCX0KCglzaGVsbCA9IGdldGVudigiU0hFTEwiKTsKCWlmIChzaGVsbCA9PSBOVUxMKQoJCXNoZWxsID0gX1BBVEhfQlNIRUxMOwoKCWdldG1hc3RlcigpOwoJaWYgKCFxZmxnKQoJCXByaW50ZihfKCJTY3JpcHQgc3RhcnRlZCwgZmlsZSBpcyAlc1xuIiksIGZuYW1lKTsKCWZpeHR0eSgpOwoKCXNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKCXNhLnNhX2ZsYWdzID0gMDsKCglzYS5zYV9oYW5kbGVyID0gZmluaXNoOwoJc2lnYWN0aW9uKFNJR0NITEQsICZzYSwgTlVMTCk7CgoJY2hpbGQgPSBmb3JrKCk7CglpZiAoY2hpbGQgPCAwKSB7CgkJcGVycm9yKCJmb3JrIik7CgkJZmFpbCgpOwoJfQoJaWYgKGNoaWxkID09IDApIHsKCQlzdWJjaGlsZCA9IGNoaWxkID0gZm9yaygpOwoJCWlmIChjaGlsZCA8IDApIHsKCQkJcGVycm9yKCJmb3JrIik7CgkJCWZhaWwoKTsKCQl9CgkJaWYgKGNoaWxkKQoJCQlkb291dHB1dCgpOwoJCWVsc2UKCQkJZG9zaGVsbCgpOwoJfSBlbHNlIHsKCQlzYS5zYV9oYW5kbGVyID0gcmVzaXplOwoJCXNpZ2FjdGlvbihTSUdXSU5DSCwgJnNhLCBOVUxMKTsKCX0KCWRvaW5wdXQoKTsKCglyZXR1cm4gMDsKfQoKdm9pZApkb2lucHV0KCkgewoJcmVnaXN0ZXIgaW50IGNjOwoJY2hhciBpYnVmW0JVRlNJWl07CgoJKHZvaWQpIGZjbG9zZShmc2NyaXB0KTsKCglpZiAoZGllID09IDAgJiYgY2hpbGQgJiYga2lsbChjaGlsZCwgMCkgPT0gLTEgJiYgZXJybm8gPT0gRVNSQ0gpCgkJZGllID0gMTsKCgl3aGlsZSAoZGllID09IDApIHsKCQlpZiAoKGNjID0gcmVhZCgwLCBpYnVmLCBCVUZTSVopKSA+IDApIHsKCQkJc3NpemVfdCB3cnQgPSB3cml0ZShtYXN0ZXIsIGlidWYsIGNjKTsKCQkJaWYgKHdydCA9PSAtMSkgewoJCQkJaW50IGVyciA9IGVycm5vOwoJCQkJZnByaW50ZiAoc3RkZXJyLCBfKCIlczogd3JpdGUgZXJyb3IgJWQ6ICVzXG4iKSwKCQkJCQlwcm9nbmFtZSwgZXJyLCBzdHJlcnJvcihlcnIpKTsKCQkJCWZhaWwoKTsKCQkJfQoJCX0KCQllbHNlIGlmIChjYyA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUiAmJiByZXNpemVkKQoJCQlyZXNpemVkID0gMDsKCQllbHNlCgkJCWJyZWFrOwoJfQoKCWRvbmUoKTsKfQoKI2luY2x1ZGUgPHN5cy93YWl0Lmg+Cgp2b2lkCmZpbmlzaChpbnQgZHVtbXkpIHsKCWludCBzdGF0dXM7CglyZWdpc3RlciBpbnQgcGlkOwoKCXdoaWxlICgocGlkID0gd2FpdDMoJnN0YXR1cywgV05PSEFORywgMCkpID4gMCkKCQlpZiAocGlkID09IGNoaWxkKQoJCQlkaWUgPSAxOwp9Cgp2b2lkCnJlc2l6ZShpbnQgZHVtbXkpIHsKCXJlc2l6ZWQgPSAxOwoJLyogdHJhbnNtaXQgd2luZG93IGNoYW5nZSBpbmZvcm1hdGlvbiB0byB0aGUgY2hpbGQgKi8KCSh2b2lkKSBpb2N0bCgwLCBUSU9DR1dJTlNaLCAoY2hhciAqKSZ3aW4pOwoJKHZvaWQpIGlvY3RsKHNsYXZlLCBUSU9DU1dJTlNaLCAoY2hhciAqKSZ3aW4pOwp9CgovKgogKiBTdG9wIGV4dHJlbWVseSBzaWxseSBnY2MgY29tcGxhaW50IG9uICVjOgogKiAgd2FybmluZzogYCVjJyB5aWVsZHMgb25seSBsYXN0IDIgZGlnaXRzIG9mIHllYXIgaW4gc29tZSBsb2NhbGVzCiAqLwpzdGF0aWMgdm9pZApteV9zdHJmdGltZShjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKmZtdCwgY29uc3Qgc3RydWN0IHRtICp0bSkgewoJc3RyZnRpbWUoYnVmLCBsZW4sIGZtdCwgdG0pOwp9Cgp2b2lkCmRvb3V0cHV0KCkgewoJcmVnaXN0ZXIgc3NpemVfdCBjYzsKCXRpbWVfdCB0dmVjOwoJY2hhciBvYnVmW0JVRlNJWl07CglzdHJ1Y3QgdGltZXZhbCB0djsKCWRvdWJsZSBvbGR0aW1lPXRpbWUoTlVMTCksIG5ld3RpbWU7CglpbnQgZmxncyA9IDA7Cglzc2l6ZV90IHdydDsKCXNpemVfdCBmd3J0OwoKCSh2b2lkKSBjbG9zZSgwKTsKI2lmZGVmIEhBVkVfTElCVVRJTAoJKHZvaWQpIGNsb3NlKHNsYXZlKTsKI2VuZGlmCgl0dmVjID0gdGltZSgodGltZV90ICopTlVMTCk7CglteV9zdHJmdGltZShvYnVmLCBzaXplb2Ygb2J1ZiwgIiVjXG4iLCBsb2NhbHRpbWUoJnR2ZWMpKTsKCWZwcmludGYoZnNjcmlwdCwgXygiU2NyaXB0IHN0YXJ0ZWQgb24gJXMiKSwgb2J1Zik7CgoJaWYgKGRpZSA9PSAwICYmIGNoaWxkICYmIGtpbGwoY2hpbGQsIDApID09IC0xICYmIGVycm5vID09IEVTUkNIKQoJCS8qCgkJICogdGhlIFNJR0NITEQgaGFuZGxlciBjb3VsZCBiZSBleGVjdXRlZCB3aGVuIHRoZSAiY2hpbGQiCgkJICogdmFyaWFibGUgaXMgbm90IHNldCB5ZXQuIEl0IG1lYW5zIHRoYXQgdGhlICJkaWUiIGlzIHplcm8KCQkgKiBhbHRob3VnaHQgdGhlIGNoaWxkIHByb2Nlc3MgaXMgYWxyZWFkeSBkb25lLiBXZSBoYXZlIHRvCgkJICogY2hlY2sgdGhpcyB0aGluZyBub3cuIE5vdyB3ZSBoYXZlIHRoZSAiY2hpbGQiIHZhcmlhYmxlCgkJICogYWxyZWFkeSBpbml0aWFsaXplZC4gRm9yIG1vcmUgZGV0YWlscyBzZWUgbWFpbigpIGFuZAoJCSAqIGZpbmlzaCgpLiAgLS1remFrIDA3LUF1Zy0yMDA3CgkJICovCgkJZGllID0gMTsKCglkbyB7CgkJaWYgKGRpZSAmJiBmbGdzID09IDApIHsKCQkJLyogLi5jaGlsZCBpcyBkZWFkLCBidXQgaXQgZG9lc24ndCBtZWFuIHRoYXQgdGhlcmUgaXMKCQkJICogbm90aGluZyBpbiBidWZmZXJzLgoJCQkgKi8KCQkJZmxncyA9IGZjbnRsKG1hc3RlciwgRl9HRVRGTCwgMCk7CgkJCWlmIChmY250bChtYXN0ZXIsIEZfU0VURkwsIChmbGdzIHwgT19OT05CTE9DSykpID09IC0xKQoJCQkJYnJlYWs7CgkJfQoJCWlmICh0ZmxnKQoJCQlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKCgkJZXJybm8gPSAwOwoJCWNjID0gcmVhZChtYXN0ZXIsIG9idWYsIHNpemVvZiAob2J1ZikpOwoKCQlpZiAoZGllICYmIGVycm5vID09IEVJTlRSICYmIGNjIDw9IDApCgkJCS8qIHJlYWQoKSBoYXMgYmVlbiBpbnRlcnJ1cHRlZCBieSBTSUdDSExELCB0cnkgaXQgYWdhaW4KCQkJICogd2l0aCBPX05PTkJMT0NLCgkJCSAqLwoJCQljb250aW51ZTsKCQlpZiAoY2MgPD0gMCkKCQkJYnJlYWs7CgkJaWYgKHRmbGcpIHsKCQkJbmV3dGltZSA9IHR2LnR2X3NlYyArIChkb3VibGUpIHR2LnR2X3VzZWMgLyAxMDAwMDAwOwoJCQlmcHJpbnRmKHN0ZGVyciwgIiVmICV6ZFxuIiwgbmV3dGltZSAtIG9sZHRpbWUsIGNjKTsKCQkJb2xkdGltZSA9IG5ld3RpbWU7CgkJfQoJCXdydCA9IHdyaXRlKDEsIG9idWYsIGNjKTsKCQlpZiAod3J0IDwgMCkgewoJCQlpbnQgZXJyID0gZXJybm87CgkJCWZwcmludGYgKHN0ZGVyciwgXygiJXM6IHdyaXRlIGVycm9yOiAlc1xuIiksCgkJCQlwcm9nbmFtZSwgc3RyZXJyb3IoZXJyKSk7CgkJCWZhaWwoKTsKCQl9CgkJZndydCA9IGZ3cml0ZShvYnVmLCAxLCBjYywgZnNjcmlwdCk7CgkJaWYgKGZ3cnQgPCBjYykgewoJCQlpbnQgZXJyID0gZXJybm87CgkJCWZwcmludGYgKHN0ZGVyciwgXygiJXM6IGNhbm5vdCB3cml0ZSBzY3JpcHQgZmlsZSwgZXJyb3I6ICVzXG4iKSwKCQkJCXByb2duYW1lLCBzdHJlcnJvcihlcnIpKTsKCQkJZmFpbCgpOwoJCX0KCQlpZiAoZmZsZykKCQkJKHZvaWQpIGZmbHVzaChmc2NyaXB0KTsKCX0gd2hpbGUoMSk7CgoJaWYgKGZsZ3MpCgkJZmNudGwobWFzdGVyLCBGX1NFVEZMLCBmbGdzKTsKCWRvbmUoKTsKfQoKdm9pZApkb3NoZWxsKCkgewoJY2hhciAqc2huYW1lOwoKI2lmIDAKCWludCB0OwoKCXQgPSBvcGVuKF9QQVRIX0RFVl9UVFksIE9fUkRXUik7CglpZiAodCA+PSAwKSB7CgkJKHZvaWQpIGlvY3RsKHQsIFRJT0NOT1RUWSwgKGNoYXIgKikwKTsKCQkodm9pZCkgY2xvc2UodCk7Cgl9CiNlbmRpZgoKCWdldHNsYXZlKCk7Cgkodm9pZCkgY2xvc2UobWFzdGVyKTsKCSh2b2lkKSBmY2xvc2UoZnNjcmlwdCk7Cgkodm9pZCkgZHVwMihzbGF2ZSwgMCk7Cgkodm9pZCkgZHVwMihzbGF2ZSwgMSk7Cgkodm9pZCkgZHVwMihzbGF2ZSwgMik7Cgkodm9pZCkgY2xvc2Uoc2xhdmUpOwoKCXNobmFtZSA9IHN0cnJjaHIoc2hlbGwsICcvJyk7CglpZiAoc2huYW1lKQoJCXNobmFtZSsrOwoJZWxzZQoJCXNobmFtZSA9IHNoZWxsOwoKCWlmIChjZmxnKQoJCWV4ZWNsKHNoZWxsLCBzaG5hbWUsICItYyIsIGNmbGcsIE5VTEwpOwoJZWxzZQoJCWV4ZWNsKHNoZWxsLCBzaG5hbWUsICItaSIsIE5VTEwpOwoKCXBlcnJvcihzaGVsbCk7CglmYWlsKCk7Cn0KCnZvaWQKZml4dHR5KCkgewoJc3RydWN0IHRlcm1pb3MgcnR0OwoKCXJ0dCA9IHR0OwoJY2ZtYWtlcmF3KCZydHQpOwoJcnR0LmNfbGZsYWcgJj0gfkVDSE87Cgkodm9pZCkgdGNzZXRhdHRyKDAsIFRDU0FOT1csICZydHQpOwp9Cgp2b2lkCmZhaWwoKSB7CgoJKHZvaWQpIGtpbGwoMCwgU0lHVEVSTSk7Cglkb25lKCk7Cn0KCnZvaWQKZG9uZSgpIHsKCXRpbWVfdCB0dmVjOwoKCWlmIChzdWJjaGlsZCkgewoJCWlmICghcWZsZykgewoJCQljaGFyIGJ1ZltCVUZTSVpdOwoJCQl0dmVjID0gdGltZSgodGltZV90ICopTlVMTCk7CgkJCW15X3N0cmZ0aW1lKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiVjXG4iLCBsb2NhbHRpbWUoJnR2ZWMpKTsKCQkJZnByaW50Zihmc2NyaXB0LCBfKCJcblNjcmlwdCBkb25lIG9uICVzIiksIGJ1Zik7CgkJfQoJCSh2b2lkKSBmY2xvc2UoZnNjcmlwdCk7CgkJKHZvaWQpIGNsb3NlKG1hc3Rlcik7Cgl9IGVsc2UgewoJCSh2b2lkKSB0Y3NldGF0dHIoMCwgVENTQURSQUlOLCAmdHQpOwoJCWlmICghcWZsZykKCQkJcHJpbnRmKF8oIlNjcmlwdCBkb25lLCBmaWxlIGlzICVzXG4iKSwgZm5hbWUpOwoJfQoJZXhpdCgwKTsKfQoKdm9pZApnZXRtYXN0ZXIoKSB7CiNpZmRlZiBIQVZFX0xJQlVUSUwKCSh2b2lkKSB0Y2dldGF0dHIoMCwgJnR0KTsKCSh2b2lkKSBpb2N0bCgwLCBUSU9DR1dJTlNaLCAoY2hhciAqKSZ3aW4pOwoJaWYgKG9wZW5wdHkoJm1hc3RlciwgJnNsYXZlLCBOVUxMLCAmdHQsICZ3aW4pIDwgMCkgewoJCWZwcmludGYoc3RkZXJyLCBfKCJvcGVucHR5IGZhaWxlZFxuIikpOwoJCWZhaWwoKTsKCX0KI2Vsc2UKCWNoYXIgKnB0eSwgKmJhbmssICpjcDsKCXN0cnVjdCBzdGF0IHN0YjsKCglwdHkgPSAmbGluZVtzdHJsZW4oIi9kZXYvcHR5cCIpXTsKCWZvciAoYmFuayA9ICJwcXJzIjsgKmJhbms7IGJhbmsrKykgewoJCWxpbmVbc3RybGVuKCIvZGV2L3B0eSIpXSA9ICpiYW5rOwoJCSpwdHkgPSAnMCc7CgkJaWYgKHN0YXQobGluZSwgJnN0YikgPCAwKQoJCQlicmVhazsKCQlmb3IgKGNwID0gIjAxMjM0NTY3ODlhYmNkZWYiOyAqY3A7IGNwKyspIHsKCQkJKnB0eSA9ICpjcDsKCQkJbWFzdGVyID0gb3BlbihsaW5lLCBPX1JEV1IpOwoJCQlpZiAobWFzdGVyID49IDApIHsKCQkJCWNoYXIgKnRwID0gJmxpbmVbc3RybGVuKCIvZGV2LyIpXTsKCQkJCWludCBvazsKCgkJCQkvKiB2ZXJpZnkgc2xhdmUgc2lkZSBpcyB1c2FibGUgKi8KCQkJCSp0cCA9ICd0JzsKCQkJCW9rID0gYWNjZXNzKGxpbmUsIFJfT0t8V19PSykgPT0gMDsKCQkJCSp0cCA9ICdwJzsKCQkJCWlmIChvaykgewoJCQkJCSh2b2lkKSB0Y2dldGF0dHIoMCwgJnR0KTsKCQkJCSAgICAJKHZvaWQpIGlvY3RsKDAsIFRJT0NHV0lOU1osIAoJCQkJCQkoY2hhciAqKSZ3aW4pOwoJCQkJCXJldHVybjsKCQkJCX0KCQkJCSh2b2lkKSBjbG9zZShtYXN0ZXIpOwoJCQl9CgkJfQoJfQoJZnByaW50ZihzdGRlcnIsIF8oIk91dCBvZiBwdHknc1xuIikpOwoJZmFpbCgpOwojZW5kaWYgLyogbm90IEhBVkVfTElCVVRJTCAqLwp9Cgp2b2lkCmdldHNsYXZlKCkgewojaWZuZGVmIEhBVkVfTElCVVRJTAoJbGluZVtzdHJsZW4oIi9kZXYvIildID0gJ3QnOwoJc2xhdmUgPSBvcGVuKGxpbmUsIE9fUkRXUik7CglpZiAoc2xhdmUgPCAwKSB7CgkJcGVycm9yKGxpbmUpOwoJCWZhaWwoKTsKCX0KCSh2b2lkKSB0Y3NldGF0dHIoc2xhdmUsIFRDU0FOT1csICZ0dCk7Cgkodm9pZCkgaW9jdGwoc2xhdmUsIFRJT0NTV0lOU1osIChjaGFyICopJndpbik7CiNlbmRpZgoJKHZvaWQpIHNldHNpZCgpOwoJKHZvaWQpIGlvY3RsKHNsYXZlLCBUSU9DU0NUVFksIDApOwp9Cg==