LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpDb3B5cmlnaHQgKGMpIDIwMDksIFFVQUxDT01NIFVTQSwgSU5DLgoKQWxsIHJpZ2h0cyByZXNlcnZlZC4KClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKCrcgICAgICAgICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAoKtyAgICAgICAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCgq3ICAgICAgICAgTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUVVBTENPTU0gVVNBLCBJTkMuICBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLyAKI2luY2x1ZGUgInJwYy9ycGMuaCIKI2luY2x1ZGUgImxvY19hcGlfY29tbW9uLmgiCiNpbmNsdWRlICJsb2NfYXBpLmgiCiNpbmNsdWRlICJsb2NfYXBpX2NiLmgiCiNpbmNsdWRlICJsb2NfYXBpX2ZpeHVwLmgiCgojaW5jbHVkZSAibG9jX2FwaWNiX2FwcGluaXQuaCIKCiNkZWZpbmUgUlBDX0ZVTkNfVkVSU0lPTl9CQVNFKGEsYikgYSAjIyBiCiNkZWZpbmUgUlBDX0NCX0ZVTkNfVkVSUyhhLGIpIFJQQ19GVU5DX1ZFUlNJT05fQkFTRShhLGIpCgpzdGF0aWMgU1ZDWFBSVCogc3ZyUG9ydCA9IE5VTEw7CgpleHRlcm4gdm9pZCBSUENfQ0JfRlVOQ19WRVJTKGxvY19hcGljYnByb2dfLExPQ19BUElDQlZFUlNfMDAwMSkoc3RydWN0IHN2Y19yZXEgKnJxc3RwLCByZWdpc3RlciBTVkNYUFJUICp0cmFuc3ApOwoKaW50IGxvY19hcGljYl9hcHBfaW5pdCh2b2lkKQp7CiAgICAvKiBSZWdpc3RlciBhIGNhbGxiYWNrIHNlcnZlciB0byB1c2UgdGhlIGxvY19hcGljYnByb2dfKiBmdW5jdGlvbiAgKi8KICAgIGlmIChzdnJQb3J0ID09IE5VTEwpIHsKICAgICAgICBzdnJQb3J0ID0gc3ZjcnRyX2NyZWF0ZSgpOwogICAgfQogICAgaWYgKCFzdnJQb3J0KSByZXR1cm4gLTE7CgogICAgeHBydF9yZWdpc3RlcihzdnJQb3J0KTsKICAgIGlmKHN2Y19yZWdpc3RlcihzdnJQb3J0LCBMT0NfQVBJQ0JQUk9HLCBMT0NfQVBJQ0JWRVJTXzAwMDEsIFJQQ19DQl9GVU5DX1ZFUlMobG9jX2FwaWNicHJvZ18sTE9DX0FQSUNCVkVSU18wMDAxKSwwKSkKICAgIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn0KCnZvaWQgbG9jX2FwaWNiX2FwcF9kZWluaXQodm9pZCkKewogICAgaWYgKHN2clBvcnQgPT0gTlVMTCkKICAgIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICB4cHJ0X3VucmVnaXN0ZXIoc3ZyUG9ydCk7CiAgICBzdmNfZGVzdHJveShzdnJQb3J0KTsKICAgIC8vc3ZjX3VucmVnaXN0ZXIoc3ZyUG9ydCwgTE9DX0FQSUNCUFJPRywgTE9DX0FQSUNCVkVSU18wMDAxKTsKICAgIHN2clBvcnQgPSBOVUxMOwp9Cg==