LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vDQovL7LOvPsgTFBBvdO/2s7EtbVWMC4xIFNHUC4yMiwgt7W72EFQRFUNCi8vICAgDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaW5jbHVkZSA8c3RkaW8uaD4NCiNpbmNsdWRlIDxzdGRsaWIuaD4NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCiNpbmNsdWRlIDxjdHlwZS5oPg0KI2luY2x1ZGUgPHN5cy90aW1lLmg+DQojaW5jbHVkZSA8dGltZS5oPg0KI2luY2x1ZGUgPHRlcm1pb3MuaD4NCg0KI2luY2x1ZGUgImxwYV9pbm5lci5oIg0KDQojZGVmaW5lIExQQV9UUklHR0VSX0RBVEFfTEVOIDUxMg0KI2RlZmluZSBUUklHR0VSX0hUVFBfUkVRX0xFTiA1MTINCiNkZWZpbmUgVFJJR0dFUl9IVFRQX1JFU1BfTEVOIDUxMg0KDQojZGVmaW5lIEhBU0hfU0laRSAxNg0KI2RlZmluZSBIQVNIX0hFWF9TSVpFIDMzDQoNCiNkZWZpbmUgTUFYX1RJTUVfTEVOIDI0DQoNCiNkZWZpbmUgTUFYX0FQUElEX0xFTiA2NQ0KI2RlZmluZSBNQVhfVVJMX0xFTiAxMjkNCg0KaW50IGdfY2hhbl9pZCA9IDA7IC8vbG9naWNhbCBjaGFubmVsDQpzdGF0aWMgaW50IGdfb3Blbl9jaGFubmVsX2ZsYWcgPSAwOw0KDQpleHRlcm4gY2hhciBjdXJlbnRfaWNjaWRbSUNDSURfTEVOKzFdOw0KDQovL3VzZSBudg0KLy8jZGVmaW5lIEFQUElEICJPOFhUY1ZrWjhMNFJEdjFWIg0KLy8jZGVmaW5lIEFQUFNFQ1JFVCAiV05iSFFsUlY5SktlcXBWV1N1clFXWkxYd0RzNVQ5RGwiDQovLyNkZWZpbmUgVFJJR0dFUl9QT1JUIDYxNjIyDQovLyNkZWZpbmUgVFJJR0dFUl9IT1NUICJzZXJ2aWNlcGxhdGZvcm10LmVzaW0uY2hpbmF1bmljb20uY24iDQovLyNkZWZpbmUgVFJJR0dFUl9FVkVOVF9VUkwgIi9lc2ltX3VuaV9wbHVzX3NlcnZlci9hcGkvZXZlbnQiDQovLyNkZWZpbmUgVFJJR0dFUl9VUERBVEFfVVJMICIvZXNpbV91bmlfcGx1c19zZXJ2ZXIvYXBpL3VwZGF0YSINCg0KDQovL7Slt6K3/s7xxvdodHRwx+vH8w0Kc3RhdGljIGNoYXIgdHJpZ2dlcl9odHRwc19yZXFbXSA9DQogICAgIlBPU1QgJXMgSFRUUC8xLjFcclxuIg0KICAgICJIb3N0OiAlc1xyXG4iDQogICAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxyXG4iDQogICAgIkNvbnRlbnQtTGVuZ3RoOiAlZFxyXG4iDQogICAgIkFjY2VwdDogKi8qXHJcbiINCiAgICAiXHJcbiVzXHJcbiI7DQoNCnN0YXRpYyBjaGFyIHRyaWdnZXJfaHR0cHNfZXZlbnRbXSA9DQoieyINCgkiXCJIRUFEXCI6IHsiDQoJCSJcIkFQUElEXCI6IFwiJXNcIiwiDQoJCSJcIlRJTUVcIjogXCIlc1wiLCINCgkJIlwiVFJBTlNJRFwiOiBcIiVzXCIsIg0KCQkiXCJUT0tFTlwiOiBcIiVzXCIiDQoJIn0sIg0KCSJcIkJPRFlcIjogeyINCgkJIlwiRUlEXCI6IFwiJXNcIiwiDQoJCSJcIklNRUlcIjogXCIlc1wiIg0KCSJ9Ig0KIn0iOw0KDQpzdGF0aWMgY2hhciB0cmlnZ2VyX2h0dHBzX3VwZGF0YVtdID0NCiJ7Ig0KCSJcIkhFQURcIjogeyINCgkJIlwiQVBQSURcIjogXCIlc1wiLCINCgkJIlwiVElNRVwiOiBcIiVzXCIsIg0KCQkiXCJUUkFOU0lEXCI6IFwiJXNcIiwiDQoJCSJcIlRPS0VOXCI6IFwiJXNcIiINCgkifSwiDQoJIlwiQk9EWVwiOiB7Ig0KCQkiXCJFSURcIjogXCIlc1wiLCINCgkJIlwiSU1FSVwiOiBcIiVzXCIsIg0KCQkiXCJFWEVDX1JFU1VMVFwiOiAlZCwiDQoJCSJcIkVYRUNfUkVBU09OXCI6IFwiJXNcIiwiDQoJCSJcIkRBVEFfSU5GT1wiOiBbJXNdIg0KCSJ9Ig0KIn0iOw0KDQoNCmNoYXIgZ19pbWVpW01BWF9JTUVJX0xFTl0gPSB7MH07DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovLw0KLy9pbWVpDQovLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyBpbnQgbHBhX2dldF9pbWVpKGNoYXIgKmltZWksIGludCBzaXplKQ0Kew0KCWludCByZXQgPSAtMTsNCgljaGFyIHRfaW1laVtNQVhfSU1FSV9MRU5dID0gezB9Ow0KCXZvaWQgKnAyW10gPSB7dF9pbWVpfTsNCg0KCXNjX2NmZ19nZXQgKCJpbWVpIiwgaW1laSwgc2l6ZSk7DQoJaWYgKHN0cmxlbihpbWVpKSA8IDE1KSB7DQoJCXJldCA9IGdldF9tb2RlbV9pbmZvKCJBVCtDR1NOXHJcbiIsICIlcyIsIHAyKTsNCgkJaWYocmV0ID09IDApIHsNCgkJCXNucHJpbnRmKGltZWksIHNpemUsICIlcyIsIHRfaW1laSk7DQoJCX0NCgkJcmV0dXJuIHJldDsNCgl9DQoNCglyZXR1cm4gMDsNCn0NCg0Kc3RhdGljIGludCBscGFfZ2V0X2ljY2lkKGNoYXIgKmljY2lkLCBpbnQgc2l6ZSkNCnsNCglpbnQgcmV0ID0gLTE7DQoJY2hhciB0X2ljY2lkW0lDQ0lEX0xFTisxXSA9IHswfTsNCgl2b2lkICpwMltdID0ge3RfaWNjaWR9Ow0KDQoNCglyZXQgPSBnZXRfbW9kZW1faW5mbygiQVQrWklDQ0lEP1xyXG4iLCAiJXMiLCBwMik7DQoJaWYocmV0ID09IDApIHsNCgkJc25wcmludGYoaWNjaWQsIHNpemUsICIlcyIsIHRfaWNjaWQpOw0KCX0NCglyZXR1cm4gcmV0Ow0KDQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovLw0KLy90aW1lDQovLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyBpbnQgbHBhX2dldF90aW1lKGNoYXIgKnRpbWUsIGludCBzaXplKQ0Kew0KCXN0cnVjdCB0bSBwdG0gPSB7MH07CQ0KCXN0cnVjdCB0aW1ldmFsIG5vd190aW1lID0gezB9Ow0KCQ0KCWdldHRpbWVvZmRheSgmbm93X3RpbWUsIE5VTEwpOw0KCWxvY2FsdGltZV9yKCZub3dfdGltZS50dl9zZWMsICZwdG0pOw0KDQoJc25wcmludGYodGltZSwgc2l6ZSwgIiVkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCAlMDNkIiwgDQoJCXB0bS50bV95ZWFyICsgMTkwMCwgcHRtLnRtX21vbiArIDEsIHB0bS50bV9tZGF5LCBwdG0udG1faG91ciwgcHRtLnRtX21pbiwgcHRtLnRtX3NlYywgbm93X3RpbWUudHZfdXNlYy8xMDAwKTsNCgkNCgkvL3ByaW50ZigibHBhX2dldF90aW1lOiAlc1xuIiwgdGltZSk7DQoJcmV0dXJuIDA7DQp9DQoNCnN0YXRpYyBpbnQgbHBhX2dldF90cmFuc2lkKGNoYXIgKnRyYW5zaWQsIGludCBzaXplLCBjaGFyICppbWVpKQ0Kew0KCXN0cnVjdCB0bSBwdG0gPSB7MH07CQ0KCXN0cnVjdCB0aW1ldmFsIG5vd190aW1lID0gezB9Ow0KCQ0KCWdldHRpbWVvZmRheSgmbm93X3RpbWUsIE5VTEwpOw0KCWxvY2FsdGltZV9yKCZub3dfdGltZS50dl9zZWMsICZwdG0pOw0KDQoJc25wcmludGYodHJhbnNpZCwgc2l6ZSwgIiVzJTA0ZCUwMmQlMDJkJTAyZCUwMmQlMDJkJTAzZCIsIA0KCQlpbWVpLCBwdG0udG1feWVhciArIDE5MDAsIHB0bS50bV9tb24gKyAxLCBwdG0udG1fbWRheSwgcHRtLnRtX2hvdXIsIHB0bS50bV9taW4sIHB0bS50bV9zZWMsIG5vd190aW1lLnR2X3VzZWMvMTAwMCk7DQoJDQoJLy9wcmludGYoImxwYV9nZXRfdHJhbnNpZDogJXNcbiIsIHRyYW5zaWQpOw0KCXJldHVybiAwOw0KfQ0KDQovLzAgZmFpbCAxIHN1Y2MNCnN0YXRpYyBpbnQgbHBhX2dldF9leGVyZXMoY2hhciAqZXhlX3JlYXNvbiwgaW50IGxlbikNCnsJDQoJc2NfY2ZnX2dldCgibHBhX2xhc3RfcmVzIiwgZXhlX3JlYXNvbiwgbGVuKTsNCglpZiAoMCA9PSBzdHJjbXAoZXhlX3JlYXNvbiwic3VjY2VzcyIpKQ0KCQlyZXR1cm4gMTsNCg0KCXJldHVybiAwOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy8NCi8vDQovLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyBjaGFyICpscGFfZ2V0X3RyaWdnZXJfZGF0YSh2b2lkKQ0Kew0KCWludCByZXQgPSAtMTsNCgkvL2NoYXIgaW1laVtNQVhfSU1FSV9MRU5dID0gezB9Ow0KCWNoYXIgdGltZVtNQVhfVElNRV9MRU5dID0gezB9Ow0KCWNoYXIgdHJhbnNpZFtNQVhfVFJBTlNJRF9MRU5dID0gezB9Ow0KCWNoYXIgKmVpZCA9IE5VTEw7DQoJbHBhX01ENV9DVFggbWQ1Y3R4ID0gezB9Ow0KCXVuc2lnbmVkIGNoYXIgaGFzaFtIQVNIX1NJWkVdID0gezB9Ow0KCWNoYXIgdG9rZW5bSEFTSF9IRVhfU0laRV0gPSB7MH07DQoJY2hhciAqanNfZGF0YSA9IE5VTEw7DQoJY2hhciBhcHBpZFtNQVhfQVBQSURfTEVOXSA9IHswfTsNCgljaGFyIGFwcHNlY3JldFtNQVhfQVBQSURfTEVOXSA9IHswfTsNCg0KCXNjX2NmZ19nZXQoImxwYV9hcHBpZCIsIGFwcGlkLCBzaXplb2YoYXBwaWQpKTsNCglzY19jZmdfZ2V0KCJscGFfYXBwc2VjcmV0IiwgYXBwc2VjcmV0LCBzaXplb2YoYXBwc2VjcmV0KSk7DQoNCglscGFfZ2V0X3RpbWUodGltZSwgc2l6ZW9mKHRpbWUpKTsNCglscGFfZ2V0X3RyYW5zaWQodHJhbnNpZCwgc2l6ZW9mKHRyYW5zaWQpLCBnX2ltZWkpOw0KDQoJbHBhX01ENV9Jbml0KCZtZDVjdHgpOw0KCWxwYV9NRDVfVXBkYXRlKCZtZDVjdHgsIGFwcGlkLCBzdHJsZW4oYXBwaWQpKTsJDQoJbHBhX01ENV9VcGRhdGUoJm1kNWN0eCwgdHJhbnNpZCwgc3RybGVuKHRyYW5zaWQpKTsNCglscGFfTUQ1X1VwZGF0ZSgmbWQ1Y3R4LCB0aW1lLCBzdHJsZW4odGltZSkpOw0KCWxwYV9NRDVfVXBkYXRlKCZtZDVjdHgsIGFwcHNlY3JldCwgc3RybGVuKGFwcHNlY3JldCkpOw0KCWxwYV9NRDVfRmluYWwoaGFzaCwgJm1kNWN0eCk7DQoJLy90b2tlbiBsb3dlciBjYXNlDQoJYnl0ZXMyc3RyaW5nX2xvd2VyKGhhc2gsIHRva2VuLCBzaXplb2YoaGFzaCkpOw0KDQoJZWlkID0gR2V0RUlEKCk7DQoJaWYgKGVpZCA9PSBOVUxMKSB7DQoJCXJldHVybiBOVUxMOw0KCX0NCglqc19kYXRhID0gbWFsbG9jKExQQV9UUklHR0VSX0RBVEFfTEVOKTsNCglpZiAoanNfZGF0YSAhPSBOVUxMKSB7DQoJCW1lbXNldChqc19kYXRhLCAwLCBMUEFfVFJJR0dFUl9EQVRBX0xFTik7DQoJCXNucHJpbnRmKGpzX2RhdGEsIExQQV9UUklHR0VSX0RBVEFfTEVOLCB0cmlnZ2VyX2h0dHBzX2V2ZW50LCANCgkJCWFwcGlkLCB0aW1lLCB0cmFuc2lkLCB0b2tlbiwgZWlkLCBnX2ltZWkpOw0KCQkvL3ByaW50ZigidHJpZ2dlciBqc29uOi0lcy1cbiIsIGpzX2RhdGEpOw0KCX0NCg0KCWZyZWUoZWlkKTsNCglyZXR1cm4ganNfZGF0YTsNCn0NCg0Kc3RhdGljIGNoYXIgKmxwYV9nZXRfdXBkYXRhX2RhdGEodm9pZCkNCnsNCglpbnQgcmV0ID0gLTE7DQoJLy9jaGFyIGltZWlbTUFYX0lNRUlfTEVOXSA9IHswfTsNCgljaGFyIHRpbWVbTUFYX1RJTUVfTEVOXSA9IHswfTsNCgljaGFyIHRyYW5zaWRbTUFYX1RSQU5TSURfTEVOXSA9IHswfTsNCgljaGFyICplaWQgPSBOVUxMOw0KCWxwYV9NRDVfQ1RYIG1kNWN0eCA9IHswfTsNCgl1bnNpZ25lZCBjaGFyIGhhc2hbSEFTSF9TSVpFXSA9IHswfTsNCgljaGFyIHRva2VuW0hBU0hfSEVYX1NJWkVdID0gezB9Ow0KCWNoYXIgKmpzX2RhdGEgPSBOVUxMOw0KCWNoYXIgZXhlX3JlYXNvblsyMDBdID0gezB9Ow0KCWludCBleGVfcmVzID0gMDsNCgljaGFyICpwcm9fbGlzdCA9IE5VTEw7DQoJY2hhciBhcHBpZFtNQVhfQVBQSURfTEVOXSA9IHswfTsNCgljaGFyIGFwcHNlY3JldFtNQVhfQVBQSURfTEVOXSA9IHswfTsNCgkNCglzY19jZmdfZ2V0KCJscGFfYXBwaWQiLCBhcHBpZCwgc2l6ZW9mKGFwcGlkKSk7DQoJc2NfY2ZnX2dldCgibHBhX2FwcHNlY3JldCIsIGFwcHNlY3JldCwgc2l6ZW9mKGFwcHNlY3JldCkpOw0KDQoJbHBhX2dldF90aW1lKHRpbWUsIHNpemVvZih0aW1lKSk7DQoJbHBhX2dldF90cmFuc2lkKHRyYW5zaWQsIHNpemVvZih0cmFuc2lkKSwgZ19pbWVpKTsNCg0KCWxwYV9NRDVfSW5pdCgmbWQ1Y3R4KTsNCglscGFfTUQ1X1VwZGF0ZSgmbWQ1Y3R4LCBhcHBpZCwgc3RybGVuKGFwcGlkKSk7CQ0KCWxwYV9NRDVfVXBkYXRlKCZtZDVjdHgsIHRyYW5zaWQsIHN0cmxlbih0cmFuc2lkKSk7DQoJbHBhX01ENV9VcGRhdGUoJm1kNWN0eCwgdGltZSwgc3RybGVuKHRpbWUpKTsNCglscGFfTUQ1X1VwZGF0ZSgmbWQ1Y3R4LCBhcHBzZWNyZXQsIHN0cmxlbihhcHBzZWNyZXQpKTsNCglscGFfTUQ1X0ZpbmFsKGhhc2gsICZtZDVjdHgpOw0KCS8vdG9rZW4gbG93ZXIgY2FzZQ0KCWJ5dGVzMnN0cmluZ19sb3dlcihoYXNoLCB0b2tlbiwgc2l6ZW9mKGhhc2gpKTsNCg0KCWVpZCA9IEdldEVJRCgpOw0KCWlmIChlaWQgPT0gTlVMTCkgew0KCQlyZXR1cm4gTlVMTDsNCgl9DQoJDQoJZXhlX3JlcyA9IGxwYV9nZXRfZXhlcmVzKGV4ZV9yZWFzb24sIHNpemVvZihleGVfcmVhc29uKSk7DQoJDQoJZ2V0UHJvZmlsZUxpc3QoJnByb19saXN0KTsNCg0KCWpzX2RhdGEgPSBtYWxsb2MoTFBBX1RSSUdHRVJfREFUQV9MRU4pOw0KCWlmIChqc19kYXRhICE9IE5VTEwpIHsNCgkJbWVtc2V0KGpzX2RhdGEsIDAsIExQQV9UUklHR0VSX0RBVEFfTEVOKTsNCgkJaWYgKHByb19saXN0ICE9IE5VTEwpIHsNCgkJCXNucHJpbnRmKGpzX2RhdGEsIExQQV9UUklHR0VSX0RBVEFfTEVOLCB0cmlnZ2VyX2h0dHBzX3VwZGF0YSwgDQoJCQkJYXBwaWQsIHRpbWUsIHRyYW5zaWQsIHRva2VuLCBlaWQsIGdfaW1laSwgZXhlX3JlcywgZXhlX3JlYXNvbiwgcHJvX2xpc3QpOw0KCQl9DQoJCWVsc2UgIHsNCgkJCXNucHJpbnRmKGpzX2RhdGEsIExQQV9UUklHR0VSX0RBVEFfTEVOLCB0cmlnZ2VyX2h0dHBzX3VwZGF0YSwgDQoJCQkJYXBwaWQsIHRpbWUsIHRyYW5zaWQsIHRva2VuLCBlaWQsIGdfaW1laSwgZXhlX3JlcywgZXhlX3JlYXNvbiwgIiIpOw0KCQl9DQoJCS8vcHJpbnRmKCJ0cmlnZ2VyIGpzb246LSVzLVxuIiwganNfZGF0YSk7DQoJfQ0KDQoJaWYgKHByb19saXN0ICE9IE5VTEwpDQoJCWZyZWUocHJvX2xpc3QpOw0KCWZyZWUoZWlkKTsNCglyZXR1cm4ganNfZGF0YTsNCn0NCg0Kc3RhdGljIGludCBscGFfZ2V0X3Byb2ZpbGVfc3RhdGUoY2hhciAqaWNjaWQpDQp7DQogICAgY2hhciAqYXBkdSA9IE5VTEw7DQoJY2hhciAqc3RhdGUgPSBOVUxMOw0KCWludCBzdGF0dXMgPSAwOw0KCQ0KCWFwZHUgPSBHZXRQcm9maWxlc0luZm8oaWNjaWQpOw0KCWlmIChhcGR1ID09IE5VTEwpDQoJCXJldHVybiAtMTsNCg0KCQ0KCXN0YXRlID0gbHBhX3RhZ19hcGR1X2Zyb21fYXRyZXNwKGFwZHUsIDB4OUY3MCk7DQoJaWYgKHN0YXRlID09IE5VTEwpIHsNCgkJZnJlZShhcGR1KTsNCgkJcmV0dXJuIC0xOw0KCX0NCgllcnJubyA9IDA7DQoJc3RhdHVzID0gc3RydG9sKHN0YXRlLCBOVUxMLCAxNik7DQoJaWYgKGVycm5vID09IEVSQU5HRSkvLyBrdyBFUlJOTy5OT1RfQ0hFQ0tFRA0KCXsNCgkJcHJpbnRmKCJzdHJ0b2wgZXJybm8gJWQ6ICVzXG4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsNCgl9DQoJZnJlZShzdGF0ZSk7DQoJZnJlZShhcGR1KTsNCglyZXR1cm4gc3RhdHVzOw0KfQ0KDQovL7Wxx7BpY2NpZMrHt/HOqryku+7XtMystcRwcm9maWxlDQpzdGF0aWMgaW50IGxwYV9nZXRfY3VyX2ljY2lkX3N0YXRlKHZvaWQpDQp7DQoJY2hhciBjdXJfaWNjaWRbSUNDSURfTEVOKzFdID0gezB9Ow0KCQ0KCWxwYV9nZXRfaWNjaWQoY3VyX2ljY2lkLCBzaXplb2YoY3VyX2ljY2lkKSk7DQoJbHBhX3RyYW5zX2ljY2lkKGN1cl9pY2NpZCwgc3RybGVuKGN1cl9pY2NpZCkpOw0KCWlmIChzdHJsZW4oY3VyX2ljY2lkKSA9PSBJQ0NJRF9MRU4pIHsNCgkJcmV0dXJuIGxwYV9nZXRfcHJvZmlsZV9zdGF0ZShjdXJfaWNjaWQpOw0KCX0NCg0KCXJldHVybiAtMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vDQovLw0KLy8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgY2hhciAqbHBhX3BhcnNlX3RyaWdnZXJfcmVzcChjaGFyICpzcmNTdHIsIGludCAqbmV4dF9zdGVwKQ0Kew0KCWNKU09OICpyb290ID0gTlVMTDsNCgljSlNPTiAqb2JqZWN0ID0gTlVMTDsNCgljSlNPTiAqb2JqZWN0MiA9IE5VTEw7DQoJY0pTT04gKmFycmF5ID0gTlVMTDsNCgljaGFyICphY2NvZGVfYXBkdSA9IE5VTEw7DQoNCglyb290ID0gY0pTT05fUGFyc2Uoc3JjU3RyKTsNCglpZiAocm9vdCA9PSBOVUxMKSB7DQoJCXByaW50Zigicm9vdCA9PSBOVUxMXG4iKTsNCgkJcmV0dXJuIE5VTEw7DQoJfQ0KDQoJb2JqZWN0ID0gY0pTT05fR2V0T2JqZWN0SXRlbShyb290LCAiQk9EWSIpOw0KCWlmIChvYmplY3QgPT0gTlVMTCkgew0KCQlwcmludGYoIkJPRFkgbm90IGZpbmRcbiIpOw0KCQljSlNPTl9EZWxldGUocm9vdCk7DQoJCXJldHVybiBOVUxMOw0KCX0NCg0KCW9iamVjdDIgPSBjSlNPTl9HZXRPYmplY3RJdGVtKG9iamVjdCwgIk5FWFRfU1RFUCIpOw0KCWlmIChvYmplY3QyID09IE5VTEwpIHsNCgkJcHJpbnRmKCJORVhUX1NURVAgbm90IGZpbmRcbiIpOw0KCQljSlNPTl9EZWxldGUocm9vdCk7DQoJCXJldHVybiBOVUxMOw0KCX0NCglwcmludGYoIk5FWFRfU1RFUDolZFxuIiwgb2JqZWN0Mi0+dmFsdWVpbnQpOw0KCSpuZXh0X3N0ZXAgPSBvYmplY3QyLT52YWx1ZWludDsNCglpZiAob2JqZWN0Mi0+dmFsdWVpbnQgPT0gMiB8fCBvYmplY3QyLT52YWx1ZWludCA9PSAzDQoJCXx8IG9iamVjdDItPnZhbHVlaW50ID09IDQpIHsNCgkJb2JqZWN0MiA9IGNKU09OX0dldE9iamVjdEl0ZW0ob2JqZWN0LCAiSUNDSUQiKTsNCgkJaWYgKG9iamVjdDIgPT0gTlVMTCkgew0KCQkJcHJpbnRmKCJJQ0NJRCBub3QgZmluZFxuIik7DQoJCQljSlNPTl9EZWxldGUocm9vdCk7DQoJCQlyZXR1cm4gTlVMTDsNCgkJfQ0KCQlwcmludGYoIklDQ0lEOiVzXG4iLCBvYmplY3QyLT52YWx1ZXN0cmluZyk7DQoNCgkJYWNjb2RlX2FwZHUgPSBtYWxsb2MoQVBEVV9SRVNQX0xFTik7DQoJCWlmIChhY2NvZGVfYXBkdSAhPSBOVUxMKSB7DQoJCQltZW1zZXQoYWNjb2RlX2FwZHUsIDAsIEFQRFVfUkVTUF9MRU4pOw0KCQkJc3RybmNweShhY2NvZGVfYXBkdSwgb2JqZWN0Mi0+dmFsdWVzdHJpbmcsIEFQRFVfUkVTUF9MRU4tMSk7DQoJCQlscGFfdHJhbnNfaWNjaWQoYWNjb2RlX2FwZHUsIHN0cmxlbihhY2NvZGVfYXBkdSkpOw0KCQkJcHJpbnRmKCJJQ0NJRC1UcmFuczotJXMtXG4iLCBhY2NvZGVfYXBkdSk7DQoJCX0JDQoJfQ0KCWVsc2UgaWYgKG9iamVjdDItPnZhbHVlaW50ID09IDEpIHsNCgkJb2JqZWN0MiA9IGNKU09OX0dldE9iamVjdEl0ZW0ob2JqZWN0LCAiQ09NTUFORCIpOw0KCQlpZiAob2JqZWN0MiA9PSBOVUxMKSB7DQoJCQlwcmludGYoIkNPTU1BTkQgbm90IGZpbmRcbiIpOw0KCQkJY0pTT05fRGVsZXRlKHJvb3QpOw0KCQkJcmV0dXJuIE5VTEw7DQoJCX0NCgkJYXJyYXkgPSBjSlNPTl9HZXRBcnJheUl0ZW0ob2JqZWN0MiwgMCk7DQoJCWlmIChhcnJheSA9PSBOVUxMKSB7DQoJCQlwcmludGYoIkNPTU1BTkQgbm8gaXRlbVxuIik7DQoJCQljSlNPTl9EZWxldGUocm9vdCk7DQoJCQlyZXR1cm4gTlVMTDsNCgkJfQ0KCQlwcmludGYoIkNPTU1BTkQ6JXNcbiIsIGFycmF5LT52YWx1ZXN0cmluZyk7DQoNCgkJYWNjb2RlX2FwZHUgPSBtYWxsb2MoQVBEVV9SRVNQX0xFTik7DQoJCWlmIChhY2NvZGVfYXBkdSAhPSBOVUxMKSB7DQoJCQltZW1zZXQoYWNjb2RlX2FwZHUsIDAsIEFQRFVfUkVTUF9MRU4pOw0KCQkJc3RybmNweShhY2NvZGVfYXBkdSwgYXJyYXktPnZhbHVlc3RyaW5nLCBBUERVX1JFU1BfTEVOLTEpOw0KCQkJcHJpbnRmKCJhY2NvZGUgb3IgYXBkdTotJXMtXG4iLCBhY2NvZGVfYXBkdSk7DQoJCX0NCgl9DQoJY0pTT05fRGVsZXRlKHJvb3QpOw0KCXJldHVybiBhY2NvZGVfYXBkdTsNCn0NCg0Kc3RhdGljIGNoYXIgKmxwYV9wYXJzZV91cGRhdGFfcmVzcChjaGFyICpzcmNTdHIpDQp7DQoJY0pTT04gKnJvb3QgPSBOVUxMOw0KCWNKU09OICpvYmplY3QgPSBOVUxMOw0KCWNKU09OICpvYmplY3QyID0gTlVMTDsNCgljSlNPTiAqYXJyYXkgPSBOVUxMOw0KCWNoYXIgKmNvZGUgPSBOVUxMOw0KDQoJcm9vdCA9IGNKU09OX1BhcnNlKHNyY1N0cik7DQoJaWYgKHJvb3QgPT0gTlVMTCkgew0KCQlwcmludGYoInJvb3QgPT0gTlVMTFxuIik7DQoJCXJldHVybiBOVUxMOw0KCX0NCg0KCW9iamVjdCA9IGNKU09OX0dldE9iamVjdEl0ZW0ocm9vdCwgIkhFQUQiKTsNCglpZiAob2JqZWN0ID09IE5VTEwpIHsNCgkJcHJpbnRmKCJIRUFEIG5vdCBmaW5kXG4iKTsNCgkJY0pTT05fRGVsZXRlKHJvb3QpOw0KCQlyZXR1cm4gTlVMTDsNCgl9DQoNCglvYmplY3QyID0gY0pTT05fR2V0T2JqZWN0SXRlbShvYmplY3QsICJDT0RFIik7DQoJaWYgKG9iamVjdDIgPT0gTlVMTCkgew0KCQlwcmludGYoIkNPREUgbm90IGZpbmRcbiIpOw0KCQljSlNPTl9EZWxldGUocm9vdCk7DQoJCXJldHVybiBOVUxMOw0KCX0NCglwcmludGYoIkNPREU6JXNcbiIsIG9iamVjdDItPnZhbHVlc3RyaW5nKTsNCgkNCgljb2RlID0gbWFsbG9jKEFQRFVfUkVTUF9MRU4pOw0KCWlmIChjb2RlICE9IE5VTEwpIHsNCgkJbWVtc2V0KGNvZGUsIDAsIEFQRFVfUkVTUF9MRU4pOw0KCQlzdHJuY3B5KGNvZGUsIG9iamVjdDItPnZhbHVlc3RyaW5nLCBBUERVX1JFU1BfTEVOLTEpOw0KCX0NCgljSlNPTl9EZWxldGUocm9vdCk7DQoJcmV0dXJuIGNvZGU7DQp9DQoNCnN0YXRpYyB2b2lkIGxwYV9vcGVuX2NmdW4odm9pZCkNCnsNCglpbnQgY2Z1bl9zdGF0ID0gLTE7DQoJdm9pZCAqcDJbXSA9IHsmY2Z1bl9zdGF0fTsNCgkNCglnZXRfbW9kZW1faW5mbygiQVQrQ0ZVTj9cclxuIiwgIiVkIiwgcDIpOw0KCWlmIChjZnVuX3N0YXQgIT0gMSkgew0KCQlnZXRfbW9kZW1faW5mbygiQVQrQ0ZVTj0wXHJcbiIsIE5VTEwsIE5VTEwpOw0KCQlnZXRfbW9kZW1faW5mbygiQVQrQ0ZVTj0xXHJcbiIsIE5VTEwsIE5VTEwpOw0KCQlscGFfY2xvc2VfbG9naWNhbF9jaGFubmVsKDApOw0KCX0NCn0NCg0KLy93aWZpyrG3wNa5y9HN+LXEc2ltv6iy2df3tPK2z2VzaW231rbO0LS/qA0Kc3RhdGljIHZvaWQgbHBhX2Nsb3NlX2NmdW4odm9pZCkNCnsNCgljaGFyIHBzX3dhblsyMF0gPSB7MH07DQoJY2hhciBkZWZfd2FuWzIwXSA9IHswfTsNCglpbnQgY2Z1bl9zdGF0ID0gLTE7DQoJdm9pZCAqcDJbXSA9IHsmY2Z1bl9zdGF0fTsNCg0KCXNjX2NmZ19nZXQoInBzd2FuIiwgcHNfd2FuLCBzaXplb2YocHNfd2FuKSk7DQoJc2NfY2ZnX2dldCgiZGVmYXVsdF93YW5fbmFtZSIsIGRlZl93YW4sIHNpemVvZihkZWZfd2FuKSk7DQoJaWYgKHN0cm5jbXAoZGVmX3dhbiwgcHNfd2FuLCBzdHJsZW4ocHNfd2FuKSkgIT0gMCkgew0KCQlnZXRfbW9kZW1faW5mbygiQVQrQ0ZVTj9cclxuIiwgIiVkIiwgcDIpOw0KCQlpZiAoY2Z1bl9zdGF0ID09IDEpIHsNCgkJCWdldF9tb2RlbV9pbmZvKCJBVCtDRlVOPTRcclxuIiwgTlVMTCwgTlVMTCk7DQoJCX0NCgl9DQp9DQoNCnN0YXRpYyBpbnQgbHBhX2V4ZV91cGRhdGEodm9pZCkNCnsNCglpbnQgY29kZSA9IC0xOw0KCWludCBpID0gMDsNCgljaGFyIHVwZGF0YV9yZXRyeVs2XSA9IHswfTsNCglpbnQgY291bnQgPSAwOw0KLy9kdGVzdA0KI2lmIDENCglzY19jZmdfZ2V0KCJscGFfdXBkYXRhX3JldHJ5IiwgdXBkYXRhX3JldHJ5LCBzaXplb2YodXBkYXRhX3JldHJ5KSk7DQoJY291bnQgPSBhdG9pKHVwZGF0YV9yZXRyeSk7DQoJaWYgKGNvdW50IDw9IDAgfHwgY291bnQgPiAxMCkgeyAvL2t3IDMNCgkJY291bnQgPSAxOw0KCX0NCgkNCglpZiAoMCA9PSBscGFfY2hlY2tfc3RhdHVzKDYwKSkgew0KCQlwcmludGYoImxwYV9leGVfdXBkYXRhIG5vdCByZWFkeVxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoNCglmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgew0KCQljb2RlID0gbHBhX3RyaWdnZXJfdXBkYXRhKCk7DQoJCWlmIChjb2RlID09IDAgfHwgaSA9PSBjb3VudC0xKQ0KCQkJYnJlYWs7DQoJCS8vcmV0cnkNCgkJc2xlZXAoMzApOw0KCX0NCgkNCglpZiAoY29kZSAhPSAwKSB7DQoJCXByaW50ZigibHBhX2V4ZV91cGRhdGEgdXBkYXRhIGZhaWxcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KI2VuZGlmCQkJCQkJCQkJCQkNCglyZXR1cm4gMDsNCn0NCi8vY2hlY2sgc2ltICYmIG5ldCAmJiBzbnRwIHJlYWR5DQppbnQgbHBhX2NoZWNrX3N0YXR1cyhpbnQgcmV0cnkpDQp7DQoJaW50IGkgPSAwOw0KCWludCByZXMgPSAtMTsNCg0KCS8vK1pQQklDDQoJZm9yKGkgPSAwOyBpIDwgcmV0cnk7IGkrKykgewkNCgkJY2hhciBzbnRwX3Jlc1syMF0gPSB7MH07DQoJCXNjX2NmZ19nZXQoInpwYmljX3BiIiwgc250cF9yZXMsIHNpemVvZihzbnRwX3JlcykpOw0KCQlpZiAoc3RyY21wKHNudHBfcmVzLCAicmVhZHkiKSA9PSAwKSB7DQoJCQlyZXMgPSAxOw0KCQkJYnJlYWs7DQoJCX0NCgkJcHJpbnRmKCJscGEgenBiaWNfcGI6ICVzXG4iLCBzbnRwX3Jlcyk7DQoJCXNsZWVwKDYpOw0KCX0NCglpZiAocmVzICE9IDEpIHsNCgkJcHJpbnRmKCJscGEgc2ltIG5vdCByZWFkeVxuIik7DQoJCXJldHVybiAwOw0KCX0NCg0KCS8vbmV0DQoJcmVzID0gLTE7DQoJZm9yKGkgPSAwOyBpIDwgcmV0cnk7IGkrKykgew0KCQlyZXMgPSBkZWZhdWx0X3JvdXRlX2NoZWNrKCk7DQoJCWlmIChyZXMgPT0gMSkNCgkJCWJyZWFrOw0KCQlwcmludGYoImxwYSBkZWZhdWx0X3JvdXRlX2NoZWNrOiAlZFxuIiwgcmVzKTsNCgkJc2xlZXAoNik7DQoJfQ0KCWlmIChyZXMgIT0gMSkgew0KCQlwcmludGYoImxwYSBjaGVjayBuZXQgdGltZW91dFxuIik7DQoJCXJldHVybiAwOw0KCX0NCg0KCS8vc250cCwgbm8gK3ptbWkNCglyZXMgPSAtMTsNCglmb3IoaSA9IDA7IGkgPCByZXRyeTsgaSsrKSB7CQ0KCQljaGFyIHNudHBfcmVzWzIwXSA9IHswfTsNCgkJc2NfY2ZnX2dldCgic250cF9wcm9jZXNzX3Jlc3VsdCIsIHNudHBfcmVzLCBzaXplb2Yoc250cF9yZXMpKTsNCgkJaWYgKHN0cmNtcChzbnRwX3JlcywgInN1Y2Nlc3MiKSA9PSAwKSB7DQoJCQlyZXMgPSAxOw0KCQkJYnJlYWs7DQoJCX0NCgkJcHJpbnRmKCJscGEgc250cF9wcm9jZXNzX3Jlc3VsdDogJXNcbiIsIHNudHBfcmVzKTsNCgkJc2xlZXAoNik7DQoJfQ0KCWlmIChyZXMgIT0gMSkgew0KCQlwcmludGYoImxwYSBjaGVjayBzbnRwIHRpbWVvdXRcbiIpOw0KCQlyZXR1cm4gMDsNCgl9DQoNCgkvL29wZW4gY2hhbm5lbA0KCXJlcyA9IC0xOw0KCWZvcihpID0gMDsgaSA8IDQ7IGkrKykgewkNCgkJcmVzID0gbHBhX29wZW5fbG9naWNhbF9jaGFubmVsKCk7DQoJCWlmIChyZXMgPT0gMCkNCgkJCWJyZWFrOw0KCQlwcmludGYoImxwYSBscGFfb3Blbl9sb2dpY2FsX2NoYW5uZWw6ICVkXG4iLCByZXMpOw0KCQlzbGVlcCgyKTsNCgl9DQoJaWYgKHJlcyAhPSAwKSB7DQoJCXByaW50ZigibHBhIG9wZW4gY2hhbm5lbCBmYWlsXG4iKTsNCgkJcmV0dXJuIDA7DQoJfQ0KDQoJLy8vL3NlbGVjdCBhcHAgaWQNCglyZXMgPSAtMTsNCglmb3IoaSA9IDA7IGkgPCA0OyBpKyspIHsJDQoJCXJlcyA9IGxwYV9zZWxlY3RfYWlkKCk7DQoJCWlmIChyZXMgPT0gMCkNCgkJCWJyZWFrOw0KCQlwcmludGYoImxwYSBscGFfc2VsZWN0X2FpZDogJWRcbiIsIHJlcyk7DQoJCXNsZWVwKDIpOw0KCX0NCglpZiAocmVzICE9IDApIHsNCgkJcHJpbnRmKCJscGEgc2VsZWN0IGZhaWxcbiIpOw0KCQlyZXR1cm4gMDsNCgl9DQoJcmV0dXJuIDE7DQp9DQoNCi8vsunRr9K70Km5zLaoss7K/Q0KaW50IGxwYV9pbml0KHZvaWQpDQp7DQoJLy96cGJpYyAmJiBzbnRwICYmIG5ldCBvaywgaWYgdXNlIHdsYW4gY2xvc2UgbW9kZW0sIG9wZW4gY2hhbm5lbCBzZWxlY3QgaXNkcg0KCWlmICgwID09IGxwYV9jaGVja19zdGF0dXMoNjApKSB7DQoJCXByaW50ZigibHBhIG5vdCByZWFkeVxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoNCglpZigwICE9IGxwYV9nZXRfaW1laShnX2ltZWksIHNpemVvZihnX2ltZWkpKSkgew0KCQlwcmludGYoImxwYSBubyBpbWVpXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCXJldHVybiAwOw0KfQ0KaW50IGxwYV91bmluaXQodm9pZCkNCnsNCglscGFfY2xvc2VfbG9naWNhbF9jaGFubmVsKDEpOw0KDQoJcmV0dXJuIDA7DQp9DQoNCnN0YXRpYyBjaGFyICpscGFfdGlnZ2VyX3Nlc3Npb24oY2hhciAqcGF0aCwgY2hhciAqcmVxX2RhdGEpDQp7DQoJaW50IHJldCA9IC0xOw0KCWludCBjb250X2xlbiA9IDA7DQoJaHR0cHNfY29udGV4dF90IGh0dHBzX2N0ID0gezB9Ow0KCWNoYXIgdHJpZ2dlcl9wb3J0WzZdID0gezB9Ow0KCWNoYXIgdHJpZ2dlcl9ob3N0W01BWF9VUkxfTEVOXSA9IHswfTsNCgljaGFyICpodHRwc19yZXEgPSBOVUxMOw0KCWNoYXIgKmh0dHBzX3Jlc3AgPSBOVUxMOw0KCWludCBodHRwc19yZXFfbGVuID0gMDsNCgkvL2t3IDMNCgkvL2lmIChodHRwc19yZXFfbGVuID4gVFJJR19IVFRQX01BWF9MRU4pDQoJLy8JcmV0dXJuIE5VTEw7DQoJDQoJc2NfY2ZnX2dldCgibHBhX3RyaWdnZXJfcG9ydCIsIHRyaWdnZXJfcG9ydCwgc2l6ZW9mKHRyaWdnZXJfcG9ydCkpOw0KCXNjX2NmZ19nZXQoImxwYV90cmlnZ2VyX2hvc3QiLCB0cmlnZ2VyX2hvc3QsIHNpemVvZih0cmlnZ2VyX2hvc3QpKTsNCg0KCVNTTF9saWJyYXJ5X2luaXQoKTsNCglodHRwc19jdC5wb3J0ID0gYXRvaSh0cmlnZ2VyX3BvcnQpOw0KCWh0dHBzX2N0Lmhvc3QgPSB0cmlnZ2VyX2hvc3Q7DQoJaHR0cHNfY3QucGF0aCA9IHBhdGg7DQoJcmV0ID0gaHR0cHNfaW5pdCgmaHR0cHNfY3QpOw0KCWlmIChyZXQgIT0gMCkgew0KCQlwcmludGYoIlt0cmlnZ2VyXSBodHRwc19pbml0IGZhaWxcbiIpOw0KCQlyZXR1cm4gTlVMTDsNCgl9DQoNCglodHRwc19yZXFfbGVuID0gc3RybGVuKHRyaWdnZXJfaHR0cHNfcmVxKStzdHJsZW4oaHR0cHNfY3QucGF0aCkrc3RybGVuKGh0dHBzX2N0Lmhvc3QpK3N0cmxlbihyZXFfZGF0YSkrMzI7DQoJaHR0cHNfcmVxID0gbWFsbG9jKGh0dHBzX3JlcV9sZW4pOw0KCWlmIChodHRwc19yZXEgPT0gTlVMTCkgew0KCQlodHRwc191bmluaXQoJmh0dHBzX2N0KTsNCgkJcmV0dXJuIE5VTEw7DQoJfQ0KCW1lbXNldChodHRwc19yZXEsIDAsIGh0dHBzX3JlcV9sZW4pOw0KCXJldCA9IHNucHJpbnRmKGh0dHBzX3JlcSwgaHR0cHNfcmVxX2xlbiwgdHJpZ2dlcl9odHRwc19yZXEsDQoJCWh0dHBzX2N0LnBhdGgsIGh0dHBzX2N0Lmhvc3QsIHN0cmxlbihyZXFfZGF0YSksIHJlcV9kYXRhKTsNCgkNCglwcmludGYoIlt0cmlnZ2VyXSByZXF1ZXN0IyMlcyMjXG4iLCBodHRwc19yZXEpOw0KCXJldCA9IGh0dHBzX3dyaXRlKCZodHRwc19jdCwgaHR0cHNfcmVxLCByZXQpOw0KCXByaW50ZigiW3RyaWdnZXJdIGh0dHBzX3dyaXRlIHJldCA9ICVkLlxuIiwgcmV0KTsNCg0KCXJldCA9IGh0dHBzX2dldF9zdGF0dXNfY29kZSgmaHR0cHNfY3QsICZjb250X2xlbik7DQoJcHJpbnRmKCJbdHJpZ2dlcl0gaHR0cHNfcmVjdiBjb2RlID0gJWQuXG4iLCByZXQpOw0KCWlmKHJldCA9PSAyMDAgJiYgKGNvbnRfbGVuID4gMCAmJiBjb250X2xlbiA8IFRSSUdfSFRUUF9NQVhfTEVOKSkNCgl7DQoJCWh0dHBzX3Jlc3AgPSBtYWxsb2MoY29udF9sZW4gKyAxKTsNCgkJaWYgKGh0dHBzX3Jlc3AgPT0gTlVMTCkgew0KCQkJaHR0cHNfdW5pbml0KCZodHRwc19jdCk7DQoJCQlmcmVlKGh0dHBzX3JlcSk7DQoJCQlwcmludGYoIlt0cmlnZ2VyXSBodHRwc19yZXNwX2NvbnQgTlVMTC5cbiIpOw0KCQkJcmV0dXJuIE5VTEw7DQoJCX0NCg0KCQltZW1zZXQoaHR0cHNfcmVzcCwgMCwgY29udF9sZW4gKyAxKTsNCgkJcmV0ID0gaHR0cHNfcmVhZF9jb250ZW50KCZodHRwc19jdCwgaHR0cHNfcmVzcCwgY29udF9sZW4pOw0KCQlpZihjb250X2xlbiA9PSByZXQpDQoJCXsNCgkJCWh0dHBzX3Jlc3BbcmV0XSA9ICdcMCc7CS8v19a3+7SuveHK+LHqyrYNCgkJCXByaW50ZigiW3RyaWdnZXJdIGh0dHBzX3dyaXRlIGh0dHBzX3Jlc3BfY29udGVudCA9IFxuICVzLlxuIiwgaHR0cHNfcmVzcCk7DQoJCX0NCgl9DQoJDQoJaHR0cHNfdW5pbml0KCZodHRwc19jdCk7DQoJZnJlZShodHRwc19yZXEpOw0KCXJldHVybiBodHRwc19yZXNwOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy8NCi8vtNO0pbeit/7O8cb3sunRr9a4we4NCi8vDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KY2hhciAqbHBhX3RyaWdnZXJfZXZlbnQoaW50ICpuZXh0X3N0ZXApDQp7DQoJY2hhciAqdHJpZ2dlcl9kYXRhID0gTlVMTDsNCgljaGFyICpodHRwc19yZXNwX2NvbnQgPSBOVUxMOw0KCWNoYXIgKmNvbW1hbmQgPSBOVUxMOw0KCWNoYXIgdHJpZ2dlcl9ldmVudFtNQVhfVVJMX0xFTl0gPSB7MH07DQoNCgl0cmlnZ2VyX2RhdGEgPSBscGFfZ2V0X3RyaWdnZXJfZGF0YSgpOw0KCWlmICh0cmlnZ2VyX2RhdGEgPT0gTlVMTCkgew0KCQlwcmludGYoIlt0cmlnZ2VyXSByZXF1ZXN0IGRhdGEgTlVMTC5cbiIpOw0KCQlyZXR1cm4gTlVMTDsNCgl9DQoNCglzY19jZmdfZ2V0KCJscGFfdHJpZ2dlcl9ldmVudF91cmwiLCB0cmlnZ2VyX2V2ZW50LCBzaXplb2YodHJpZ2dlcl9ldmVudCkpOw0KCWh0dHBzX3Jlc3BfY29udCA9IGxwYV90aWdnZXJfc2Vzc2lvbih0cmlnZ2VyX2V2ZW50LCB0cmlnZ2VyX2RhdGEpOw0KCWlmIChodHRwc19yZXNwX2NvbnQgIT0gTlVMTCkgew0KCQljb21tYW5kID0gbHBhX3BhcnNlX3RyaWdnZXJfcmVzcChodHRwc19yZXNwX2NvbnQsIG5leHRfc3RlcCk7DQoJCWZyZWUoaHR0cHNfcmVzcF9jb250KTsNCgl9DQoJDQoJZnJlZSh0cmlnZ2VyX2RhdGEpOw0KCXJldHVybiBjb21tYW5kOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy8NCi8vz/K0pbeit/7O8cb3yc+xqMr9vt0NCi8vDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KaW50IGxwYV90cmlnZ2VyX3VwZGF0YSh2b2lkKQ0Kew0KCWNoYXIgKnRyaWdnZXJfZGF0YSA9IE5VTEw7DQoJY2hhciAqaHR0cHNfcmVzcF9jb250ID0gTlVMTDsNCgljaGFyICpjb2RlID0gTlVMTDsNCglpbnQgcmVzX2NvZGUgPSAtMTsNCgljaGFyIHRyaWdnZXJfdXBkYXRhW01BWF9VUkxfTEVOXSA9IHswfTsNCg0KCXRyaWdnZXJfZGF0YSA9IGxwYV9nZXRfdXBkYXRhX2RhdGEoKTsNCglpZiAodHJpZ2dlcl9kYXRhID09IE5VTEwpIHsNCgkJcHJpbnRmKCJbdHJpZ2dlcl0gcmVxdWVzdCBkYXRhIE5VTEwuXG4iKTsNCgkJcmV0dXJuIE5VTEw7DQoJfQ0KCQ0KCXNjX2NmZ19nZXQoImxwYV90cmlnZ2VyX3VwZGF0YV91cmwiLCB0cmlnZ2VyX3VwZGF0YSwgc2l6ZW9mKHRyaWdnZXJfdXBkYXRhKSk7DQoJaHR0cHNfcmVzcF9jb250ID0gbHBhX3RpZ2dlcl9zZXNzaW9uKHRyaWdnZXJfdXBkYXRhLCB0cmlnZ2VyX2RhdGEpOw0KCWlmIChodHRwc19yZXNwX2NvbnQgIT0gTlVMTCkgew0KCQljb2RlID0gbHBhX3BhcnNlX3VwZGF0YV9yZXNwKGh0dHBzX3Jlc3BfY29udCk7DQoJCWlmIChjb2RlICE9IE5VTEwpIHsNCgkJCWVycm5vID0gMDsNCgkJCXJlc19jb2RlID0gc3RydG9sKGNvZGUsIE5VTEwsIDEwKTsNCgkJCWlmIChlcnJubyA9PSBFUkFOR0UpLy8ga3cgRVJSTk8uTk9UX0NIRUNLRUQNCgkJCXsNCgkJCQlwcmludGYoInN0cnRvbCBlcnJubyAlZDogJXNcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOw0KCQkJfQ0KCQkJZnJlZShjb2RlKTsNCgkJfQ0KCQlmcmVlKGh0dHBzX3Jlc3BfY29udCk7DQoJfQ0KCQ0KCWZyZWUodHJpZ2dlcl9kYXRhKTsNCglyZXR1cm4gcmVzX2NvZGU7DQp9DQoNCi8vtfS157XIs6G+sKOsyOe05tTaaWNjaWS8pLvusqLJz7Goo6yyu7Tm1NrWsb3T199ldmVudKOs1tjQwrSlt6LPwtTYtciy2df3DQppbnQgbHBhX2V4Y2VwdGlvbl9wcm9jZXNzKHZvaWQpDQp7DQoJY2hhciBoYXNfaWNjaWRbSUNDSURfTEVOKzFdID0gezB9Ow0KCWludCBzdGF0dXMgPSAwOw0KCWludCByZXMgPSAwOw0KCQ0KCXNjX2NmZ19nZXQoImxwYV9icHBfaWNjaWQiLCBoYXNfaWNjaWQsIHNpemVvZihoYXNfaWNjaWQpKTsNCglpZiAoc3RybGVuKGhhc19pY2NpZCkgPT0gSUNDSURfTEVOKSB7DQoJCXN0YXR1cyA9IGxwYV9nZXRfcHJvZmlsZV9zdGF0ZShoYXNfaWNjaWQpOw0KCQlpZiAoc3RhdHVzID09IDEgfHwgc3RhdHVzID09IDApIHsNCgkJCXJlcyA9IGxwYV9lbmFibGVfcHJvZmlsZShoYXNfaWNjaWQpOw0KCQkJaWYgKHJlcyA9PSAwKSB7DQoJCQkJc2NfY2ZnX3NldCgibHBhX2JwcF9pY2NpZCIsICIiKTsNCgkJCQlzY19jZmdfc2F2ZSgpOw0KCQkJCXJldHVybiAwOw0KCQkJfQ0KCQkJcmV0dXJuIC0xOw0KCQl9DQoJfQ0KDQoJcmV0dXJuIDA7DQp9DQoNCmludCBscGFfZG93bmxvYWRfcHJvZmlsZShjaGFyICphY3RpdmVjb2RlLCBjaGFyICpjb25maXJtY29kZSkNCnsNCglpbnQgcmVzID0gLTE7DQoNCglscGFfY2xvc2VfY2Z1bigpOw0KDQoJbWVtc2V0KGN1cmVudF9pY2NpZCwgMCwgc2l6ZW9mKGN1cmVudF9pY2NpZCkpOw0KCXJlcyA9IGRvd25sb2FkUHJvZmlsZUJ5QWMoYWN0aXZlY29kZSwgY29uZmlybWNvZGUpOw0KDQoJLy+yu7ncs8m5ptPrt/GjrLa80qrJz7GoDQoJcmVzID0gbHBhX2VuYWJsZV9wcm9maWxlKGN1cmVudF9pY2NpZCk7DQoJaWYgKHJlcyA9PSAwKSB7DQoJCXNjX2NmZ19zZXQoImxwYV9icHBfaWNjaWQiLCAiIik7DQoJCXNjX2NmZ19zYXZlKCk7DQoJfQ0KDQoJbHBhX29wZW5fY2Z1bigpOw0KCQ0KCXJldHVybiByZXM7DQp9DQoNCmludCBscGFfZW5hYmxlX3Byb2ZpbGUoY2hhciAqaWNjaWQpDQp7DQoJaW50IHJlcyA9IDA7DQoJaW50IGNvZGUgPSAwOw0KCQ0KCXJlcyA9IGVuYWJsZVByb2ZpbGUoaWNjaWQpOw0KCWlmIChyZXMgPT0gMCkgew0KCQlzY19jZmdfc2V0KCJ6cGJpY19wYiIsICIiKTsvL3dhaXQgc2ltIHJlYWR5DQoJCXNjX2NmZ19zZXQoImxwYV9sYXN0X3JlcyIsICJzdWNjZXNzIik7DQoJCWxwYV9jbG9zZV9sb2dpY2FsX2NoYW5uZWwoMCk7DQoJCXNsZWVwKDIpOw0KCX0NCgllbHNlIGlmIChyZXMgPT0gMikgew0KCQlzY19jZmdfc2V0KCJscGFfbGFzdF9yZXMiLCAic3VjY2VzcyIpOw0KCX0NCgllbHNlIHsNCgkJc2NfY2ZnX3NldCgibHBhX2xhc3RfcmVzIiwgImZhaWwiKTsNCgl9DQoNCgljb2RlID0gbHBhX2V4ZV91cGRhdGEoKTsNCiAJaWYgKGNvZGUgIT0gMCkgew0KCQlwcmludGYoImxwYV9lbmFibGVfcHJvZmlsZSB1cGRhdGEgZmFpbFxuIik7DQoJCXJldHVybiAtMTsNCgl9DQogCXJldHVybiAwOw0KfQ0KDQppbnQgbHBhX2Rpc2FibGVfcHJvZmlsZShjaGFyICppY2NpZCkNCnsNCglpbnQgcmVzID0gMDsNCglpbnQgY29kZSA9IDA7DQoJDQoJcmVzID0gZGlzYWJsZVByb2ZpbGUoaWNjaWQpOw0KCWlmIChyZXMgPT0gMCkgew0KCQlzY19jZmdfc2V0KCJ6cGJpY19wYiIsICIiKTsvL3dhaXQgc2ltIHJlYWR5DQoJCXNjX2NmZ19zZXQoImxwYV9sYXN0X3JlcyIsICJzdWNjZXNzIik7DQoJCWxwYV9jbG9zZV9sb2dpY2FsX2NoYW5uZWwoMCk7DQoJCXNsZWVwKDIpOw0KCX0NCgllbHNlIGlmIChyZXMgPT0gMikgew0KCQlzY19jZmdfc2V0KCJscGFfbGFzdF9yZXMiLCAic3VjY2VzcyIpOw0KCX0NCgllbHNlIHsNCgkJc2NfY2ZnX3NldCgibHBhX2xhc3RfcmVzIiwgImZhaWwiKTsNCgl9DQoJDQoJY29kZSA9IGxwYV9leGVfdXBkYXRhKCk7DQogCWlmIChjb2RlICE9IDApIHsNCgkJcHJpbnRmKCJscGFfZGlzYWJsZV9wcm9maWxlIHVwZGF0YSBmYWlsXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCiAJcmV0dXJuIDA7DQp9DQoNCmludCBscGFfZGVsZXRlX3Byb2ZpbGUoY2hhciAqaWNjaWQpDQp7DQoJaW50IHJlcyA9IDA7DQoJaW50IGNvZGUgPSAwOw0KCQ0KCXJlcyA9IGRlbGV0ZVByb2ZpbGUoaWNjaWQpOw0KCWlmIChyZXMgPT0gMCkgew0KCQlzY19jZmdfc2V0KCJscGFfbGFzdF9yZXMiLCAic3VjY2VzcyIpOw0KCQlzbGVlcCgyKTsNCgl9DQoJZWxzZSBpZiAocmVzID09IDEpIHsNCgkJc2NfY2ZnX3NldCgibHBhX2xhc3RfcmVzIiwgInN1Y2Nlc3MiKTsNCgl9DQoJZWxzZSB7DQoJCXNjX2NmZ19zZXQoImxwYV9sYXN0X3JlcyIsICJmYWlsIik7DQoJfQ0KCQ0KCWNvZGUgPSBscGFfZXhlX3VwZGF0YSgpOw0KIAlpZiAoY29kZSAhPSAwKSB7DQoJCXByaW50ZigibHBhX2Rpc2FibGVfcHJvZmlsZSB1cGRhdGEgZmFpbFxuIik7DQoJCXJldHVybiAtMTsNCgl9DQogCXJldHVybiAwOw0KfQ0KDQppbnQgbHBhX21lbW9yeV9yZXNldCh2b2lkKQ0Kew0KCWludCByZXMgPSAwOw0KCWludCBzdGF0ZSA9IDA7DQoJaW50IGNvZGUgPSAwOw0KDQoJc3RhdGUgPSBscGFfZ2V0X2N1cl9pY2NpZF9zdGF0ZSgpOw0KCXJlcyA9IG1lbW9yeVJlc2V0KCk7DQoJaWYgKHJlcyA9PSAwKSB7DQoJCWlmKHN0YXRlID09IDEpIHsNCgkJCXNjX2NmZ19zZXQoInpwYmljX3BiIiwgIiIpOy8vd2FpdCBzaW0gcmVhZHkNCgkJCWxwYV9jbG9zZV9sb2dpY2FsX2NoYW5uZWwoMCk7DQoJCQlwcmludGYoImxwYSB6cGJpY19wYiByZXNldFxuIik7DQoJCX0NCgkJc2NfY2ZnX3NldCgibHBhX2xhc3RfcmVzIiwgInN1Y2Nlc3MiKTsNCgkJc2xlZXAoMik7Ly93YWl0IHNpbSByZWFkeQ0KCX0NCgllbHNlIGlmIChyZXMgPT0gMSkgew0KCQlzY19jZmdfc2V0KCJscGFfbGFzdF9yZXMiLCAic3VjY2VzcyIpOw0KCX0NCgllbHNlIHsNCgkJc2NfY2ZnX3NldCgibHBhX2xhc3RfcmVzIiwgImZhaWwiKTsNCgl9DQoJDQoJY29kZSA9IGxwYV9leGVfdXBkYXRhKCk7DQogCWlmIChjb2RlICE9IDApIHsNCgkJcHJpbnRmKCJscGFfZGlzYWJsZV9wcm9maWxlIHVwZGF0YSBmYWlsXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCiAJcmV0dXJuIDA7DQp9DQoNCmludCBscGFfb3Blbl9sb2dpY2FsX2NoYW5uZWwodm9pZCkNCnsNCiAgICBjaGFyICphcGR1ID0gTlVMTDsNCglpbnQgY2hhbiA9IDA7DQoJaWYgKGdfb3Blbl9jaGFubmVsX2ZsYWcgPT0gMCkgew0KCQlhcGR1ID0gT3BlbkxvZ2ljYWxDaGFubmVsKCk7DQoJCWlmIChhcGR1ID09IE5VTEwpDQoJCQlyZXR1cm4gLTE7DQoJCWVycm5vID0gMDsNCgkJY2hhbiA9IHN0cnRvbChhcGR1LCBOVUxMLCAxNik7DQoJCWlmIChlcnJubyA9PSBFUkFOR0UpLy8ga3cgRVJSTk8uTk9UX0NIRUNLRUQNCgkJew0KCQkJcHJpbnRmKCJzdHJ0b2wgZXJybm8gJWQ6ICVzXG4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsNCgkJfQ0KCQlmcmVlKGFwZHUpOw0KCQlpZiAoY2hhbiA8IDAgfHwgY2hhbiA+IDMpDQoJCQlyZXR1cm4gLTE7DQoJCWdfb3Blbl9jaGFubmVsX2ZsYWcgPSAxOw0KCQlnX2NoYW5faWQgPSBjaGFuOw0KCX0gDQoJcmV0dXJuIDA7DQp9DQovL2ZsYWcgPSAwLCB3aGVuIHJlZnJlc2ggbm90IG5lZWQgY2xvc2UNCmludCBscGFfY2xvc2VfbG9naWNhbF9jaGFubmVsKGludCBmbGFnKQ0Kew0KICAgIGNoYXIgKmFwZHUgPSBOVUxMOw0KCWludCByZXMgPSAwOw0KCWlmIChmbGFnID09IDEgJiYgZ19vcGVuX2NoYW5uZWxfZmxhZyA9PSAxKSB7DQoJCXJlcyA9IENsb3NlTG9naWNhbENoYW5uZWwoZ19jaGFuX2lkKTsNCgkJcHJpbnRmKCJscGFfY2xvc2VfbG9naWNhbF9jaGFubmVsOiVkLCByZXM6JWRcbiIsIGdfY2hhbl9pZCwgcmVzKTsNCgl9DQoJZ19jaGFuX2lkID0gMDsNCglnX29wZW5fY2hhbm5lbF9mbGFnID0gMDsNCgkNCglyZXR1cm4gcmVzOw0KfQ0KDQo=