LyogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KCiAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQogICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQogICAwMjExMS0xMzA3IFVTQS4gICovCgojaW5jbHVkZSA8c3Bhd24uaD4KI2luY2x1ZGUgInNwYXduX2ludC5oIgoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGVycm9yLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8Z2V0b3B0Lmg+CiNpbmNsdWRlIDxpY29udi5oPgojaW5jbHVkZSA8bG9jYWxlLmg+CiNpbmNsdWRlIDxtY2hlY2suaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxyZWdleC5oPgoKCiNpZiBkZWZpbmVkIF9QT1NJWF9DUFVUSU1FICYmIF9QT1NJWF9DUFVUSU1FID49IDAKc3RhdGljIGNsb2NraWRfdCBjbDsKc3RhdGljIGludCB1c2VfY2xvY2s7CiNlbmRpZgpzdGF0aWMgaWNvbnZfdCBjZDsKc3RhdGljIGNoYXIgKm1lbTsKc3RhdGljIGNoYXIgKnVtZW07CnN0YXRpYyBzaXplX3QgbWVtbGVuOwpzdGF0aWMgc2l6ZV90IHVtZW1sZW47CnN0YXRpYyBpbnQgdGltaW5nOwoKc3RhdGljIGludCB0ZXN0X2V4cHIgKGNvbnN0IGNoYXIgKmV4cHIsIGludCBleHBlY3RlZCwgaW50IGV4cGVjdGVkaWNhc2UpOwpzdGF0aWMgaW50IHJ1bl90ZXN0IChjb25zdCBjaGFyICpleHByLCBjb25zdCBjaGFyICptZW0sIHNpemVfdCBtZW1sZW4sCgkJICAgICBpbnQgaWNhc2UsIGludCBleHBlY3RlZCk7CnN0YXRpYyBpbnQgcnVuX3Rlc3RfYmFja3dhcmRzIChjb25zdCBjaGFyICpleHByLCBjb25zdCBjaGFyICptZW0sCgkJCSAgICAgICBzaXplX3QgbWVtbGVuLCBpbnQgaWNhc2UsIGludCBleHBlY3RlZCk7CgoKc3RhdGljIGludApkb190ZXN0ICh2b2lkKQp7CiAgY29uc3QgY2hhciAqZmlsZTsKICBpbnQgZmQ7CiAgc3RydWN0IHN0YXQgc3Q7CiAgaW50IHJlc3VsdDsKICBjaGFyICppbm1lbTsKICBjaGFyICpvdXRtZW07CiAgc2l6ZV90IGlubGVuOwogIHNpemVfdCBvdXRsZW47CgogIG10cmFjZSAoKTsKCiAgLyogTWFrZSB0aGUgY29udGVudCBvZiB0aGUgZmlsZSBhdmFpbGFibGUgaW4gbWVtb3J5LiAgKi8KICBmaWxlID0gIi4uL0NoYW5nZUxvZy44IjsKICBmZCA9IG9wZW4gKGZpbGUsIE9fUkRPTkxZKTsKICBpZiAoZmQgPT0gLTEpCiAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgImNhbm5vdCBvcGVuICVzIiwgYmFzZW5hbWUgKGZpbGUpKTsKCiAgaWYgKGZzdGF0IChmZCwgJnN0KSAhPSAwKQogICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sICJjYW5ub3Qgc3RhdCAlcyIsIGJhc2VuYW1lIChmaWxlKSk7CiAgbWVtbGVuID0gc3Quc3Rfc2l6ZTsKCiAgbWVtID0gKGNoYXIgKikgbWFsbG9jIChtZW1sZW4gKyAxKTsKICBpZiAobWVtID09IE5VTEwpCiAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgIndoaWxlIGFsbG9jYXRpbmcgYnVmZmVyIik7CgogIGlmICgoc2l6ZV90KSByZWFkIChmZCwgbWVtLCBtZW1sZW4pICE9IG1lbWxlbikKICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJjYW5ub3QgcmVhZCBlbnRpcmUgZmlsZSIpOwogIG1lbVttZW1sZW5dID0gJ1wwJzsKCiAgY2xvc2UgKGZkKTsKCiAgLyogV2UgaGF2ZSB0byBjb252ZXJ0IGEgZmV3IHRoaW5ncyBmcm9tIExhdGluLTEgdG8gVVRGLTguICAqLwogIGNkID0gaWNvbnZfb3BlbiAoIlVURi04IiwgIklTTy04ODU5LTEiKTsKICBpZiAoY2QgPT0gKGljb252X3QpIC0xKQogICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sICJjYW5ub3QgZ2V0IGNvbnZlcnNpb24gZGVzY3JpcHRvciIpOwoKICAvKiBGb3IgdGhlIHNlY29uZCB0ZXN0IHdlIGhhdmUgdG8gY29udmVydCB0aGUgZmlsZSBjb250ZW50IHRvIFVURi04LgogICAgIFNpbmNlIHRoZSB0ZXh0IGlzIG1vc3RseSBBU0NJSSBpdCBzaG91bGQgYmUgZW5vdWdoIHRvIGFsbG9jYXRlCiAgICAgdHdpY2UgYXMgbXVjaCBtZW1vcnkgZm9yIHRoZSBVVEYtOCB0ZXh0IHRoYW4gZm9yIHRoZSBMYXRpbi0xCiAgICAgdGV4dC4gICovCiAgdW1lbSA9IChjaGFyICopIGNhbGxvYyAoMiwgbWVtbGVuKTsKICBpZiAodW1lbSA9PSBOVUxMKQogICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sICJ3aGlsZSBhbGxvY2F0aW5nIGJ1ZmZlciIpOwoKICBpbm1lbSA9IG1lbTsKICBpbmxlbiA9IG1lbWxlbjsKICBvdXRtZW0gPSB1bWVtOwogIG91dGxlbiA9IDIgKiBtZW1sZW4gLSAxOwogIGljb252IChjZCwgJmlubWVtLCAmaW5sZW4sICZvdXRtZW0sICZvdXRsZW4pOwogIHVtZW1sZW4gPSBvdXRtZW0gLSB1bWVtOwogIGlmIChpbmxlbiAhPSAwKQogICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sICJjYW5ub3QgY29udmVydCBidWZmZXIiKTsKCiNpZiBkZWZpbmVkIF9QT1NJWF9DUFVUSU1FICYmIF9QT1NJWF9DUFVUSU1FID49IDAKIyBpZiBfUE9TSVhfQ1BVVElNRSA9PSAwCiAgaWYgKHN5c2NvbmYgKF9TQ19DUFVUSU1FKSA8IDApCiAgICB1c2VfY2xvY2sgPSAwOwogIGVsc2UKIyBlbmRpZgogICAgLyogU2VlIHdoZXRoZXIgd2UgY2FuIHVzZSB0aGUgQ1BVIGNsb2NrLiAgKi8KICAgIHVzZV9jbG9jayA9IGNsb2NrX2dldGNwdWNsb2NraWQgKDAsICZjbCkgPT0gMDsKI2VuZGlmCgojaWZkZWYgREVCVUcKICByZV9zZXRfc3ludGF4IChSRV9ERUJVRyk7CiNlbmRpZgoKICAvKiBSdW4gdGhlIGFjdHVhbCB0ZXN0cy4gIEFsbCB0ZXN0cyBhcmUgcnVuIGluIGEgc2luZ2xlLWJ5dGUgYW5kIGEKICAgICBtdWx0aS1ieXRlIGxvY2FsZS4gICovCiAgcmVzdWx0ID0gdGVzdF9leHByICgiW+Th4OLp6Ort7O7x9vPy9Pz6+ftdIiwgMiwgMik7CiAgcmVzdWx0IHw9IHRlc3RfZXhwciAoIkcucmFuIiwgMiwgMyk7CiAgcmVzdWx0IHw9IHRlc3RfZXhwciAoIkcuXFx7MVxcfXJhbiIsIDIsIDMpOwogIHJlc3VsdCB8PSB0ZXN0X2V4cHIgKCJHLipyYW4iLCAzLCA0NCk7CiAgcmVzdWx0IHw9IHRlc3RfZXhwciAoIlvk4eDiXSIsIDAsIDApOwogIHJlc3VsdCB8PSB0ZXN0X2V4cHIgKCJVZGRlYm9yZyIsIDIsIDIpOwogIHJlc3VsdCB8PSB0ZXN0X2V4cHIgKCIuVWRkZWJvcmciLCAyLCAyKTsKCiAgLyogRnJlZSB0aGUgcmVzb3VyY2VzLiAgKi8KICBmcmVlICh1bWVtKTsKICBpY29udl9jbG9zZSAoY2QpOwogIGZyZWUgKG1lbSk7CgogIHJldHVybiByZXN1bHQ7Cn0KCgpzdGF0aWMgaW50CnRlc3RfZXhwciAoY29uc3QgY2hhciAqZXhwciwgaW50IGV4cGVjdGVkLCBpbnQgZXhwZWN0ZWRpY2FzZSkKewogIGludCByZXN1bHQ7CiAgY2hhciAqaW5tZW07CiAgY2hhciAqb3V0bWVtOwogIHNpemVfdCBpbmxlbjsKICBzaXplX3Qgb3V0bGVuOwogIGNoYXIgKnVleHByOwoKICAvKiBGaXJzdCB0ZXN0OiBzZWFyY2ggd2l0aCBhbiBJU08tODg1OS0xIGxvY2FsZS4gICovCiAgaWYgKHNldGxvY2FsZSAoTENfQUxMLCAiZGVfREUuSVNPLTg4NTktMSIpID09IE5VTEwpCiAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiY2Fubm90IHNldCBsb2NhbGUgZGVfREUuSVNPLTg4NTktMSIpOwoKICBwcmludGYgKCJcblRlc3QgXCIlc1wiIHdpdGggOC1iaXQgbG9jYWxlXG4iLCBleHByKTsKICByZXN1bHQgPSBydW5fdGVzdCAoZXhwciwgbWVtLCBtZW1sZW4sIDAsIGV4cGVjdGVkKTsKICBwcmludGYgKCJcblRlc3QgXCIlc1wiIHdpdGggOC1iaXQgbG9jYWxlLCBjYXNlIGluc2Vuc2l0aXZlXG4iLCBleHByKTsKICByZXN1bHQgfD0gcnVuX3Rlc3QgKGV4cHIsIG1lbSwgbWVtbGVuLCAxLCBleHBlY3RlZGljYXNlKTsKICBwcmludGYgKCJcblRlc3QgXCIlc1wiIGJhY2t3YXJkcyB3aXRoIDgtYml0IGxvY2FsZVxuIiwgZXhwcik7CiAgcmVzdWx0IHw9IHJ1bl90ZXN0X2JhY2t3YXJkcyAoZXhwciwgbWVtLCBtZW1sZW4sIDAsIGV4cGVjdGVkKTsKICBwcmludGYgKCJcblRlc3QgXCIlc1wiIGJhY2t3YXJkcyB3aXRoIDgtYml0IGxvY2FsZSwgY2FzZSBpbnNlbnNpdGl2ZVxuIiwKCSAgZXhwcik7CiAgcmVzdWx0IHw9IHJ1bl90ZXN0X2JhY2t3YXJkcyAoZXhwciwgbWVtLCBtZW1sZW4sIDEsIGV4cGVjdGVkaWNhc2UpOwoKICAvKiBTZWNvbmQgdGVzdDogc2VhcmNoIHdpdGggYW4gVVRGLTggbG9jYWxlLiAgKi8KICBpZiAoc2V0bG9jYWxlIChMQ19BTEwsICJkZV9ERS5VVEYtOCIpID09IE5VTEwpCiAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiY2Fubm90IHNldCBsb2NhbGUgZGVfREUuVVRGLTgiKTsKCiAgaW5tZW0gPSAoY2hhciAqKSBleHByOwogIGlubGVuID0gc3RybGVuIChleHByKTsKICBvdXRsZW4gPSBpbmxlbiAqIE1CX0NVUl9NQVg7CiAgb3V0bWVtID0gdWV4cHIgPSBhbGxvY2EgKG91dGxlbiArIDEpOwogIG1lbXNldCAob3V0bWVtLCAnXDAnLCBvdXRsZW4gKyAxKTsKICBpY29udiAoY2QsICZpbm1lbSwgJmlubGVuLCAmb3V0bWVtLCAmb3V0bGVuKTsKICBpZiAoaW5sZW4gIT0gMCkKICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCAiY2Fubm90IGNvbnZlcnQgZXhwcmVzc2lvbiIpOwoKICAvKiBSdW4gdGhlIHRlc3RzLiAgKi8KICBwcmludGYgKCJcblRlc3QgXCIlc1wiIHdpdGggbXVsdGktYnl0ZSBsb2NhbGVcbiIsIGV4cHIpOwogIHJlc3VsdCB8PSBydW5fdGVzdCAodWV4cHIsIHVtZW0sIHVtZW1sZW4sIDAsIGV4cGVjdGVkKTsKICBwcmludGYgKCJcblRlc3QgXCIlc1wiIHdpdGggbXVsdGktYnl0ZSBsb2NhbGUsIGNhc2UgaW5zZW5zaXRpdmVcbiIsIGV4cHIpOwogIHJlc3VsdCB8PSBydW5fdGVzdCAodWV4cHIsIHVtZW0sIHVtZW1sZW4sIDEsIGV4cGVjdGVkaWNhc2UpOwogIHByaW50ZiAoIlxuVGVzdCBcIiVzXCIgYmFja3dhcmRzIHdpdGggbXVsdGktYnl0ZSBsb2NhbGVcbiIsIGV4cHIpOwogIHJlc3VsdCB8PSBydW5fdGVzdF9iYWNrd2FyZHMgKHVleHByLCB1bWVtLCB1bWVtbGVuLCAwLCBleHBlY3RlZCk7CiAgcHJpbnRmICgiXG5UZXN0IFwiJXNcIiBiYWNrd2FyZHMgd2l0aCBtdWx0aS1ieXRlIGxvY2FsZSwgY2FzZSBpbnNlbnNpdGl2ZVxuIiwKCSAgZXhwcik7CiAgcmVzdWx0IHw9IHJ1bl90ZXN0X2JhY2t3YXJkcyAodWV4cHIsIHVtZW0sIHVtZW1sZW4sIDEsIGV4cGVjdGVkaWNhc2UpOwoKICByZXR1cm4gcmVzdWx0Owp9CgoKc3RhdGljIGludApydW5fdGVzdCAoY29uc3QgY2hhciAqZXhwciwgY29uc3QgY2hhciAqbWVtLCBzaXplX3QgbWVtbGVuLCBpbnQgaWNhc2UsCgkgIGludCBleHBlY3RlZCkKewojaWYgZGVmaW5lZCBfUE9TSVhfQ1BVVElNRSAmJiBfUE9TSVhfQ1BVVElNRSA+PSAwCiAgc3RydWN0IHRpbWVzcGVjIHN0YXJ0OwogIHN0cnVjdCB0aW1lc3BlYyBmaW5pc2g7CiNlbmRpZgogIHJlZ2V4X3QgcmU7CiAgaW50IGVycjsKICBzaXplX3Qgb2Zmc2V0OwogIGludCBjbnQ7CgojaWYgZGVmaW5lZCBfUE9TSVhfQ1BVVElNRSAmJiBfUE9TSVhfQ1BVVElNRSA+PSAwCiAgaWYgKHVzZV9jbG9jayAmJiAhdGltaW5nKQogICAgdXNlX2Nsb2NrID0gY2xvY2tfZ2V0dGltZSAoY2wsICZzdGFydCkgPT0gMDsKI2VuZGlmCgogIGVyciA9IHJlZ2NvbXAgKCZyZSwgZXhwciwgUkVHX05FV0xJTkUgfCAoaWNhc2UgPyBSRUdfSUNBU0UgOiAwKSk7CiAgaWYgKGVyciAhPSBSRUdfTk9FUlJPUikKICAgIHsKICAgICAgY2hhciBidWZbMjAwXTsKICAgICAgcmVnZXJyb3IgKGVyciwgJnJlLCBidWYsIHNpemVvZiBidWYpOwogICAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiY2Fubm90IGNvbXBpbGUgZXhwcmVzc2lvbjogJXMiLCBidWYpOwogICAgfQoKICBjbnQgPSAwOwogIG9mZnNldCA9IDA7CiAgYXNzZXJ0IChtZW1bbWVtbGVuXSA9PSAnXDAnKTsKICB3aGlsZSAob2Zmc2V0IDwgbWVtbGVuKQogICAgewogICAgICByZWdtYXRjaF90IG1hWzFdOwogICAgICBjb25zdCBjaGFyICpzcDsKICAgICAgY29uc3QgY2hhciAqZXA7CgogICAgICBlcnIgPSByZWdleGVjICgmcmUsIG1lbSArIG9mZnNldCwgMSwgbWEsIDApOwogICAgICBpZiAoZXJyID09IFJFR19OT01BVENIKQoJYnJlYWs7CgogICAgICBpZiAoZXJyICE9IFJFR19OT0VSUk9SKQoJewoJICBjaGFyIGJ1ZlsyMDBdOwoJICByZWdlcnJvciAoZXJyLCAmcmUsIGJ1Ziwgc2l6ZW9mIGJ1Zik7CgkgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJjYW5ub3QgdXNlIGV4cHJlc3Npb246ICVzIiwgYnVmKTsKCX0KCiAgICAgIGFzc2VydCAobWFbMF0ucm1fc28gPj0gMCk7CiAgICAgIHNwID0gbWVtICsgb2Zmc2V0ICsgbWFbMF0ucm1fc287CiAgICAgIHdoaWxlIChzcCA+IG1lbSAmJiBzcFstMV0gIT0gJ1xuJykKCS0tc3A7CgogICAgICBlcCA9IG1lbSArIG9mZnNldCArIG1hWzBdLnJtX3NvOwogICAgICB3aGlsZSAoKmVwICE9ICdcMCcgJiYgKmVwICE9ICdcbicpCgkrK2VwOwoKICAgICAgcHJpbnRmICgibWF0Y2ggJWQ6IFwiJS4qc1wiXG4iLCArK2NudCwgKGludCkgKGVwIC0gc3ApLCBzcCk7CgogICAgICBvZmZzZXQgPSBlcCArIDEgLSBtZW07CiAgICB9CgogIHJlZ2ZyZWUgKCZyZSk7CgojaWYgZGVmaW5lZCBfUE9TSVhfQ1BVVElNRSAmJiBfUE9TSVhfQ1BVVElNRSA+PSAwCiAgaWYgKHVzZV9jbG9jayAmJiAhdGltaW5nKQogICAgewogICAgICB1c2VfY2xvY2sgPSBjbG9ja19nZXR0aW1lIChjbCwgJmZpbmlzaCkgPT0gMDsKICAgICAgaWYgKHVzZV9jbG9jaykKCXsKCSAgaWYgKGZpbmlzaC50dl9uc2VjIDwgc3RhcnQudHZfbnNlYykKCSAgICB7CgkgICAgICBmaW5pc2gudHZfbnNlYyAtPSBzdGFydC50dl9uc2VjIC0gMTAwMDAwMDAwMDsKCSAgICAgIGZpbmlzaC50dl9zZWMgLT0gMSArIHN0YXJ0LnR2X3NlYzsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICBmaW5pc2gudHZfbnNlYyAtPSBzdGFydC50dl9uc2VjOwoJICAgICAgZmluaXNoLnR2X3NlYyAtPSBzdGFydC50dl9zZWM7CgkgICAgfQoKCSAgcHJpbnRmICgiZWxhcHNlZCB0aW1lOiAlbGQuJTA5bGQgc2VjXG4iLAoJCSAgZmluaXNoLnR2X3NlYywgZmluaXNoLnR2X25zZWMpOwoJfQogICAgfQoKICBpZiAodXNlX2Nsb2NrICYmIHRpbWluZykKICAgIHsKICAgICAgc3RydWN0IHRpbWVzcGVjIG1pbnRpbWUgPSB7IC50dl9zZWMgPSAyNCAqIDYwICogNjAgfTsKCiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkKCXsKCSAgb2Zmc2V0ID0gMDsKCSAgdXNlX2Nsb2NrID0gY2xvY2tfZ2V0dGltZSAoY2wsICZzdGFydCkgPT0gMDsKCgkgIGlmICghdXNlX2Nsb2NrKQoJICAgIGNvbnRpbnVlOwoKCSAgZXJyID0gcmVnY29tcCAoJnJlLCBleHByLCBSRUdfTkVXTElORSB8IChpY2FzZSA/IFJFR19JQ0FTRSA6IDApKTsKCSAgaWYgKGVyciAhPSBSRUdfTk9FUlJPUikKCSAgICBjb250aW51ZTsKCgkgIHdoaWxlIChvZmZzZXQgPCBtZW1sZW4pCgkgICAgewoJICAgICAgcmVnbWF0Y2hfdCBtYVsxXTsKCgkgICAgICBlcnIgPSByZWdleGVjICgmcmUsIG1lbSArIG9mZnNldCwgMSwgbWEsIDApOwoJICAgICAgaWYgKGVyciAhPSBSRUdfTk9FUlJPUikKCQlicmVhazsKCgkgICAgICBvZmZzZXQgKz0gbWFbMF0ucm1fZW87CgkgICAgfQoKCSAgcmVnZnJlZSAoJnJlKTsKCgkgIHVzZV9jbG9jayA9IGNsb2NrX2dldHRpbWUgKGNsLCAmZmluaXNoKSA9PSAwOwoJICBpZiAodXNlX2Nsb2NrKQoJICAgIHsKCSAgICAgIGlmIChmaW5pc2gudHZfbnNlYyA8IHN0YXJ0LnR2X25zZWMpCgkJewoJCSAgZmluaXNoLnR2X25zZWMgLT0gc3RhcnQudHZfbnNlYyAtIDEwMDAwMDAwMDA7CgkJICBmaW5pc2gudHZfc2VjIC09IDEgKyBzdGFydC50dl9zZWM7CgkJfQoJICAgICAgZWxzZQoJCXsKCQkgIGZpbmlzaC50dl9uc2VjIC09IHN0YXJ0LnR2X25zZWM7CgkJICBmaW5pc2gudHZfc2VjIC09IHN0YXJ0LnR2X3NlYzsKCQl9CgkgICAgICBpZiAoZmluaXNoLnR2X3NlYyA8IG1pbnRpbWUudHZfc2VjCgkJICB8fCAoZmluaXNoLnR2X3NlYyA9PSBtaW50aW1lLnR2X3NlYwoJCSAgICAgICYmIGZpbmlzaC50dl9uc2VjIDwgbWludGltZS50dl9uc2VjKSkKCQltaW50aW1lID0gZmluaXNoOwoJICAgIH0KCX0KICAgICAgcHJpbnRmICgiZWxhcHNlZCB0aW1lOiAlbGQuJTA5bGQgc2VjXG4iLAoJICAgICAgbWludGltZS50dl9zZWMsIG1pbnRpbWUudHZfbnNlYyk7CiAgICB9CiNlbmRpZgoKICAvKiBSZXR1cm4gYW4gZXJyb3IgaWYgdGhlIG51bWJlciBvZiBtYXRjaGVzIGZvdW5kIGlzIG5vdCBtYXRjaCB3ZQogICAgIGV4cGVjdC4gICovCiAgcmV0dXJuIGNudCAhPSBleHBlY3RlZDsKfQoKCnN0YXRpYyBpbnQKcnVuX3Rlc3RfYmFja3dhcmRzIChjb25zdCBjaGFyICpleHByLCBjb25zdCBjaGFyICptZW0sIHNpemVfdCBtZW1sZW4sCgkJICAgIGludCBpY2FzZSwgaW50IGV4cGVjdGVkKQp7CiNpZiBkZWZpbmVkIF9QT1NJWF9DUFVUSU1FICYmIF9QT1NJWF9DUFVUSU1FID49IDAKICBzdHJ1Y3QgdGltZXNwZWMgc3RhcnQ7CiAgc3RydWN0IHRpbWVzcGVjIGZpbmlzaDsKI2VuZGlmCiAgc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyIHJlOwogIGNvbnN0IGNoYXIgKmVycjsKICBzaXplX3Qgb2Zmc2V0OwogIGludCBjbnQ7CgojaWYgZGVmaW5lZCBfUE9TSVhfQ1BVVElNRSAmJiBfUE9TSVhfQ1BVVElNRSA+PSAwCiAgaWYgKHVzZV9jbG9jayAmJiAhdGltaW5nKQogICAgdXNlX2Nsb2NrID0gY2xvY2tfZ2V0dGltZSAoY2wsICZzdGFydCkgPT0gMDsKI2VuZGlmCgogIHJlX3NldF9zeW50YXggKChSRV9TWU5UQVhfUE9TSVhfQkFTSUMgJiB+UkVfRE9UX05FV0xJTkUpCgkJIHwgUkVfSEFUX0xJU1RTX05PVF9ORVdMSU5FCgkJIHwgKGljYXNlID8gUkVfSUNBU0UgOiAwKSk7CgogIG1lbXNldCAoJnJlLCAwLCBzaXplb2YgKHJlKSk7CiAgcmUuZmFzdG1hcCA9IG1hbGxvYyAoMjU2KTsKICBpZiAocmUuZmFzdG1hcCA9PSBOVUxMKQogICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sICJjYW5ub3QgYWxsb2NhdGUgZmFzdG1hcCIpOwoKICBlcnIgPSByZV9jb21waWxlX3BhdHRlcm4gKGV4cHIsIHN0cmxlbiAoZXhwciksICZyZSk7CiAgaWYgKGVyciAhPSBOVUxMKQogICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImNhbm5vdCBjb21waWxlIGV4cHJlc3Npb246ICVzIiwgZXJyKTsKCiAgaWYgKHJlX2NvbXBpbGVfZmFzdG1hcCAoJnJlKSkKICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJjb3VsZG4ndCBjb21waWxlIGZhc3RtYXAiKTsKCiAgY250ID0gMDsKICBvZmZzZXQgPSBtZW1sZW47CiAgYXNzZXJ0IChtZW1bbWVtbGVuXSA9PSAnXDAnKTsKICB3aGlsZSAob2Zmc2V0IDw9IG1lbWxlbikKICAgIHsKICAgICAgaW50IHN0YXJ0OwogICAgICBjb25zdCBjaGFyICpzcDsKICAgICAgY29uc3QgY2hhciAqZXA7CgogICAgICBzdGFydCA9IHJlX3NlYXJjaCAoJnJlLCBtZW0sIG1lbWxlbiwgb2Zmc2V0LCAtb2Zmc2V0LCBOVUxMKTsKICAgICAgaWYgKHN0YXJ0ID09IC0xKQoJYnJlYWs7CgogICAgICBpZiAoc3RhcnQgPT0gLTIpCgllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiaW50ZXJuYWwgZXJyb3IgaW4gcmVfc2VhcmNoIik7CgogICAgICBzcCA9IG1lbSArIHN0YXJ0OwogICAgICB3aGlsZSAoc3AgPiBtZW0gJiYgc3BbLTFdICE9ICdcbicpCgktLXNwOwoKICAgICAgZXAgPSBtZW0gKyBzdGFydDsKICAgICAgd2hpbGUgKCplcCAhPSAnXDAnICYmICplcCAhPSAnXG4nKQoJKytlcDsKCiAgICAgIHByaW50ZiAoIm1hdGNoICVkOiBcIiUuKnNcIlxuIiwgKytjbnQsIChpbnQpIChlcCAtIHNwKSwgc3ApOwoKICAgICAgb2Zmc2V0ID0gc3AgLSAxIC0gbWVtOwogICAgfQoKICByZWdmcmVlICgmcmUpOwoKI2lmIGRlZmluZWQgX1BPU0lYX0NQVVRJTUUgJiYgX1BPU0lYX0NQVVRJTUUgPj0gMAogIGlmICh1c2VfY2xvY2sgJiYgIXRpbWluZykKICAgIHsKICAgICAgdXNlX2Nsb2NrID0gY2xvY2tfZ2V0dGltZSAoY2wsICZmaW5pc2gpID09IDA7CiAgICAgIGlmICh1c2VfY2xvY2spCgl7CgkgIGlmIChmaW5pc2gudHZfbnNlYyA8IHN0YXJ0LnR2X25zZWMpCgkgICAgewoJICAgICAgZmluaXNoLnR2X25zZWMgLT0gc3RhcnQudHZfbnNlYyAtIDEwMDAwMDAwMDA7CgkgICAgICBmaW5pc2gudHZfc2VjIC09IDEgKyBzdGFydC50dl9zZWM7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgZmluaXNoLnR2X25zZWMgLT0gc3RhcnQudHZfbnNlYzsKCSAgICAgIGZpbmlzaC50dl9zZWMgLT0gc3RhcnQudHZfc2VjOwoJICAgIH0KCgkgIHByaW50ZiAoImVsYXBzZWQgdGltZTogJWxkLiUwOWxkIHNlY1xuIiwKCQkgIGZpbmlzaC50dl9zZWMsIGZpbmlzaC50dl9uc2VjKTsKCX0KICAgIH0KCiAgaWYgKHVzZV9jbG9jayAmJiB0aW1pbmcpCiAgICB7CiAgICAgIHN0cnVjdCB0aW1lc3BlYyBtaW50aW1lID0geyAudHZfc2VjID0gMjQgKiA2MCAqIDYwIH07CgogICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpCgl7CgkgIG9mZnNldCA9IG1lbWxlbjsKCSAgdXNlX2Nsb2NrID0gY2xvY2tfZ2V0dGltZSAoY2wsICZzdGFydCkgPT0gMDsKCgkgIGlmICghdXNlX2Nsb2NrKQoJICAgIGNvbnRpbnVlOwoKCSAgbWVtc2V0ICgmcmUsIDAsIHNpemVvZiAocmUpKTsKCSAgcmUuZmFzdG1hcCA9IG1hbGxvYyAoMjU2KTsKCSAgaWYgKHJlLmZhc3RtYXAgPT0gTlVMTCkKCSAgICBjb250aW51ZTsKCgkgIGVyciA9IHJlX2NvbXBpbGVfcGF0dGVybiAoZXhwciwgc3RybGVuIChleHByKSwgJnJlKTsKCSAgaWYgKGVyciAhPSBOVUxMKQoJICAgIGNvbnRpbnVlOwoKCSAgaWYgKHJlX2NvbXBpbGVfZmFzdG1hcCAoJnJlKSkKCSAgICB7CgkgICAgICByZWdmcmVlICgmcmUpOwoJICAgICAgY29udGludWU7CgkgICAgfQoKCSAgd2hpbGUgKG9mZnNldCA8PSBtZW1sZW4pCgkgICAgewoJICAgICAgaW50IHN0YXJ0OwoJICAgICAgY29uc3QgY2hhciAqc3A7CgoJICAgICAgc3RhcnQgPSByZV9zZWFyY2ggKCZyZSwgbWVtLCBtZW1sZW4sIG9mZnNldCwgLW9mZnNldCwgTlVMTCk7CgkgICAgICBpZiAoc3RhcnQgPCAtMSkKCQlicmVhazsKCgkgICAgICBzcCA9IG1lbSArIHN0YXJ0OwoJICAgICAgd2hpbGUgKHNwID4gbWVtICYmIHNwWy0xXSAhPSAnXG4nKQoJCS0tc3A7CgoJICAgICAgb2Zmc2V0ID0gc3AgLSAxIC0gbWVtOwoJICAgIH0KCgkgIHJlZ2ZyZWUgKCZyZSk7CgoJICB1c2VfY2xvY2sgPSBjbG9ja19nZXR0aW1lIChjbCwgJmZpbmlzaCkgPT0gMDsKCSAgaWYgKHVzZV9jbG9jaykKCSAgICB7CgkgICAgICBpZiAoZmluaXNoLnR2X25zZWMgPCBzdGFydC50dl9uc2VjKQoJCXsKCQkgIGZpbmlzaC50dl9uc2VjIC09IHN0YXJ0LnR2X25zZWMgLSAxMDAwMDAwMDAwOwoJCSAgZmluaXNoLnR2X3NlYyAtPSAxICsgc3RhcnQudHZfc2VjOwoJCX0KCSAgICAgIGVsc2UKCQl7CgkJICBmaW5pc2gudHZfbnNlYyAtPSBzdGFydC50dl9uc2VjOwoJCSAgZmluaXNoLnR2X3NlYyAtPSBzdGFydC50dl9zZWM7CgkJfQoJICAgICAgaWYgKGZpbmlzaC50dl9zZWMgPCBtaW50aW1lLnR2X3NlYwoJCSAgfHwgKGZpbmlzaC50dl9zZWMgPT0gbWludGltZS50dl9zZWMKCQkgICAgICAmJiBmaW5pc2gudHZfbnNlYyA8IG1pbnRpbWUudHZfbnNlYykpCgkJbWludGltZSA9IGZpbmlzaDsKCSAgICB9Cgl9CiAgICAgIHByaW50ZiAoImVsYXBzZWQgdGltZTogJWxkLiUwOWxkIHNlY1xuIiwKCSAgICAgIG1pbnRpbWUudHZfc2VjLCBtaW50aW1lLnR2X25zZWMpOwogICAgfQojZW5kaWYKCiAgLyogUmV0dXJuIGFuIGVycm9yIGlmIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyBmb3VuZCBpcyBub3QgbWF0Y2ggd2UKICAgICBleHBlY3QuICAqLwogIHJldHVybiBjbnQgIT0gZXhwZWN0ZWQ7Cn0KCi8qIElmIC0tdGltaW5nIGlzIHVzZWQgd2Ugd2lsbCBuZWVkIGEgbGFyZ2VyIHRpbW91dC4gICovCiNkZWZpbmUgVElNRU9VVCA1MAojZGVmaW5lIENNRExJTkVfT1BUSU9OUyBcCiAgIHsidGltaW5nIiwgbm9fYXJndW1lbnQsICZ0aW1pbmcsIDEgfSwKI2RlZmluZSBURVNUX0ZVTkNUSU9OIGRvX3Rlc3QgKCkKI2luY2x1ZGUgIi4uL3Rlc3Qtc2tlbGV0b24uYyIK