LyoKICogc3ZjLmMsIFNlcnZlci1zaWRlIHJlbW90ZSBwcm9jZWR1cmUgY2FsbCBpbnRlcmZhY2UuCiAqCiAqIFRoZXJlIGFyZSB0d28gc2V0cyBvZiBwcm9jZWR1cmVzIGhlcmUuICBUaGUgeHBydCByb3V0aW5lcyBhcmUKICogZm9yIGhhbmRsaW5nIHRyYW5zcG9ydCBoYW5kbGVzLiAgVGhlIHN2YyByb3V0aW5lcyBoYW5kbGUgdGhlCiAqIGxpc3Qgb2Ygc2VydmljZSByb3V0aW5lcy4KICogIENvcHlyaWdodCAoQykgMjAwMi0yMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCiAqICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KICoKICogIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgc2VlCiAqICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAqCiAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKICogbWV0OgogKgogKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCiAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cwogKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCiAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCiAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCiAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwogKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAogKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwogKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKi8KCiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxycGMvcnBjLmg+CiNpbmNsdWRlIDxycGMvc3ZjLmg+CiNpbmNsdWRlIDxycGMvcG1hcF9jbG50Lmg+CiNpbmNsdWRlIDxzeXMvcG9sbC5oPgojaW5jbHVkZSA8dGltZS5oPgoKI2lmZGVmIF9SUENfVEhSRUFEX1NBRkVfCiNkZWZpbmUgeHBvcnRzIFJQQ19USFJFQURfVkFSSUFCTEUoc3ZjX3hwb3J0c19zKQojZWxzZQpzdGF0aWMgU1ZDWFBSVCAqKnhwb3J0czsKI2VuZGlmCgojZGVmaW5lIE5VTExfU1ZDICgoc3RydWN0IHN2Y19jYWxsb3V0ICopMCkKI2RlZmluZQlSUUNSRURfU0laRQk0MDAJLyogdGhpcyBzaXplIGlzIGV4Y2Vzc2l2ZSAqLwoKLyogVGhlIHNlcnZpY2VzIGxpc3QKICAgRWFjaCBlbnRyeSByZXByZXNlbnRzIGEgc2V0IG9mIHByb2NlZHVyZXMgKGFuIHJwYyBwcm9ncmFtKS4KICAgVGhlIGRpc3BhdGNoIHJvdXRpbmUgdGFrZXMgcmVxdWVzdCBzdHJ1Y3RzIGFuZCBydW5zIHRoZQogICBhcHByb3ByaWF0ZSBwcm9jZWR1cmUuICovCnN0cnVjdCBzdmNfY2FsbG91dCB7CiAgc3RydWN0IHN2Y19jYWxsb3V0ICpzY19uZXh0OwogIHJwY3Byb2dfdCBzY19wcm9nOwogIHJwY3ZlcnNfdCBzY192ZXJzOwogIHZvaWQgKCpzY19kaXNwYXRjaCkgKHN0cnVjdCBzdmNfcmVxICosIFNWQ1hQUlQgKik7CiAgYm9vbF90IHNjX21hcHBlZDsKfTsKI2lmZGVmIF9SUENfVEhSRUFEX1NBRkVfCiNkZWZpbmUgc3ZjX2hlYWQgUlBDX1RIUkVBRF9WQVJJQUJMRShzdmNfaGVhZF9zKQojZWxzZQpzdGF0aWMgc3RydWN0IHN2Y19jYWxsb3V0ICpzdmNfaGVhZDsKI2VuZGlmCgovKiAqKioqKioqKioqKioqKiogIFNWQ1hQUlQgcmVsYXRlZCBzdHVmZiAqKioqKioqKioqKioqKioqICovCgovKiBBY3RpdmF0ZSBhIHRyYW5zcG9ydCBoYW5kbGUuICovCnZvaWQKeHBydF9yZWdpc3RlciAoU1ZDWFBSVCAqeHBydCkKewogIHJlZ2lzdGVyIGludCBzb2NrID0geHBydC0+eHBfc29jazsKICByZWdpc3RlciBpbnQgaTsKCiAgaWYgKHhwb3J0cyA9PSBOVUxMKQogICAgewogICAgICB4cG9ydHMgPSAoU1ZDWFBSVCAqKikgbWFsbG9jIChfcnBjX2R0YWJsZXNpemUgKCkgKiBzaXplb2YgKFNWQ1hQUlQgKikpOwogICAgICBpZiAoeHBvcnRzID09IE5VTEwpIC8qIERvbrR0IGFkZCBoYW5kbGUgKi8KCXJldHVybjsKICAgIH0KCiAgaWYgKHNvY2sgPCBfcnBjX2R0YWJsZXNpemUgKCkpCiAgICB7CiAgICAgIHN0cnVjdCBwb2xsZmQgKm5ld19zdmNfcG9sbGZkOwoKICAgICAgeHBvcnRzW3NvY2tdID0geHBydDsKICAgICAgaWYgKHNvY2sgPCBGRF9TRVRTSVpFKQoJRkRfU0VUIChzb2NrLCAmc3ZjX2Zkc2V0KTsKCiAgICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYW4gZW1wdHkgc2xvdCAqLwogICAgICBmb3IgKGkgPSAwOyBpIDwgc3ZjX21heF9wb2xsZmQ7ICsraSkKCWlmIChzdmNfcG9sbGZkW2ldLmZkID09IC0xKQoJICB7CgkgICAgc3ZjX3BvbGxmZFtpXS5mZCA9IHNvY2s7CgkgICAgc3ZjX3BvbGxmZFtpXS5ldmVudHMgPSAoUE9MTElOIHwgUE9MTFBSSSB8CgkJCQkgICAgUE9MTFJETk9STSB8IFBPTExSREJBTkQpOwoJICAgIHJldHVybjsKCSAgfQoKICAgICAgbmV3X3N2Y19wb2xsZmQgPSAoc3RydWN0IHBvbGxmZCAqKSByZWFsbG9jIChzdmNfcG9sbGZkLAoJCQkJCQkgIHNpemVvZiAoc3RydWN0IHBvbGxmZCkKCQkJCQkJICAqIChzdmNfbWF4X3BvbGxmZCArIDEpKTsKICAgICAgaWYgKG5ld19zdmNfcG9sbGZkID09IE5VTEwpIC8qIE91dCBvZiBtZW1vcnkgKi8KCXJldHVybjsKICAgICAgc3ZjX3BvbGxmZCA9IG5ld19zdmNfcG9sbGZkOwogICAgICArK3N2Y19tYXhfcG9sbGZkOwoKICAgICAgc3ZjX3BvbGxmZFtzdmNfbWF4X3BvbGxmZCAtIDFdLmZkID0gc29jazsKICAgICAgc3ZjX3BvbGxmZFtzdmNfbWF4X3BvbGxmZCAtIDFdLmV2ZW50cyA9IChQT0xMSU4gfCBQT0xMUFJJIHwKCQkJCQkgICAgICAgUE9MTFJETk9STSB8IFBPTExSREJBTkQpOwogICAgfQp9CmxpYmNfaGlkZGVuX25vbGlua19zdW5ycGMgKHhwcnRfcmVnaXN0ZXIsIEdMSUJDXzJfMCkKCi8qIERlLWFjdGl2YXRlIGEgdHJhbnNwb3J0IGhhbmRsZS4gKi8Kdm9pZAp4cHJ0X3VucmVnaXN0ZXIgKFNWQ1hQUlQgKnhwcnQpCnsKICByZWdpc3RlciBpbnQgc29jayA9IHhwcnQtPnhwX3NvY2s7CiAgcmVnaXN0ZXIgaW50IGk7CgogIGlmICgoc29jayA8IF9ycGNfZHRhYmxlc2l6ZSAoKSkgJiYgKHhwb3J0c1tzb2NrXSA9PSB4cHJ0KSkKICAgIHsKICAgICAgeHBvcnRzW3NvY2tdID0gKFNWQ1hQUlQgKikgMDsKCiAgICAgIGlmIChzb2NrIDwgRkRfU0VUU0laRSkKCUZEX0NMUiAoc29jaywgJnN2Y19mZHNldCk7CgogICAgICBmb3IgKGkgPSAwOyBpIDwgc3ZjX21heF9wb2xsZmQ7ICsraSkKCWlmIChzdmNfcG9sbGZkW2ldLmZkID09IHNvY2spCgkgIHN2Y19wb2xsZmRbaV0uZmQgPSAtMTsKICAgIH0KfQojaWZkZWYgRVhQT1JUX1JQQ19TWU1CT0xTCmxpYmNfaGlkZGVuX2RlZiAoeHBydF91bnJlZ2lzdGVyKQojZWxzZQpsaWJjX2hpZGRlbl9ub2xpbmtfc3VucnBjICh4cHJ0X3VucmVnaXN0ZXIsIEdMSUJDXzJfMCkKI2VuZGlmCgoKLyogKioqKioqKioqKioqKioqKioqKioqKiBDQUxMT1VUIGxpc3QgcmVsYXRlZCBzdHVmZiAqKioqKioqKioqKioqICovCgovKiBTZWFyY2ggdGhlIGNhbGxvdXQgbGlzdCBmb3IgYSBwcm9ncmFtIG51bWJlciwgcmV0dXJuIHRoZSBjYWxsb3V0CiAgIHN0cnVjdC4gKi8Kc3RhdGljIHN0cnVjdCBzdmNfY2FsbG91dCAqCnN2Y19maW5kIChycGNwcm9nX3QgcHJvZywgcnBjdmVyc190IHZlcnMsIHN0cnVjdCBzdmNfY2FsbG91dCAqKnByZXYpCnsKICByZWdpc3RlciBzdHJ1Y3Qgc3ZjX2NhbGxvdXQgKnMsICpwOwoKICBwID0gTlVMTF9TVkM7CiAgZm9yIChzID0gc3ZjX2hlYWQ7IHMgIT0gTlVMTF9TVkM7IHMgPSBzLT5zY19uZXh0KQogICAgewogICAgICBpZiAoKHMtPnNjX3Byb2cgPT0gcHJvZykgJiYgKHMtPnNjX3ZlcnMgPT0gdmVycykpCglnb3RvIGRvbmU7CiAgICAgIHAgPSBzOwogICAgfQpkb25lOgogICpwcmV2ID0gcDsKICByZXR1cm4gczsKfQoKCnN0YXRpYyBib29sX3QKc3ZjX2lzX21hcHBlZCAocnBjcHJvZ190IHByb2csIHJwY3ZlcnNfdCB2ZXJzKQp7CiAgc3RydWN0IHN2Y19jYWxsb3V0ICpwcmV2OwogIHJlZ2lzdGVyIHN0cnVjdCBzdmNfY2FsbG91dCAqczsKICBzID0gc3ZjX2ZpbmQgKHByb2csIHZlcnMsICZwcmV2KTsKICByZXR1cm4gcyE9IE5VTExfU1ZDICYmIHMtPnNjX21hcHBlZDsKfQoKCi8qIEFkZCBhIHNlcnZpY2UgcHJvZ3JhbSB0byB0aGUgY2FsbG91dCBsaXN0LgogICBUaGUgZGlzcGF0Y2ggcm91dGluZSB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgcnBjIHJlcXVlc3QgZm9yIHRoaXMKICAgcHJvZ3JhbSBudW1iZXIgY29tZXMgaW4uICovCmJvb2xfdApzdmNfcmVnaXN0ZXIgKFNWQ1hQUlQgKiB4cHJ0LCBycGNwcm9nX3QgcHJvZywgcnBjdmVyc190IHZlcnMsCgkgICAgICB2b2lkICgqZGlzcGF0Y2gpIChzdHJ1Y3Qgc3ZjX3JlcSAqLCBTVkNYUFJUICopLAoJICAgICAgcnBjcHJvY190IHByb3RvY29sKQp7CiAgc3RydWN0IHN2Y19jYWxsb3V0ICpwcmV2OwogIHJlZ2lzdGVyIHN0cnVjdCBzdmNfY2FsbG91dCAqczsKCiAgaWYgKChzID0gc3ZjX2ZpbmQgKHByb2csIHZlcnMsICZwcmV2KSkgIT0gTlVMTF9TVkMpCiAgICB7CiAgICAgIGlmIChzLT5zY19kaXNwYXRjaCA9PSBkaXNwYXRjaCkKCWdvdG8gcG1hcF9pdDsJCS8qIGhlIGlzIHJlZ2lzdGVyaW5nIGFub3RoZXIgeHB0ciAqLwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgcyA9IChzdHJ1Y3Qgc3ZjX2NhbGxvdXQgKikgbWVtX2FsbG9jIChzaXplb2YgKHN0cnVjdCBzdmNfY2FsbG91dCkpOwogIGlmIChzID09IChzdHJ1Y3Qgc3ZjX2NhbGxvdXQgKikgMCkKICAgIHJldHVybiBGQUxTRTsKCiAgcy0+c2NfcHJvZyA9IHByb2c7CiAgcy0+c2NfdmVycyA9IHZlcnM7CiAgcy0+c2NfZGlzcGF0Y2ggPSBkaXNwYXRjaDsKICBzLT5zY19uZXh0ID0gc3ZjX2hlYWQ7CiAgcy0+c2NfbWFwcGVkID0gRkFMU0U7CiAgc3ZjX2hlYWQgPSBzOwoKcG1hcF9pdDoKICAvKiBub3cgcmVnaXN0ZXIgdGhlIGluZm9ybWF0aW9uIHdpdGggdGhlIGxvY2FsIGJpbmRlciBzZXJ2aWNlICovCiAgaWYgKHByb3RvY29sKQogICAgewogICAgICBpZiAoISBwbWFwX3NldCAocHJvZywgdmVycywgcHJvdG9jb2wsIHhwcnQtPnhwX3BvcnQpKQoJcmV0dXJuIEZBTFNFOwoKICAgICAgcy0+c2NfbWFwcGVkID0gVFJVRTsKICAgIH0KCiAgcmV0dXJuIFRSVUU7Cn0KI2lmZGVmIEVYUE9SVF9SUENfU1lNQk9MUwpsaWJjX2hpZGRlbl9kZWYgKHN2Y19yZWdpc3RlcikKI2Vsc2UKbGliY19oaWRkZW5fbm9saW5rX3N1bnJwYyAoc3ZjX3JlZ2lzdGVyLCBHTElCQ18yXzApCiNlbmRpZgoKLyogUmVtb3ZlIGEgc2VydmljZSBwcm9ncmFtIGZyb20gdGhlIGNhbGxvdXQgbGlzdC4gKi8Kdm9pZApzdmNfdW5yZWdpc3RlciAocnBjcHJvZ190IHByb2csIHJwY3ZlcnNfdCB2ZXJzKQp7CiAgc3RydWN0IHN2Y19jYWxsb3V0ICpwcmV2OwogIHJlZ2lzdGVyIHN0cnVjdCBzdmNfY2FsbG91dCAqczsKCiAgaWYgKChzID0gc3ZjX2ZpbmQgKHByb2csIHZlcnMsICZwcmV2KSkgPT0gTlVMTF9TVkMpCiAgICByZXR1cm47CgogIGlmIChwcmV2ID09IE5VTExfU1ZDKQogICAgc3ZjX2hlYWQgPSBzLT5zY19uZXh0OwogIGVsc2UKICAgIHByZXYtPnNjX25leHQgPSBzLT5zY19uZXh0OwoKICBzLT5zY19uZXh0ID0gTlVMTF9TVkM7CiAgbWVtX2ZyZWUgKChjaGFyICopIHMsICh1X2ludCkgc2l6ZW9mIChzdHJ1Y3Qgc3ZjX2NhbGxvdXQpKTsKICAvKiBub3cgdW5yZWdpc3RlciB0aGUgaW5mb3JtYXRpb24gd2l0aCB0aGUgbG9jYWwgYmluZGVyIHNlcnZpY2UgKi8KICBpZiAoISBzdmNfaXNfbWFwcGVkIChwcm9nLCB2ZXJzKSkKICAgIHBtYXBfdW5zZXQgKHByb2csIHZlcnMpOwp9CmxpYmNfaGlkZGVuX25vbGlua19zdW5ycGMgKHN2Y191bnJlZ2lzdGVyLCBHTElCQ18yXzApCgovKiAqKioqKioqKioqKioqKioqKioqIFJFUExZIEdFTkVSQVRJT04gUk9VVElORVMgICoqKioqKioqKioqKiAqLwoKLyogU2VuZCBhIHJlcGx5IHRvIGFuIHJwYyByZXF1ZXN0ICovCmJvb2xfdApzdmNfc2VuZHJlcGx5IChyZWdpc3RlciBTVkNYUFJUICp4cHJ0LCB4ZHJwcm9jX3QgeGRyX3Jlc3VsdHMsCgkgICAgICAgY2FkZHJfdCB4ZHJfbG9jYXRpb24pCnsKICBzdHJ1Y3QgcnBjX21zZyBycGx5OwoKICBycGx5LnJtX2RpcmVjdGlvbiA9IFJFUExZOwogIHJwbHkucm1fcmVwbHkucnBfc3RhdCA9IE1TR19BQ0NFUFRFRDsKICBycGx5LmFjcHRlZF9ycGx5LmFyX3ZlcmYgPSB4cHJ0LT54cF92ZXJmOwogIHJwbHkuYWNwdGVkX3JwbHkuYXJfc3RhdCA9IFNVQ0NFU1M7CiAgcnBseS5hY3B0ZWRfcnBseS5hcl9yZXN1bHRzLndoZXJlID0geGRyX2xvY2F0aW9uOwogIHJwbHkuYWNwdGVkX3JwbHkuYXJfcmVzdWx0cy5wcm9jID0geGRyX3Jlc3VsdHM7CiAgcmV0dXJuIFNWQ19SRVBMWSAoeHBydCwgJnJwbHkpOwp9CiNpZmRlZiBFWFBPUlRfUlBDX1NZTUJPTFMKbGliY19oaWRkZW5fZGVmIChzdmNfc2VuZHJlcGx5KQojZWxzZQpsaWJjX2hpZGRlbl9ub2xpbmtfc3VucnBjIChzdmNfc2VuZHJlcGx5LCBHTElCQ18yXzApCiNlbmRpZgoKLyogTm8gcHJvY2VkdXJlIGVycm9yIHJlcGx5ICovCnZvaWQKc3ZjZXJyX25vcHJvYyAocmVnaXN0ZXIgU1ZDWFBSVCAqeHBydCkKewogIHN0cnVjdCBycGNfbXNnIHJwbHk7CgogIHJwbHkucm1fZGlyZWN0aW9uID0gUkVQTFk7CiAgcnBseS5ybV9yZXBseS5ycF9zdGF0ID0gTVNHX0FDQ0VQVEVEOwogIHJwbHkuYWNwdGVkX3JwbHkuYXJfdmVyZiA9IHhwcnQtPnhwX3ZlcmY7CiAgcnBseS5hY3B0ZWRfcnBseS5hcl9zdGF0ID0gUFJPQ19VTkFWQUlMOwogIFNWQ19SRVBMWSAoeHBydCwgJnJwbHkpOwp9CiNpZmRlZiBFWFBPUlRfUlBDX1NZTUJPTFMKbGliY19oaWRkZW5fZGVmIChzdmNlcnJfbm9wcm9jKQojZWxzZQpsaWJjX2hpZGRlbl9ub2xpbmtfc3VucnBjIChzdmNlcnJfbm9wcm9jLCBHTElCQ18yXzApCiNlbmRpZgoKLyogQ2FuJ3QgZGVjb2RlIGFyZ3MgZXJyb3IgcmVwbHkgKi8Kdm9pZApzdmNlcnJfZGVjb2RlIChyZWdpc3RlciBTVkNYUFJUICp4cHJ0KQp7CiAgc3RydWN0IHJwY19tc2cgcnBseTsKCiAgcnBseS5ybV9kaXJlY3Rpb24gPSBSRVBMWTsKICBycGx5LnJtX3JlcGx5LnJwX3N0YXQgPSBNU0dfQUNDRVBURUQ7CiAgcnBseS5hY3B0ZWRfcnBseS5hcl92ZXJmID0geHBydC0+eHBfdmVyZjsKICBycGx5LmFjcHRlZF9ycGx5LmFyX3N0YXQgPSBHQVJCQUdFX0FSR1M7CiAgU1ZDX1JFUExZICh4cHJ0LCAmcnBseSk7Cn0KI2lmZGVmIEVYUE9SVF9SUENfU1lNQk9MUwpsaWJjX2hpZGRlbl9kZWYgKHN2Y2Vycl9kZWNvZGUpCiNlbHNlCmxpYmNfaGlkZGVuX25vbGlua19zdW5ycGMgKHN2Y2Vycl9kZWNvZGUsIEdMSUJDXzJfMCkKI2VuZGlmCgovKiBTb21lIHN5c3RlbSBlcnJvciAqLwp2b2lkCnN2Y2Vycl9zeXN0ZW1lcnIgKHJlZ2lzdGVyIFNWQ1hQUlQgKnhwcnQpCnsKICBzdHJ1Y3QgcnBjX21zZyBycGx5OwoKICBycGx5LnJtX2RpcmVjdGlvbiA9IFJFUExZOwogIHJwbHkucm1fcmVwbHkucnBfc3RhdCA9IE1TR19BQ0NFUFRFRDsKICBycGx5LmFjcHRlZF9ycGx5LmFyX3ZlcmYgPSB4cHJ0LT54cF92ZXJmOwogIHJwbHkuYWNwdGVkX3JwbHkuYXJfc3RhdCA9IFNZU1RFTV9FUlI7CiAgU1ZDX1JFUExZICh4cHJ0LCAmcnBseSk7Cn0KI2lmZGVmIEVYUE9SVF9SUENfU1lNQk9MUwpsaWJjX2hpZGRlbl9kZWYgKHN2Y2Vycl9zeXN0ZW1lcnIpCiNlbHNlCmxpYmNfaGlkZGVuX25vbGlua19zdW5ycGMgKHN2Y2Vycl9zeXN0ZW1lcnIsIEdMSUJDXzJfMCkKI2VuZGlmCgovKiBBdXRoZW50aWNhdGlvbiBlcnJvciByZXBseSAqLwp2b2lkCnN2Y2Vycl9hdXRoIChTVkNYUFJUICp4cHJ0LCBlbnVtIGF1dGhfc3RhdCB3aHkpCnsKICBzdHJ1Y3QgcnBjX21zZyBycGx5OwoKICBycGx5LnJtX2RpcmVjdGlvbiA9IFJFUExZOwogIHJwbHkucm1fcmVwbHkucnBfc3RhdCA9IE1TR19ERU5JRUQ7CiAgcnBseS5yamN0ZWRfcnBseS5yal9zdGF0ID0gQVVUSF9FUlJPUjsKICBycGx5LnJqY3RlZF9ycGx5LnJqX3doeSA9IHdoeTsKICBTVkNfUkVQTFkgKHhwcnQsICZycGx5KTsKfQpsaWJjX2hpZGRlbl9ub2xpbmtfc3VucnBjIChzdmNlcnJfYXV0aCwgR0xJQkNfMl8wKQoKLyogQXV0aCB0b28gd2VhayBlcnJvciByZXBseSAqLwp2b2lkCnN2Y2Vycl93ZWFrYXV0aCAoU1ZDWFBSVCAqeHBydCkKewogIHN2Y2Vycl9hdXRoICh4cHJ0LCBBVVRIX1RPT1dFQUspOwp9CmxpYmNfaGlkZGVuX25vbGlua19zdW5ycGMgKHN2Y2Vycl93ZWFrYXV0aCwgR0xJQkNfMl8wKQoKLyogUHJvZ3JhbSB1bmF2YWlsYWJsZSBlcnJvciByZXBseSAqLwp2b2lkCnN2Y2Vycl9ub3Byb2cgKHJlZ2lzdGVyIFNWQ1hQUlQgKnhwcnQpCnsKICBzdHJ1Y3QgcnBjX21zZyBycGx5OwoKICBycGx5LnJtX2RpcmVjdGlvbiA9IFJFUExZOwogIHJwbHkucm1fcmVwbHkucnBfc3RhdCA9IE1TR19BQ0NFUFRFRDsKICBycGx5LmFjcHRlZF9ycGx5LmFyX3ZlcmYgPSB4cHJ0LT54cF92ZXJmOwogIHJwbHkuYWNwdGVkX3JwbHkuYXJfc3RhdCA9IFBST0dfVU5BVkFJTDsKICBTVkNfUkVQTFkgKHhwcnQsICZycGx5KTsKfQpsaWJjX2hpZGRlbl9ub2xpbmtfc3VucnBjIChzdmNlcnJfbm9wcm9nLCBHTElCQ18yXzApCgovKiBQcm9ncmFtIHZlcnNpb24gbWlzbWF0Y2ggZXJyb3IgcmVwbHkgKi8Kdm9pZApzdmNlcnJfcHJvZ3ZlcnMgKHJlZ2lzdGVyIFNWQ1hQUlQgKnhwcnQsIHJwY3ZlcnNfdCBsb3dfdmVycywKCQkgcnBjdmVyc190IGhpZ2hfdmVycykKewogIHN0cnVjdCBycGNfbXNnIHJwbHk7CgogIHJwbHkucm1fZGlyZWN0aW9uID0gUkVQTFk7CiAgcnBseS5ybV9yZXBseS5ycF9zdGF0ID0gTVNHX0FDQ0VQVEVEOwogIHJwbHkuYWNwdGVkX3JwbHkuYXJfdmVyZiA9IHhwcnQtPnhwX3ZlcmY7CiAgcnBseS5hY3B0ZWRfcnBseS5hcl9zdGF0ID0gUFJPR19NSVNNQVRDSDsKICBycGx5LmFjcHRlZF9ycGx5LmFyX3ZlcnMubG93ID0gbG93X3ZlcnM7CiAgcnBseS5hY3B0ZWRfcnBseS5hcl92ZXJzLmhpZ2ggPSBoaWdoX3ZlcnM7CiAgU1ZDX1JFUExZICh4cHJ0LCAmcnBseSk7Cn0KbGliY19oaWRkZW5fbm9saW5rX3N1bnJwYyAoc3ZjZXJyX3Byb2d2ZXJzLCBHTElCQ18yXzApCgovKiAqKioqKioqKioqKioqKioqKioqIFNFUlZFUiBJTlBVVCBTVFVGRiAqKioqKioqKioqKioqKioqKioqICovCgovKgogKiBHZXQgc2VydmVyIHNpZGUgaW5wdXQgZnJvbSBzb21lIHRyYW5zcG9ydC4KICoKICogU3RhdGVtZW50IG9mIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMgbWFuYWdlbWVudDoKICogVGhpcyBmdW5jdGlvbiBvd25zIGFuZCBtYW5hZ2VzIGFsbCBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzLCBzcGVjaWZpY2FsbHkKICogdGhlICJyYXciIHBhcmFtZXRlcnMgKG1zZy5ybV9jYWxsLmNiX2NyZWQgYW5kIG1zZy5ybV9jYWxsLmNiX3ZlcmYpIGFuZAogKiB0aGUgImNvb2tlZCIgY3JlZGVudGlhbHMgKHJxc3QtPnJxX2NsbnRjcmVkKS4KICogSG93ZXZlciwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBrbm93IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvb2tlZAogKiBjcmVkZW50aWFscywgc28gaXQgbWFrZSB0aGUgZm9sbG93aW5nIGFzc3VtcHRpb25zOgogKiAgIGEpIHRoZSBzdHJ1Y3R1cmUgaXMgY29udGlndW91cyAobm8gcG9pbnRlcnMpLCBhbmQKICogICBiKSB0aGUgY3JlZCBzdHJ1Y3R1cmUgc2l6ZSBkb2VzIG5vdCBleGNlZWQgUlFDUkVEX1NJWkUgYnl0ZXMuCiAqIEluIGFsbCBldmVudHMsIGFsbCB0aHJlZSBwYXJhbWV0ZXJzIGFyZSBmcmVlZCB1cG9uIGV4aXQgZnJvbSB0aGlzIHJvdXRpbmUuCiAqIFRoZSBzdG9yYWdlIGlzIHRyaXZpYWxseSBtYW5hZ2VtZW50IG9uIHRoZSBjYWxsIHN0YWNrIGluIHVzZXIgbGFuZCwgYnV0CiAqIGlzIG1hbGxvY2F0ZWQgaW4ga2VybmVsIGxhbmQuCiAqLwoKdm9pZApzdmNfZ2V0cmVxIChpbnQgcmRmZHMpCnsKICBmZF9zZXQgcmVhZGZkczsKCiAgRkRfWkVSTyAoJnJlYWRmZHMpOwogIHJlYWRmZHMuZmRzX2JpdHNbMF0gPSByZGZkczsKICBzdmNfZ2V0cmVxc2V0ICgmcmVhZGZkcyk7Cn0KbGliY19oaWRkZW5fbm9saW5rX3N1bnJwYyAoc3ZjX2dldHJlcSwgR0xJQkNfMl8wKQoKdm9pZApzdmNfZ2V0cmVxc2V0IChmZF9zZXQgKnJlYWRmZHMpCnsKICByZWdpc3RlciBmZF9tYXNrIG1hc2s7CiAgcmVnaXN0ZXIgZmRfbWFzayAqbWFza3A7CiAgcmVnaXN0ZXIgaW50IHNldHNpemU7CiAgcmVnaXN0ZXIgaW50IHNvY2s7CiAgcmVnaXN0ZXIgaW50IGJpdDsKCiAgc2V0c2l6ZSA9IF9ycGNfZHRhYmxlc2l6ZSAoKTsKICBpZiAoc2V0c2l6ZSA+IEZEX1NFVFNJWkUpCiAgICBzZXRzaXplID0gRkRfU0VUU0laRTsKICBtYXNrcCA9IHJlYWRmZHMtPmZkc19iaXRzOwogIGZvciAoc29jayA9IDA7IHNvY2sgPCBzZXRzaXplOyBzb2NrICs9IE5GREJJVFMpCiAgICBmb3IgKG1hc2sgPSAqbWFza3ArKzsgKGJpdCA9IGZmc2wgKG1hc2spKTsgbWFzayBePSAoMUwgPDwgKGJpdCAtIDEpKSkKICAgICAgc3ZjX2dldHJlcV9jb21tb24gKHNvY2sgKyBiaXQgLSAxKTsKfQpsaWJjX2hpZGRlbl9ub2xpbmtfc3VucnBjIChzdmNfZ2V0cmVxc2V0LCBHTElCQ18yXzApCgp2b2lkCnN2Y19nZXRyZXFfcG9sbCAoc3RydWN0IHBvbGxmZCAqcGZkcCwgaW50IHBvbGxyZXR2YWwpCnsKICBpZiAocG9sbHJldHZhbCA9PSAwKQogICAgcmV0dXJuOwoKICByZWdpc3RlciBpbnQgZmRzX2ZvdW5kOwogIGZvciAoaW50IGkgPSBmZHNfZm91bmQgPSAwOyBpIDwgc3ZjX21heF9wb2xsZmQ7ICsraSkKICAgIHsKICAgICAgcmVnaXN0ZXIgc3RydWN0IHBvbGxmZCAqcCA9ICZwZmRwW2ldOwoKICAgICAgaWYgKHAtPmZkICE9IC0xICYmIHAtPnJldmVudHMpCgl7CgkgIC8qIGZkIGhhcyBpbnB1dCB3YWl0aW5nICovCgkgIGlmIChwLT5yZXZlbnRzICYgUE9MTE5WQUwpCgkgICAgeHBydF91bnJlZ2lzdGVyICh4cG9ydHNbcC0+ZmRdKTsKCSAgZWxzZQoJICAgIHN2Y19nZXRyZXFfY29tbW9uIChwLT5mZCk7CgoJICBpZiAoKytmZHNfZm91bmQgPj0gcG9sbHJldHZhbCkKCSAgICBicmVhazsKCX0KICAgIH0KfQojaWZkZWYgRVhQT1JUX1JQQ19TWU1CT0xTCmxpYmNfaGlkZGVuX2RlZiAoc3ZjX2dldHJlcV9wb2xsKQojZWxzZQpsaWJjX2hpZGRlbl9ub2xpbmtfc3VucnBjIChzdmNfZ2V0cmVxX3BvbGwsIEdMSUJDXzJfMikKI2VuZGlmCgoKdm9pZApzdmNfZ2V0cmVxX2NvbW1vbiAoY29uc3QgaW50IGZkKQp7CiAgZW51bSB4cHJ0X3N0YXQgc3RhdDsKICBzdHJ1Y3QgcnBjX21zZyBtc2c7CiAgcmVnaXN0ZXIgU1ZDWFBSVCAqeHBydDsKICBjaGFyIGNyZWRfYXJlYVsyICogTUFYX0FVVEhfQllURVMgKyBSUUNSRURfU0laRV07CiAgbXNnLnJtX2NhbGwuY2JfY3JlZC5vYV9iYXNlID0gY3JlZF9hcmVhOwogIG1zZy5ybV9jYWxsLmNiX3ZlcmYub2FfYmFzZSA9ICYoY3JlZF9hcmVhW01BWF9BVVRIX0JZVEVTXSk7CgogIHhwcnQgPSB4cG9ydHNbZmRdOwogIC8qIERvIHdlIGNvbnRyb2wgZmQ/ICovCiAgaWYgKHhwcnQgPT0gTlVMTCkKICAgICByZXR1cm47CgogIC8qIG5vdyByZWNlaXZlIG1zZ3MgZnJvbSB4cHJ0cHJ0IChzdXBwb3J0IGJhdGNoIGNhbGxzKSAqLwogIGRvCiAgICB7CiAgICAgIGlmIChTVkNfUkVDViAoeHBydCwgJm1zZykpCgl7CgkgIC8qIG5vdyBmaW5kIHRoZSBleHBvcnRlZCBwcm9ncmFtIGFuZCBjYWxsIGl0ICovCgkgIHN0cnVjdCBzdmNfY2FsbG91dCAqczsKCSAgc3RydWN0IHN2Y19yZXEgcjsKCSAgZW51bSBhdXRoX3N0YXQgd2h5OwoJICBycGN2ZXJzX3QgbG93X3ZlcnM7CgkgIHJwY3ZlcnNfdCBoaWdoX3ZlcnM7CgkgIGludCBwcm9nX2ZvdW5kOwoKCSAgci5ycV9jbG50Y3JlZCA9ICYoY3JlZF9hcmVhWzIgKiBNQVhfQVVUSF9CWVRFU10pOwoJICByLnJxX3hwcnQgPSB4cHJ0OwoJICByLnJxX3Byb2cgPSBtc2cucm1fY2FsbC5jYl9wcm9nOwoJICByLnJxX3ZlcnMgPSBtc2cucm1fY2FsbC5jYl92ZXJzOwoJICByLnJxX3Byb2MgPSBtc2cucm1fY2FsbC5jYl9wcm9jOwoJICByLnJxX2NyZWQgPSBtc2cucm1fY2FsbC5jYl9jcmVkOwoKCSAgLyogZmlyc3QgYXV0aGVudGljYXRlIHRoZSBtZXNzYWdlICovCgkgIC8qIENoZWNrIGZvciBudWxsIGZsYXZvciBhbmQgYnlwYXNzIHRoZXNlIGNhbGxzIGlmIHBvc3NpYmxlICovCgoJICBpZiAobXNnLnJtX2NhbGwuY2JfY3JlZC5vYV9mbGF2b3IgPT0gQVVUSF9OVUxMKQoJICAgIHsKCSAgICAgIHIucnFfeHBydC0+eHBfdmVyZi5vYV9mbGF2b3IgPSBfbnVsbF9hdXRoLm9hX2ZsYXZvcjsKCSAgICAgIHIucnFfeHBydC0+eHBfdmVyZi5vYV9sZW5ndGggPSAwOwoJICAgIH0KCSAgZWxzZSBpZiAoKHdoeSA9IF9hdXRoZW50aWNhdGUgKCZyLCAmbXNnKSkgIT0gQVVUSF9PSykKCSAgICB7CgkgICAgICBzdmNlcnJfYXV0aCAoeHBydCwgd2h5KTsKCSAgICAgIGdvdG8gY2FsbF9kb25lOwoJICAgIH0KCgkgIC8qIG5vdyBtYXRjaCBtZXNzYWdlIHdpdGggYSByZWdpc3RlcmVkIHNlcnZpY2UgKi8KCSAgcHJvZ19mb3VuZCA9IEZBTFNFOwoJICBsb3dfdmVycyA9IDAgLSAxOwoJICBoaWdoX3ZlcnMgPSAwOwoKCSAgZm9yIChzID0gc3ZjX2hlYWQ7IHMgIT0gTlVMTF9TVkM7IHMgPSBzLT5zY19uZXh0KQoJICAgIHsKCSAgICAgIGlmIChzLT5zY19wcm9nID09IHIucnFfcHJvZykKCQl7CgkJICBpZiAocy0+c2NfdmVycyA9PSByLnJxX3ZlcnMpCgkJICAgIHsKCQkgICAgICAoKnMtPnNjX2Rpc3BhdGNoKSAoJnIsIHhwcnQpOwoJCSAgICAgIGdvdG8gY2FsbF9kb25lOwoJCSAgICB9CgkJICAvKiBmb3VuZCBjb3JyZWN0IHZlcnNpb24gKi8KCQkgIHByb2dfZm91bmQgPSBUUlVFOwoJCSAgaWYgKHMtPnNjX3ZlcnMgPCBsb3dfdmVycykKCQkgICAgbG93X3ZlcnMgPSBzLT5zY192ZXJzOwoJCSAgaWYgKHMtPnNjX3ZlcnMgPiBoaWdoX3ZlcnMpCgkJICAgIGhpZ2hfdmVycyA9IHMtPnNjX3ZlcnM7CgkJfQoJICAgICAgLyogZm91bmQgY29ycmVjdCBwcm9ncmFtICovCgkgICAgfQoJICAvKiBpZiB3ZSBnb3QgaGVyZSwgdGhlIHByb2dyYW0gb3IgdmVyc2lvbgoJICAgICBpcyBub3Qgc2VydmVkIC4uLiAqLwoJICBpZiAocHJvZ19mb3VuZCkKCSAgICBzdmNlcnJfcHJvZ3ZlcnMgKHhwcnQsIGxvd192ZXJzLCBoaWdoX3ZlcnMpOwoJICBlbHNlCgkgICAgc3ZjZXJyX25vcHJvZyAoeHBydCk7CgkgIC8qIEZhbGwgdGhyb3VnaCB0byAuLi4gKi8KCX0KICAgIGNhbGxfZG9uZToKICAgICAgaWYgKChzdGF0ID0gU1ZDX1NUQVQgKHhwcnQpKSA9PSBYUFJUX0RJRUQpCgl7CgkgIFNWQ19ERVNUUk9ZICh4cHJ0KTsKCSAgYnJlYWs7Cgl9CiAgICB9CiAgd2hpbGUgKHN0YXQgPT0gWFBSVF9NT1JFUkVRUyk7Cn0KbGliY19oaWRkZW5fbm9saW5rX3N1bnJwYyAoc3ZjX2dldHJlcV9jb21tb24sIEdMSUJDXzJfMikKCi8qIElmIHRoZXJlIGFyZSBubyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZSwgdGhlbiBhY2NlcHQgd2lsbCBmYWlsLgogICBXZSB3YW50IHRvIGRlbGF5IGhlcmUgc28gdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBjYW4gYmUgZGVxdWV1ZWQ7CiAgIG90aGVyd2lzZSB3ZSBjYW4gYm91bmNlIGJldHdlZW4gcG9sbGluZyBhbmQgYWNjZXB0aW5nLCBuZXZlciBnaXZpbmcgdGhlCiAgIHJlcXVlc3QgYSBjaGFuY2UgdG8gZGVxdWV1ZSBhbmQgZWF0aW5nIGFuIGVub3Jtb3VzIGFtb3VudCBvZiBjcHUgdGltZQogICBpbiBzdmNfcnVuIGlmIHdlJ3JlIHBvbGxpbmcgb24gbWFueSBmaWxlIGRlc2NyaXB0b3JzLiAgKi8Kdm9pZApfX3N2Y19hY2NlcHRfZmFpbGVkICh2b2lkKQp7CiAgaWYgKGVycm5vID09IEVNRklMRSkKICAgIHsKICAgICAgc3RydWN0IHRpbWVzcGVjIHRzID0geyAudHZfc2VjID0gMCwgLnR2X25zZWMgPSA1MDAwMDAwMCB9OwogICAgICBfX25hbm9zbGVlcCAoJnRzLCBOVUxMKTsKICAgIH0KfQoKI2lmZGVmIF9SUENfVEhSRUFEX1NBRkVfCgp2b2lkCl9fcnBjX3RocmVhZF9zdmNfY2xlYW51cCAodm9pZCkKewogIHN0cnVjdCBzdmNfY2FsbG91dCAqc3ZjcDsKCiAgd2hpbGUgKChzdmNwID0gc3ZjX2hlYWQpICE9IE5VTEwpCiAgICBzdmNfdW5yZWdpc3RlciAoc3ZjcC0+c2NfcHJvZywgc3ZjcC0+c2NfdmVycyk7Cn0KCiNlbmRpZiAvKiBfUlBDX1RIUkVBRF9TQUZFXyAqLwo=