I2luY2x1ZGUgPG5pcnZhbmEuaD4KI2luY2x1ZGUgTlZfVklFV1BPUlRfSAojaW5jbHVkZSA8c3RkaW8uaD4KCiNpbmNsdWRlIDxmdDJidWlsZC5oPgojaW5jbHVkZSBGVF9GUkVFVFlQRV9ICgovKiBpbmNsdWRlIEZyZWVUeXBlIGludGVybmFscyB0byBkZWJ1ZyBoaW50cyAqLwojaW5jbHVkZSA8Li4vc3JjL3BzaGludGVyL3BzaHJlYy5oPgojaW5jbHVkZSA8Li4vc3JjL3BzaGludGVyL3BzaGFsZ28xLmg+CiNpbmNsdWRlIDwuLi9zcmMvcHNoaW50ZXIvcHNoYWxnbzIuaD4KCiNpbmNsdWRlIDwuLi9zcmMvYXV0b2hpbnQvYWh0eXBlcy5oPgoKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgIFJPT1QgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKI2luY2x1ZGUgPHRpbWUuaD4gICAgLyogZm9yIGNsb2NrKCkgKi8KCi8qIFN1bk9TIDQuMS4qIGRvZXMgbm90IGRlZmluZSBDTE9DS1NfUEVSX1NFQywgc28gaW5jbHVkZSA8c3lzL3BhcmFtLmg+ICovCi8qIHRvIGdldCB0aGUgSFogbWFjcm8gd2hpY2ggaXMgdGhlIGVxdWl2YWxlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICovCiNpZiBkZWZpbmVkKF9fc3VuX18pICYmICFkZWZpbmVkKFNWUjQpICYmICFkZWZpbmVkKF9fU1ZSNCkKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZGVmaW5lIENMT0NLU19QRVJfU0VDIEhaCiNlbmRpZgoKc3RhdGljIGludCAgZmlyc3RfZ2x5cGggPSAwOwoKc3RhdGljIE5WX1JlbmRlcmVyICAgcmVuZGVyZXI7CnN0YXRpYyBOVl9QYWludGVyICAgIHBhaW50ZXI7CnN0YXRpYyBOVl9QaXhtYXAgICAgIHRhcmdldDsKc3RhdGljIE5WX0Vycm9yICAgICAgZXJyb3I7CnN0YXRpYyBOVl9NZW1vcnkgICAgIG1lbW9yeTsKc3RhdGljIE5WVl9EaXNwbGF5ICAgZGlzcGxheTsKc3RhdGljIE5WVl9TdXJmYWNlICAgc3VyZmFjZTsKCnN0YXRpYyBGVF9MaWJyYXJ5ICAgIGZyZWV0eXBlOwpzdGF0aWMgRlRfRmFjZSAgICAgICBmYWNlOwoKCnN0YXRpYyAgTlZfUG9zICAgICAgICBnbHlwaF9zY2FsZTsKc3RhdGljICBOVl9Qb3MgICAgICAgIGdseXBoX29yZ194OwpzdGF0aWMgIE5WX1BvcyAgICAgICAgZ2x5cGhfb3JnX3k7CnN0YXRpYyAgTlZfVHJhbnNmb3JtICBnbHlwaF90cmFuc2Zvcm07ICAvKiBmb250IHVuaXRzIC0+IGRldmljZSBwaXhlbHMgKi8Kc3RhdGljICBOVl9UcmFuc2Zvcm0gIHNpemVfdHJhbnNmb3JtOyAgIC8qIHN1YnBpeGVscyAgLT4gZGV2aWNlIHBpeGVscyAqLwoKc3RhdGljICBOVl9TY2FsZSAgICAgIGdyaWRfc2NhbGUgPSAxLjA7CgpzdGF0aWMgIGludCAgIGdseXBoX2luZGV4OwpzdGF0aWMgIGludCAgIHBpeGVsX3NpemUgPSAxMjsKCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgIE9QVElPTlMsIENPTE9SUyBhbmQgT1RIRVJTICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19heGlzICAgICA9IDE7CnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfZG90cyAgICAgPSAxOwpzdGF0aWMgIGludCAgIG9wdGlvbl9zaG93X3N0cm9rZSAgID0gMDsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19nbHlwaCAgICA9IDE7CnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfZ3JpZCAgICAgPSAxOwpzdGF0aWMgIGludCAgIG9wdGlvbl9zaG93X2VtICAgICAgID0gMDsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19zbW9vdGggICA9IDE7CnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfYmx1ZXMgICAgPSAwOwpzdGF0aWMgIGludCAgIG9wdGlvbl9zaG93X2VkZ2VzICAgID0gMDsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19zZWdtZW50cyA9IDE7CnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfbGlua3MgICAgPSAxOwpzdGF0aWMgIGludCAgIG9wdGlvbl9zaG93X2luZGljZXMgID0gMDsKCnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfcHNfaGludHMgICA9IDE7CnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfaG9yel9oaW50cyA9IDE7CnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfdmVydF9oaW50cyA9IDE7CgoKc3RhdGljICBpbnQgICBvcHRpb25faGludGluZyA9IDE7CgpzdGF0aWMgIGNoYXIgIHRlbXBfbWVzc2FnZVsxMDI0XTsKCnN0YXRpYyAgTlZfUGF0aCAgIHN5bWJvbF9kb3QgICAgID0gTlVMTDsKc3RhdGljICBOVl9QYXRoICAgc3ltYm9sX2NpcmNsZSAgPSBOVUxMOwpzdGF0aWMgIE5WX1BhdGggICBzeW1ib2xfc3F1YXJlICA9IE5VTEw7CnN0YXRpYyAgTlZfUGF0aCAgIHN5bWJvbF9yZWN0X2ggID0gTlVMTDsKc3RhdGljICBOVl9QYXRoICAgc3ltYm9sX3JlY3RfdiAgPSBOVUxMOwoKCgojZGVmaW5lICBBWElTX0NPTE9SICAgICAgICAweEZGRkYwMDAwCiNkZWZpbmUgIEdSSURfQ09MT1IgICAgICAgIDB4RkZEMEQwRDAKI2RlZmluZSAgT05fQ09MT1IgICAgICAgICAgMHhGRkZGMjAwMAojZGVmaW5lICBPRkZfQ09MT1IgICAgICAgICAweEZGRkYwMDgwCiNkZWZpbmUgIFNUUk9OR19DT0xPUiAgICAgIDB4RkY0MDQwNDAKI2RlZmluZSAgSU5URVJQX0NPTE9SICAgICAgMHhGRjIwNjA0MAojZGVmaW5lICBTTU9PVEhfQ09MT1IgICAgICAweEYwMDBCMDQwCiNkZWZpbmUgIEJBQ0tHUk9VTkRfQ09MT1IgIDB4RkZGRkZGRkYKI2RlZmluZSAgVEVYVF9DT0xPUiAgICAgICAgMHhGRjAwMDAwMAojZGVmaW5lICBFTV9DT0xPUiAgICAgICAgICAweDgwMDA4MDAwCiNkZWZpbmUgIEJMVUVTX1RPUF9DT0xPUiAgIDB4NDAwMDAwOEYKI2RlZmluZSAgQkxVRVNfQk9UX0NPTE9SICAgMHg0MDAwOEYwMAoKI2RlZmluZSAgR0hPU1RfSElOVF9DT0xPUiAgMHhFMDAwMDBGRgojZGVmaW5lICBTVEVNX0hJTlRfQ09MT1IgICAweEUwMjAyMEZGCiNkZWZpbmUgIFNURU1fSk9JTl9DT0xPUiAgIDB4RTAyMEZGMjAKCiNkZWZpbmUgIEVER0VfQ09MT1IgICAgICAgIDB4RjA3MDQwNzAKI2RlZmluZSAgU0VHTUVOVF9DT0xPUiAgICAgMHhGMDIwNjA0MAojZGVmaW5lICBMSU5LX0NPTE9SICAgICAgICAweEYwRkZGRjAwCiNkZWZpbmUgIFNFUklGX0xJTktfQ09MT1IgIDB4RjBGRjgwOEYKCi8qIHByaW50IG1lc3NhZ2UgYW5kIGFib3J0IHByb2dyYW0gKi8Kc3RhdGljIHZvaWQKUGFuaWMoIGNvbnN0IGNoYXIqICBtZXNzYWdlICkKewogIGZwcmludGYoIHN0ZGVyciwgIlBBTklDOiAlc1xuIiwgbWVzc2FnZSApOwogIGV4aXQoMSk7Cn0KCgpzdGF0aWMgdm9pZAppbml0X3N5bWJvbHMoIHZvaWQgKQp7CiAgbnZfcGF0aF9uZXdfcmVjdGFuZ2xlKCByZW5kZXJlciwgLTEsIC0xLCAzLCAzLCAwLCAwLCAmc3ltYm9sX3NxdWFyZSApOwogIG52X3BhdGhfbmV3X3JlY3RhbmdsZSggcmVuZGVyZXIsIC0xLCAtNiwgMiwgMTIsIDAsIDAsICZzeW1ib2xfcmVjdF92ICk7CiAgbnZfcGF0aF9uZXdfcmVjdGFuZ2xlKCByZW5kZXJlciwgLTYsIC0xLCAxMiwgMiwgMCwgMCwgJnN5bWJvbF9yZWN0X2ggKTsKICBudl9wYXRoX25ld19jaXJjbGUoIHJlbmRlcmVyLCAwLCAwLCAzLiwgJnN5bWJvbF9kb3QgKTsKICBudl9wYXRoX3N0cm9rZSggc3ltYm9sX2RvdCwgMC42LAogICAgICAgICAgICAgICAgICBudl9wYXRoX2xpbmVjYXBfYnV0dCwKICAgICAgICAgICAgICAgICAgbnZfcGF0aF9saW5lam9pbl9taXRlciwgMS4sCiAgICAgICAgICAgICAgICAgICZzeW1ib2xfY2lyY2xlICk7CgogIG52X3BhdGhfZGVzdHJveSggc3ltYm9sX2RvdCApOwogIG52X3BhdGhfbmV3X2NpcmNsZSggcmVuZGVyZXIsIDAsIDAsIDIuLCAmc3ltYm9sX2RvdCApOwoKIH0KCnN0YXRpYyB2b2lkCmRvbmVfc3ltYm9scyggdm9pZCApCnsKICBudl9wYXRoX2Rlc3Ryb3koIHN5bWJvbF9jaXJjbGUgKTsKICBudl9wYXRoX2Rlc3Ryb3koIHN5bWJvbF9kb3QgKTsKICBudl9wYXRoX2Rlc3Ryb3koIHN5bWJvbF9yZWN0X3YgKTsKICBudl9wYXRoX2Rlc3Ryb3koIHN5bWJvbF9yZWN0X2ggKTsKICBudl9wYXRoX2Rlc3Ryb3koIHN5bWJvbF9zcXVhcmUgKTsKfQoKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgIENPTU1PTiBHUklEIERSQVdJTkcgUk9VVElORVMgICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZApyZXNldF9zY2FsZSggTlZfU2NhbGUgIHNjYWxlICkKewogLyogY29tcHV0ZSBmb250IHVuaXRzIC0+IGdyaWQgcGl4ZWxzIHNjYWxlIGZhY3RvciAqLwogIGdseXBoX3NjYWxlID0gdGFyZ2V0LT53aWR0aCowLjc1IC8gZmFjZS0+dW5pdHNfcGVyX0VNICogc2NhbGU7CgogLyogc2V0dXAgZm9udCB1bml0cyAtPiBncmlkIHBpeGVscyB0cmFuc2Zvcm0gKi8KICBudl90cmFuc2Zvcm1fc2V0X3NjYWxlKCAmZ2x5cGhfdHJhbnNmb3JtLCBnbHlwaF9zY2FsZSwgLWdseXBoX3NjYWxlICk7CiAgZ2x5cGhfb3JnX3ggPSBnbHlwaF90cmFuc2Zvcm0uZGVsdGEueCA9IHRhcmdldC0+d2lkdGgqMC4xMjU7CiAgZ2x5cGhfb3JnX3kgPSBnbHlwaF90cmFuc2Zvcm0uZGVsdGEueSA9IHRhcmdldC0+aGVpZ2h0KjAuODc1OwoKIC8qIHNldHVwIHN1YnBpeGVscyAtPiBncmlkIHBpeGVscyB0cmFuc2Zvcm0gKi8KICBudl90cmFuc2Zvcm1fc2V0X3NjYWxlKCAmc2l6ZV90cmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9zY2FsZS9udl9mcm9tZml4ZWQoZmFjZS0+c2l6ZS0+bWV0cmljcy54X3NjYWxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAtIGdseXBoX3NjYWxlL252X2Zyb21maXhlZChmYWNlLT5zaXplLT5tZXRyaWNzLnlfc2NhbGUpICk7CgogIHNpemVfdHJhbnNmb3JtLmRlbHRhID0gZ2x5cGhfdHJhbnNmb3JtLmRlbHRhOwp9CgoKc3RhdGljIHZvaWQKcmVzZXRfc2l6ZSggaW50ICBwaXhlbF9zaXplLCBOVl9TY2FsZSAgc2NhbGUgKQp7CiAgRlRfU2V0X1BpeGVsX1NpemVzKCBmYWNlLCBwaXhlbF9zaXplLCBwaXhlbF9zaXplICk7CiAgcmVzZXRfc2NhbGUoIHNjYWxlICk7Cn0KCgpzdGF0aWMgdm9pZApjbGVhcl9iYWNrZ3JvdW5kKCB2b2lkICkKewogIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgMCwgMCwgdGFyZ2V0LT53aWR0aCwgdGFyZ2V0LT5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgQkFDS0dST1VORF9DT0xPUiApOwp9CgoKc3RhdGljIHZvaWQKZHJhd19ncmlkKCB2b2lkICkKewogIGludCAgeCA9IChpbnQpZ2x5cGhfb3JnX3g7CiAgaW50ICB5ID0gKGludClnbHlwaF9vcmdfeTsKCiAgLyogZHJhdyBncmlkICovCiAgaWYgKCBvcHRpb25fc2hvd19ncmlkICkKICB7CiAgICBOVl9TY2FsZSAgbWluLCBtYXgsIHgsIHN0ZXA7CgogICAgLyogZHJhdyB2ZXJ0aWNhbCBncmlkIGJhcnMgKi8KICAgIHN0ZXAgPSA2NC4gKiBzaXplX3RyYW5zZm9ybS5tYXRyaXgueHg7CiAgICBpZiAoc3RlcCA+IDEuKQogICAgewogICAgICBtaW4gID0gbWF4ID0gZ2x5cGhfb3JnX3g7CiAgICAgIHdoaWxlICggbWluIC0gc3RlcCA+PSAwICkgICAgICAgICAgICAgbWluIC09IHN0ZXA7CiAgICAgIHdoaWxlICggbWF4ICsgc3RlcCA8IHRhcmdldC0+d2lkdGggKSAgbWF4ICs9IHN0ZXA7CgogICAgICBmb3IgKCB4ID0gbWluOyB4IDw9IG1heDsgeCArPSBzdGVwICkKICAgICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIChOVl9JbnQpKHgrLjUpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIHRhcmdldC0+aGVpZ2h0LCBHUklEX0NPTE9SICk7CiAgICB9CgogICAgLyogZHJhdyBob3Jpem9udGFsIGdyaWQgYmFycyAqLwogICAgc3RlcCA9IC02NC4gKiBzaXplX3RyYW5zZm9ybS5tYXRyaXgueXk7CiAgICBpZiAoc3RlcCA+IDEuKQogICAgewogICAgICBtaW4gID0gbWF4ID0gZ2x5cGhfb3JnX3k7CiAgICAgIHdoaWxlICggbWluIC0gc3RlcCA+PSAwICkgICAgICAgICAgICAgIG1pbiAtPSBzdGVwOwogICAgICB3aGlsZSAoIG1heCArIHN0ZXAgPCB0YXJnZXQtPmhlaWdodCApICBtYXggKz0gc3RlcDsKCiAgICAgIGZvciAoIHggPSBtaW47IHggPD0gbWF4OyB4ICs9IHN0ZXAgKQogICAgICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgMCwgKE5WX0ludCkoeCsuNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT53aWR0aCwgMSwgR1JJRF9DT0xPUiApOwogICAgfQogIH0KCiAgLyogZHJhdyBheGlzICovCiAgaWYgKCBvcHRpb25fc2hvd19heGlzICkKICB7CiAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHgsIDAsIDEsIHRhcmdldC0+aGVpZ2h0LCBBWElTX0NPTE9SICk7CiAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIHksIHRhcmdldC0+d2lkdGgsIDEsIEFYSVNfQ09MT1IgKTsKICB9CgogIGlmICggb3B0aW9uX3Nob3dfZW0gKQogIHsKICAgIE5WX1BhdGggIHBhdGg7CiAgICBOVl9QYXRoICBzdHJva2U7CiAgICBOVl9VSW50ICB1bml0cyA9IChOVl9VSW50KWZhY2UtPnVuaXRzX3Blcl9FTTsKCiAgICBudl9wYXRoX25ld19yZWN0YW5nbGUoIHJlbmRlcmVyLCAwLCAwLCB1bml0cywgdW5pdHMsIDAsIDAsICZwYXRoICk7CiAgICBudl9wYXRoX3RyYW5zZm9ybSggcGF0aCwgJmdseXBoX3RyYW5zZm9ybSApOwoKICAgIG52X3BhdGhfc3Ryb2tlKCBwYXRoLCAxLjUsIG52X3BhdGhfbGluZWNhcF9idXR0LCBudl9wYXRoX2xpbmVqb2luX21pdGVyLAogICAgICAgICAgICAgICAgICAgIDQuMCwgJnN0cm9rZSApOwoKICAgIG52X3BhaW50ZXJfc2V0X2NvbG9yKCBwYWludGVyLCBFTV9DT0xPUiwgMjU2ICk7CiAgICBudl9wYWludGVyX2ZpbGxfcGF0aCggcGFpbnRlciwgTlVMTCwgMCwgc3Ryb2tlICk7CgogICAgbnZfcGF0aF9kZXN0cm95KCBzdHJva2UgKTsKICAgIG52X3BhdGhfZGVzdHJveSggcGF0aCApOwogIH0KCn0KCgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqICAgICAgICAgICAgUE9TVFNDUklQVCBHTE9CQUxTIFJPVVRJTkVTICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDwuLi9zcmMvcHNoaW50ZXIvcHNoZ2xvYi5oPgoKc3RhdGljIHZvaWQKZHJhd19wc19ibHVlX3pvbmVzKCB2b2lkICkKewogIGlmICggb3B0aW9uX3Nob3dfYmx1ZXMgJiYgcHNfZGVidWdfZ2xvYmFscyApCiAgewogICAgUFNIX0JsdWVzICAgICAgIGJsdWVzID0gJnBzX2RlYnVnX2dsb2JhbHMtPmJsdWVzOwogICAgUFNIX0JsdWVfVGFibGUgIHRhYmxlOwogICAgTlZfVmVjdG9yICAgICAgIHY7CiAgICBGVF9JbnQgICAgICAgICAgeTEsIHkyOwogICAgRlRfVUludCAgICAgICAgIGNvdW50OwogICAgUFNIX0JsdWVfWm9uZSAgIHpvbmU7CgogICAgLyogZHJhdyB0b3Agem9uZXMgKi8KICAgIHRhYmxlID0gJmJsdWVzLT5ub3JtYWxfdG9wOwogICAgY291bnQgPSB0YWJsZS0+Y291bnQ7CiAgICB6b25lICA9IHRhYmxlLT56b25lczsKCiAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgem9uZSsrICkKICAgIHsKICAgICAgdi54ID0gMDsKICAgICAgaWYgKCAhcHNfZGVidWdfbm9faG9yel9oaW50cyApCiAgICAgIHsKICAgICAgICB2LnkgPSB6b25lLT5jdXJfcmVmICsgem9uZS0+Y3VyX2RlbHRhOwogICAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICB2LnkgPSB6b25lLT5vcmdfcmVmICsgem9uZS0+b3JnX2RlbHRhOwogICAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmZ2x5cGhfdHJhbnNmb3JtICk7CiAgICAgIH0KICAgICAgeTEgID0gKGludCkodi55ICsgMC41KTsKCiAgICAgIHYueCA9IDA7CiAgICAgIGlmICggIXBzX2RlYnVnX25vX2hvcnpfaGludHMgKQogICAgICB7CiAgICAgICAgdi55ID0gem9uZS0+Y3VyX3JlZjsKICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdi55ID0gem9uZS0+b3JnX3JlZjsKICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJmdseXBoX3RyYW5zZm9ybSApOwogICAgICB9CiAgICAgIHkyID0gKGludCkodi55ICsgMC41KTsKCiAgICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgMCwgeTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC0+d2lkdGgsIHkyLXkxKzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMVUVTX1RPUF9DT0xPUiApOwoKI2lmIDAKICAgICAgcHJpbnRmKCAidG9wIFslLjNmICUuM2ZdXG4iLCB6b25lLT5jdXJfYm90dG9tLzY0LjAsIHpvbmUtPmN1cl90b3AvNjQuMCApOwojZW5kaWYKICAgIH0KCgogICAgLyogZHJhdyBib3R0b20gem9uZXMgKi8KICAgIHRhYmxlID0gJmJsdWVzLT5ub3JtYWxfYm90dG9tOwogICAgY291bnQgPSB0YWJsZS0+Y291bnQ7CiAgICB6b25lICA9IHRhYmxlLT56b25lczsKCiAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgem9uZSsrICkKICAgIHsKICAgICAgdi54ID0gMDsKICAgICAgdi55ID0gem9uZS0+Y3VyX3JlZjsKICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZzaXplX3RyYW5zZm9ybSApOwogICAgICB5MSAgPSAoaW50KSh2LnkgKyAwLjUpOwoKICAgICAgdi54ID0gMDsKICAgICAgdi55ID0gem9uZS0+Y3VyX3JlZiArIHpvbmUtPmN1cl9kZWx0YTsKICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZzaXplX3RyYW5zZm9ybSApOwogICAgICB5MiA9IChpbnQpKHYueSArIDAuNSk7CgogICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIHkxLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPndpZHRoLCB5Mi15MSsxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBCTFVFU19CT1RfQ09MT1IgKTsKCiNpZiAwCiAgICAgIHByaW50ZiggImJvdCBbJS4zZiAlLjNmXVxuIiwgem9uZS0+Y3VyX2JvdHRvbS82NC4wLCB6b25lLT5jdXJfdG9wLzY0LjAgKTsKI2VuZGlmCiAgICB9CiAgfQp9CgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqICAgICAgICAgICAgUE9TVFNDUklQVCBISU5URVIgQUxHT1JJVEhNIDEgUk9VVElORVMgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDwuLi9zcmMvcHNoaW50ZXIvcHNoYWxnbzEuaD4KCnN0YXRpYyBpbnQgcHNoaW50X2Nwb3MgICAgID0gMDsKc3RhdGljIGludCBwc2hpbnRfdmVydGljYWwgPSAtMTsKCnN0YXRpYyB2b2lkCmRyYXdfcHMxX2hpbnQoIFBTSDFfSGludCAgIGhpbnQsIEZUX0Jvb2wgIHZlcnRpY2FsICkKewogIGludCAgICAgICAgeDEsIHgyOwogIE5WX1ZlY3RvciAgdjsKCgogIGlmICggcHNoaW50X3ZlcnRpY2FsICE9IHZlcnRpY2FsICkKICB7CiAgICBpZiAodmVydGljYWwpCiAgICAgIHBzaGludF9jcG9zID0gNDA7CiAgICBlbHNlCiAgICAgIHBzaGludF9jcG9zID0gMTA7CgogICAgcHNoaW50X3ZlcnRpY2FsID0gdmVydGljYWw7CiAgfQoKICBpZiAodmVydGljYWwpCiAgewogICAgaWYgKCAhb3B0aW9uX3Nob3dfdmVydF9oaW50cyApCiAgICAgIHJldHVybjsKCiAgICB2LnggPSBoaW50LT5jdXJfcG9zOwogICAgdi55ID0gMDsKICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgIHgxID0gKGludCkodi54ICsgMC41KTsKCiAgICB2LnggPSBoaW50LT5jdXJfcG9zICsgaGludC0+Y3VyX2xlbjsKICAgIHYueSA9IDA7CiAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICB4MiA9IChpbnQpKHYueCArIDAuNSk7CgogICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCB4MSwgMCwgMSwgdGFyZ2V0LT5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBwc2gxX2hpbnRfaXNfZ2hvc3QoaGludCkKICAgICAgICAgICAgICAgICAgICAgICAgID8gR0hPU1RfSElOVF9DT0xPUiA6IFNURU1fSElOVF9DT0xPUiApOwoKICAgIGlmICggcHNoMV9oaW50X2lzX2dob3N0KGhpbnQpICkKICAgIHsKICAgICAgeDEgLS07CiAgICAgIHgyID0geDEgKyAyOwogICAgfQogICAgZWxzZQogICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHgyLCAwLCAxLCB0YXJnZXQtPmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNoMV9oaW50X2lzX2dob3N0KGhpbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgID8gR0hPU1RfSElOVF9DT0xPUiA6IFNURU1fSElOVF9DT0xPUiApOwoKICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgeDEsIHBzaGludF9jcG9zLCB4MisxLXgxLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgU1RFTV9KT0lOX0NPTE9SICk7CiAgfQogIGVsc2UKICB7CiAgICBpZiAoIW9wdGlvbl9zaG93X2hvcnpfaGludHMpCiAgICAgIHJldHVybjsKCiAgICB2LnkgPSBoaW50LT5jdXJfcG9zOwogICAgdi54ID0gMDsKICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgIHgxID0gKGludCkodi55ICsgMC41KTsKCiAgICB2LnkgPSBoaW50LT5jdXJfcG9zICsgaGludC0+Y3VyX2xlbjsKICAgIHYueCA9IDA7CiAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICB4MiA9IChpbnQpKHYueSArIDAuNSk7CgogICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAwLCB4MSwgdGFyZ2V0LT53aWR0aCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBzaDFfaGludF9pc19naG9zdChoaW50KQogICAgICAgICAgICAgICAgICAgICAgICAgPyBHSE9TVF9ISU5UX0NPTE9SIDogU1RFTV9ISU5UX0NPTE9SICk7CgogICAgaWYgKCBwc2gxX2hpbnRfaXNfZ2hvc3QoaGludCkgKQogICAgewogICAgICB4MSAtLTsKICAgICAgeDIgPSB4MSArIDI7CiAgICB9CiAgICBlbHNlCiAgICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgMCwgeDIsIHRhcmdldC0+d2lkdGgsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzaDFfaGludF9pc19naG9zdChoaW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICA/IEdIT1NUX0hJTlRfQ09MT1IgOiBTVEVNX0hJTlRfQ09MT1IgKTsKCiAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHBzaGludF9jcG9zLCB4MiwgMSwgeDErMS14MiwKICAgICAgICAgICAgICAgICAgICAgICAgIFNURU1fSk9JTl9DT0xPUiApOwogIH0KCiNpZiAwCiAgcHJpbnRmKCAiWyU3LjNmICU3LjNmXSAlY1xuIiwgaGludC0+Y3VyX3Bvcy82NC4wLCAoaGludC0+Y3VyX3BvcytoaW50LT5jdXJfbGVuKS82NC4wLCB2ZXJ0aWNhbCA/ICd2JyA6ICdoJyApOwojZW5kaWYKCiAgcHNoaW50X2Nwb3MgKz0gMTA7Cn0KCgoKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgIFBPU1RTQ1JJUFQgSElOVEVSIEFMR09SSVRITSAyIFJPVVRJTkVTICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8Li4vc3JjL3BzaGludGVyL3BzaGFsZ28yLmg+CgpzdGF0aWMgdm9pZApkcmF3X3BzMl9oaW50KCBQU0gyX0hpbnQgICBoaW50LCBGVF9Cb29sICB2ZXJ0aWNhbCApCnsKICBpbnQgICAgICAgIHgxLCB4MjsKICBOVl9WZWN0b3IgIHY7CgogIGlmICggcHNoaW50X3ZlcnRpY2FsICE9IHZlcnRpY2FsICkKICB7CiAgICBpZiAodmVydGljYWwpCiAgICAgIHBzaGludF9jcG9zID0gNDA7CiAgICBlbHNlCiAgICAgIHBzaGludF9jcG9zID0gMTA7CgogICAgcHNoaW50X3ZlcnRpY2FsID0gdmVydGljYWw7CiAgfQoKICBpZiAodmVydGljYWwpCiAgewogICAgaWYgKCAhb3B0aW9uX3Nob3dfdmVydF9oaW50cyApCiAgICAgIHJldHVybjsKCiAgICB2LnggPSBoaW50LT5jdXJfcG9zOwogICAgdi55ID0gMDsKICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgIHgxID0gKGludCkodi54ICsgMC41KTsKCiAgICB2LnggPSBoaW50LT5jdXJfcG9zICsgaGludC0+Y3VyX2xlbjsKICAgIHYueSA9IDA7CiAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICB4MiA9IChpbnQpKHYueCArIDAuNSk7CgogICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCB4MSwgMCwgMSwgdGFyZ2V0LT5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBwc2gyX2hpbnRfaXNfZ2hvc3QoaGludCkKICAgICAgICAgICAgICAgICAgICAgICAgID8gR0hPU1RfSElOVF9DT0xPUiA6IFNURU1fSElOVF9DT0xPUiApOwoKICAgIGlmICggcHNoMl9oaW50X2lzX2dob3N0KGhpbnQpICkKICAgIHsKICAgICAgeDEgLS07CiAgICAgIHgyID0geDEgKyAyOwogICAgfQogICAgZWxzZQogICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHgyLCAwLCAxLCB0YXJnZXQtPmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNoMl9oaW50X2lzX2dob3N0KGhpbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgID8gR0hPU1RfSElOVF9DT0xPUiA6IFNURU1fSElOVF9DT0xPUiApOwoKICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgeDEsIHBzaGludF9jcG9zLCB4MisxLXgxLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgU1RFTV9KT0lOX0NPTE9SICk7CiAgfQogIGVsc2UKICB7CiAgICBpZiAoIW9wdGlvbl9zaG93X2hvcnpfaGludHMpCiAgICAgIHJldHVybjsKCiAgICB2LnkgPSBoaW50LT5jdXJfcG9zOwogICAgdi54ID0gMDsKICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgIHgxID0gKGludCkodi55ICsgMC41KTsKCiAgICB2LnkgPSBoaW50LT5jdXJfcG9zICsgaGludC0+Y3VyX2xlbjsKICAgIHYueCA9IDA7CiAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICB4MiA9IChpbnQpKHYueSArIDAuNSk7CgogICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAwLCB4MSwgdGFyZ2V0LT53aWR0aCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBzaDJfaGludF9pc19naG9zdChoaW50KQogICAgICAgICAgICAgICAgICAgICAgICAgPyBHSE9TVF9ISU5UX0NPTE9SIDogU1RFTV9ISU5UX0NPTE9SICk7CgogICAgaWYgKCBwc2gyX2hpbnRfaXNfZ2hvc3QoaGludCkgKQogICAgewogICAgICB4MSAtLTsKICAgICAgeDIgPSB4MSArIDI7CiAgICB9CiAgICBlbHNlCiAgICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgMCwgeDIsIHRhcmdldC0+d2lkdGgsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzaDJfaGludF9pc19naG9zdChoaW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICA/IEdIT1NUX0hJTlRfQ09MT1IgOiBTVEVNX0hJTlRfQ09MT1IgKTsKCiAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHBzaGludF9jcG9zLCB4MiwgMSwgeDErMS14MiwKICAgICAgICAgICAgICAgICAgICAgICAgIFNURU1fSk9JTl9DT0xPUiApOwogIH0KCiNpZiAwCiAgcHJpbnRmKCAiWyU3LjNmICU3LjNmXSAlY1xuIiwgaGludC0+Y3VyX3Bvcy82NC4wLCAoaGludC0+Y3VyX3BvcytoaW50LT5jdXJfbGVuKS82NC4wLCB2ZXJ0aWNhbCA/ICd2JyA6ICdoJyApOwojZW5kaWYKCiAgcHNoaW50X2Nwb3MgKz0gMTA7Cn0KCgpzdGF0aWMgdm9pZApwczJfZHJhd19jb250cm9sX3BvaW50cyggdm9pZCApCnsKICBpZiAoIHBzMl9kZWJ1Z19nbHlwaCApCiAgewogICAgUFNIMl9HbHlwaCAgICBnbHlwaCA9IHBzMl9kZWJ1Z19nbHlwaDsKICAgIFBTSDJfUG9pbnQgICAgcG9pbnQgPSBnbHlwaC0+cG9pbnRzOwogICAgRlRfVUludCAgICAgICBjb3VudCA9IGdseXBoLT5udW1fcG9pbnRzOwogICAgTlZfVHJhbnNmb3JtICB0cmFuc2Zvcm0sICp0cmFucyA9ICZ0cmFuc2Zvcm07CiAgICBOVl9QYXRoICAgICAgIHZlcnRfcmVjdDsKICAgIE5WX1BhdGggICAgICAgaG9yel9yZWN0OwogICAgTlZfUGF0aCAgICAgICBkb3QsIGNpcmNsZTsKCiAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgcG9pbnQrKyApCiAgICB7CiAgICAgIE5WX1ZlY3RvciAgdmVjOwoKICAgICAgdmVjLnggPSBwb2ludC0+Y3VyX3g7CiAgICAgIHZlYy55ID0gcG9pbnQtPmN1cl95OwogICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdmVjLCAmc2l6ZV90cmFuc2Zvcm0gKTsKCiAgICAgIG52X3RyYW5zZm9ybV9zZXRfdHJhbnNsYXRlKCB0cmFucywgdmVjLngsIHZlYy55ICk7CgogICAgICBpZiAoIG9wdGlvbl9zaG93X3Ntb290aCAmJiAhcHNoMl9wb2ludF9pc19zbW9vdGgocG9pbnQpICkKICAgICAgewogICAgICAgIG52X3BhaW50ZXJfc2V0X2NvbG9yKCBwYWludGVyLCBTTU9PVEhfQ09MT1IsIDI1NiApOwogICAgICAgIG52X3BhaW50ZXJfZmlsbF9wYXRoKCBwYWludGVyLCB0cmFucywgMCwgc3ltYm9sX2NpcmNsZSApOwogICAgICB9CgogICAgICBpZiAob3B0aW9uX3Nob3dfaG9yel9oaW50cykKICAgICAgewogICAgICAgIGlmICggcG9pbnQtPmZsYWdzX3kgJiBQU0gyX1BPSU5UX1NUUk9ORyApCiAgICAgICAgewogICAgICAgICAgbnZfcGFpbnRlcl9zZXRfY29sb3IoIHBhaW50ZXIsIFNUUk9OR19DT0xPUiwgMjU2ICk7CiAgICAgICAgICBudl9wYWludGVyX2ZpbGxfcGF0aCggcGFpbnRlciwgdHJhbnMsIDAsIHN5bWJvbF9yZWN0X2ggKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChvcHRpb25fc2hvd192ZXJ0X2hpbnRzKQogICAgICB7CiAgICAgICAgaWYgKCBwb2ludC0+ZmxhZ3NfeCAmIFBTSDJfUE9JTlRfU1RST05HICkKICAgICAgICB7CiAgICAgICAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgU1RST05HX0NPTE9SLCAyNTYgKTsKICAgICAgICAgIG52X3BhaW50ZXJfZmlsbF9wYXRoKCBwYWludGVyLCB0cmFucywgMCwgc3ltYm9sX3JlY3RfdiApOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKCnN0YXRpYyB2b2lkCnBzX3ByaW50X2hpbnRzKCB2b2lkICkKewogIGlmICggcHNfZGVidWdfaGludHMgKQogIHsKICAgIEZUX0ludCAgICAgICAgIGRpbWVuc2lvbjsKICAgIFBTSF9EaW1lbnNpb24gIGRpbTsKCiAgICBmb3IgKCBkaW1lbnNpb24gPSAxOyBkaW1lbnNpb24gPj0gMDsgZGltZW5zaW9uLS0gKQogICAgewogICAgICBQU19EaW1lbnNpb24gIGRpbSAgID0gJnBzX2RlYnVnX2hpbnRzLT5kaW1lbnNpb25bIGRpbWVuc2lvbiBdOwogICAgICBQU19NYXNrICAgICAgIG1hc2sgID0gZGltLT5tYXNrcy5tYXNrczsKICAgICAgRlRfVUludCAgICAgICBjb3VudCA9IGRpbS0+bWFza3MubnVtX21hc2tzOwoKICAgICAgcHJpbnRmKCAiJXMgaGludHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiwKICAgICAgICAgICAgICBkaW1lbnNpb24gPyAidmVydGljYWwiIDogImhvcml6b250YWwiICk7CgogICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgbWFzaysrICkKICAgICAgewogICAgICAgIEZUX1VJbnQgIGluZGV4OwoKICAgICAgICBwcmludGYoICJtYXNrIC0+ICVkXG4iLCBtYXNrLT5lbmRfcG9pbnQgKTsKICAgICAgICBmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbWFzay0+bnVtX2JpdHM7IGluZGV4KysgKQogICAgICAgIHsKICAgICAgICAgIGlmICggbWFzay0+Ynl0ZXNbIGluZGV4ID4+IDMgXSAmICgweDgwID4+IChpbmRleCAmIDcpKSApCiAgICAgICAgICB7CiAgICAgICAgICAgIFBTX0hpbnQgIGhpbnQgPSBkaW0tPmhpbnRzLmhpbnRzICsgaW5kZXg7CgogICAgICAgICAgICBwcmludGYoICIlYyBbJTNkICUzZCAoJTRkKV1cbiIsIGRpbWVuc2lvbiA/ICJ2IiA6ICJoIiwKICAgICAgICAgICAgICAgICAgICBoaW50LT5wb3MsIGhpbnQtPnBvcyArIGhpbnQtPmxlbiwgaGludC0+bGVuICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqICAgICAgICAgICAgQVVUT0hJTlRFUiBEUkFXSU5HIFJPVVRJTkVTICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBOVl9QYXRoCmFoX2xpbmtfcGF0aCggTlZfVmVjdG9yKiAgIHAxLAogICAgICAgICAgICAgIE5WX1ZlY3RvciogICBwNCwKICAgICAgICAgICAgICBOVl9Cb29sICAgICAgdmVydGljYWwgKQp7CiAgTlZfUGF0aFdyaXRlciAgd3JpdGVyOwogIE5WX1ZlY3RvciAgICAgIHAyLCBwMzsKICBOVl9QYXRoICAgICAgICBwYXRoLCBzdHJva2U7CgogIGlmICggdmVydGljYWwgKQogIHsKICAgIHAyLnggPSBwNC0+eDsKICAgIHAyLnkgPSBwMS0+eTsKCiAgICBwMy54ID0gcDEtPng7CiAgICBwMy55ID0gcDQtPnk7CiAgfQogIGVsc2UKICB7CiAgICBwMi54ID0gcDEtPng7CiAgICBwMi55ID0gcDQtPnk7CgogICAgcDMueCA9IHA0LT54OwogICAgcDMueSA9IHAxLT55OwogIH0KCiAgbnZfcGF0aF93cml0ZXJfbmV3KCByZW5kZXJlciwgJndyaXRlciApOwogIG52X3BhdGhfd3JpdGVyX21vdmV0byggd3JpdGVyLCBwMSApOwogIG52X3BhdGhfd3JpdGVyX2N1YmljdG8oIHdyaXRlciwgJnAyLCAmcDMsIHA0ICk7CiAgbnZfcGF0aF93cml0ZXJfZW5kKCB3cml0ZXIgKTsKCiAgcGF0aCA9IG52X3BhdGhfd3JpdGVyX2dldF9wYXRoKCB3cml0ZXIgKTsKICBudl9wYXRoX3dyaXRlcl9kZXN0cm95KCB3cml0ZXIgKTsKCiAgbnZfcGF0aF9zdHJva2UoIHBhdGgsIDEuLCBudl9wYXRoX2xpbmVjYXBfYnV0dCwgbnZfcGF0aF9saW5lam9pbl9yb3VuZCwgMS4sICAmc3Ryb2tlICk7CgogIG52X3BhdGhfZGVzdHJveSggcGF0aCApOwoKICByZXR1cm4gc3Ryb2tlOwp9CgoKc3RhdGljIHZvaWQKYWhfZHJhd19zbW9vdGhfcG9pbnRzKCB2b2lkICkKewogIGlmICggYWhfZGVidWdfaGludGVyICYmIG9wdGlvbl9zaG93X3Ntb290aCApCiAgewogICAgQUhfT3V0bGluZSogIGdseXBoID0gYWhfZGVidWdfaGludGVyLT5nbHlwaDsKICAgIEZUX1VJbnQgICAgICBjb3VudCA9IGdseXBoLT5udW1fcG9pbnRzOwogICAgQUhfUG9pbnQqICAgIHBvaW50ID0gZ2x5cGgtPnBvaW50czsKCiAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgU01PT1RIX0NPTE9SLCAyNTYgKTsKCiAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgcG9pbnQrKyApCiAgICB7CiAgICAgIGlmICggISggcG9pbnQtPmZsYWdzICYgYWhfZmxhZ193ZWFrX2ludGVycG9sYXRpb24gKSApCiAgICAgIHsKICAgICAgICBOVl9UcmFuc2Zvcm0gIHRyYW5zZm9ybSwgKnRyYW5zID0gJnRyYW5zZm9ybTsKICAgICAgICBOVl9WZWN0b3IgICAgIHZlYzsKCiAgICAgICAgdmVjLnggPSBwb2ludC0+eCAtIGFoX2RlYnVnX2hpbnRlci0+cHAxLng7CiAgICAgICAgdmVjLnkgPSBwb2ludC0+eTsKICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdmVjLCAmc2l6ZV90cmFuc2Zvcm0gKTsKCiAgICAgICAgbnZfdHJhbnNmb3JtX3NldF90cmFuc2xhdGUoICZ0cmFuc2Zvcm0sIHZlYy54LCB2ZWMueSApOwogICAgICAgIG52X3BhaW50ZXJfZmlsbF9wYXRoKCBwYWludGVyLCB0cmFucywgMCwgc3ltYm9sX2NpcmNsZSApOwogICAgICB9CiAgICB9CiAgfQp9CgoKc3RhdGljIHZvaWQKYWhfZHJhd19lZGdlcyggdm9pZCApCnsKICBpZiAoIGFoX2RlYnVnX2hpbnRlciApCiAgewogICAgQUhfT3V0bGluZSogIGdseXBoID0gYWhfZGVidWdfaGludGVyLT5nbHlwaDsKICAgIEZUX1VJbnQgICAgICBjb3VudDsKICAgIEFIX0VkZ2UqICAgICBlZGdlOwogICAgRlRfUG9zICAgICAgIHBwMSA9IGFoX2RlYnVnX2hpbnRlci0+cHAxLng7CgogICAgbnZfcGFpbnRlcl9zZXRfY29sb3IoIHBhaW50ZXIsIEVER0VfQ09MT1IsIDI1NiApOwoKICAgIGlmICggb3B0aW9uX3Nob3dfZWRnZXMgKQogICAgewogICAgICAvKiBkcmF3IHZlcnRpY2xhIGVkZ2VzICovCiAgICAgIGlmICggb3B0aW9uX3Nob3dfdmVydF9oaW50cyApCiAgICAgIHsKICAgICAgICBjb3VudCA9IGdseXBoLT5udW1fdmVkZ2VzOwogICAgICAgIGVkZ2UgID0gZ2x5cGgtPnZlcnRfZWRnZXM7CiAgICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIGVkZ2UrKyApCiAgICAgICAgewogICAgICAgICAgTlZfVmVjdG9yICAgICB2ZWM7CiAgICAgICAgICBOVl9Qb3MgICAgICAgIHg7CgogICAgICAgICAgdmVjLnggPSBlZGdlLT5wb3MgLSBwcDE7CiAgICAgICAgICB2ZWMueSA9IDA7CgogICAgICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnZlYywgJnNpemVfdHJhbnNmb3JtICk7CiAgICAgICAgICB4ID0gKEZUX1BvcykoIHZlYy54ICsgMC41ICk7CgogICAgICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCB4LCAwLCAxLCB0YXJnZXQtPmhlaWdodCwgRURHRV9DT0xPUiApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyogZHJhdyBob3Jpem9udGFsIGVkZ2VzICovCiAgICAgIGlmICggb3B0aW9uX3Nob3dfaG9yel9oaW50cyApCiAgICAgIHsKICAgICAgICBjb3VudCA9IGdseXBoLT5udW1faGVkZ2VzOwogICAgICAgIGVkZ2UgID0gZ2x5cGgtPmhvcnpfZWRnZXM7CiAgICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIGVkZ2UrKyApCiAgICAgICAgewogICAgICAgICAgTlZfVmVjdG9yICAgICB2ZWM7CiAgICAgICAgICBOVl9Qb3MgICAgICAgIHg7CgogICAgICAgICAgdmVjLnggPSAwOwogICAgICAgICAgdmVjLnkgPSBlZGdlLT5wb3M7CgogICAgICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnZlYywgJnNpemVfdHJhbnNmb3JtICk7CiAgICAgICAgICB4ID0gKEZUX1BvcykoIHZlYy55ICsgMC41ICk7CgogICAgICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAwLCB4LCB0YXJnZXQtPndpZHRoLCAxLCBFREdFX0NPTE9SICk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKCBvcHRpb25fc2hvd19zZWdtZW50cyApCiAgICB7CiAgICAgIC8qIGRyYXcgdmVydGljYWwgc2VnbWVudHMgKi8KICAgICAgaWYgKCBvcHRpb25fc2hvd192ZXJ0X2hpbnRzICkKICAgICAgewogICAgICAgIEFIX1NlZ21lbnQqICBzZWcgICA9IGdseXBoLT52ZXJ0X3NlZ21lbnRzOwogICAgICAgIEZUX1VJbnQgICAgICBjb3VudCA9IGdseXBoLT5udW1fdnNlZ21lbnRzOwoKICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgc2VnKysgKQogICAgICAgIHsKICAgICAgICAgIEFIX1BvaW50ICAqZmlyc3QsICpsYXN0OwogICAgICAgICAgTlZfVmVjdG9yICB2MSwgdjI7CiAgICAgICAgICBOVl9Qb3MgICAgIHkxLCB5MiwgeDsKCiAgICAgICAgICBmaXJzdCA9IHNlZy0+Zmlyc3Q7CiAgICAgICAgICBsYXN0ICA9IHNlZy0+bGFzdDsKCiAgICAgICAgICB2MS54ID0gdjIueCA9IGZpcnN0LT54IC0gcHAxOwoKICAgICAgICAgIGlmICggZmlyc3QtPnkgPD0gbGFzdC0+eSApCiAgICAgICAgICB7CiAgICAgICAgICAgIHYxLnkgPSBmaXJzdC0+eTsKICAgICAgICAgICAgdjIueSA9IGxhc3QtPnk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIHYxLnkgPSBsYXN0LT55OwogICAgICAgICAgICB2Mi55ID0gZmlyc3QtPnk7CiAgICAgICAgICB9CgogICAgICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYxLCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgICAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2MiwgJnNpemVfdHJhbnNmb3JtICk7CgogICAgICAgICAgeTEgPSAoTlZfUG9zKSggdjEueSArIDAuNSApOwogICAgICAgICAgeTIgPSAoTlZfUG9zKSggdjIueSArIDAuNSApOwogICAgICAgICAgeCAgPSAoTlZfUG9zKSggdjEueCArIDAuNSApOwoKICAgICAgICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgeC0xLCB5MiwgMywgQUJTKHkxLXkyKSsxLCBTRUdNRU5UX0NPTE9SICk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKiBkcmF3IGhvcml6b250YWwgc2VnbWVudHMgKi8KICAgICAgaWYgKCBvcHRpb25fc2hvd19ob3J6X2hpbnRzICkKICAgICAgewogICAgICAgIEFIX1NlZ21lbnQqICBzZWcgICA9IGdseXBoLT5ob3J6X3NlZ21lbnRzOwogICAgICAgIEZUX1VJbnQgICAgICBjb3VudCA9IGdseXBoLT5udW1faHNlZ21lbnRzOwoKICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgc2VnKysgKQogICAgICAgIHsKICAgICAgICAgIEFIX1BvaW50ICAqZmlyc3QsICpsYXN0OwogICAgICAgICAgTlZfVmVjdG9yICB2MSwgdjI7CiAgICAgICAgICBOVl9Qb3MgICAgIHkxLCB5MiwgeDsKCiAgICAgICAgICBmaXJzdCA9IHNlZy0+Zmlyc3Q7CiAgICAgICAgICBsYXN0ICA9IHNlZy0+bGFzdDsKCiAgICAgICAgICB2MS55ID0gdjIueSA9IGZpcnN0LT55OwoKICAgICAgICAgIGlmICggZmlyc3QtPnggPD0gbGFzdC0+eCApCiAgICAgICAgICB7CiAgICAgICAgICAgIHYxLnggPSBmaXJzdC0+eCAtIHBwMTsKICAgICAgICAgICAgdjIueCA9IGxhc3QtPnggLSBwcDE7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIHYxLnggPSBsYXN0LT54IC0gcHAxOwogICAgICAgICAgICB2Mi54ID0gZmlyc3QtPnggLSBwcDE7CiAgICAgICAgICB9CgogICAgICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYxLCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgICAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2MiwgJnNpemVfdHJhbnNmb3JtICk7CgogICAgICAgICAgeTEgPSAoTlZfUG9zKSggdjEueCArIDAuNSApOwogICAgICAgICAgeTIgPSAoTlZfUG9zKSggdjIueCArIDAuNSApOwogICAgICAgICAgeCAgPSAoTlZfUG9zKSggdjEueSArIDAuNSApOwoKICAgICAgICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgeTEsIHgtMSwgQUJTKHkxLXkyKSsxLCAzLCBTRUdNRU5UX0NPTE9SICk7CiAgICAgICAgfQogICAgICB9CgoKICAgICAgaWYgKCBvcHRpb25fc2hvd192ZXJ0X2hpbnRzICYmIG9wdGlvbl9zaG93X2xpbmtzICkKICAgICAgewogICAgICAgIEFIX1NlZ21lbnQqICBzZWcgICA9IGdseXBoLT52ZXJ0X3NlZ21lbnRzOwogICAgICAgIEZUX1VJbnQgICAgICBjb3VudCA9IGdseXBoLT5udW1fdnNlZ21lbnRzOwoKICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgc2VnKysgKQogICAgICAgIHsKICAgICAgICAgIEFIX1NlZ21lbnQqICBzZWcyID0gTlVMTDsKICAgICAgICAgIE5WX1BhdGggICAgICBsaW5rOwogICAgICAgICAgTlZfVmVjdG9yICAgIHYxLCB2MjsKCiAgICAgICAgICBpZiAoIHNlZy0+bGluayApCiAgICAgICAgICB7CiAgICAgICAgICAgIGlmICggc2VnLT5saW5rID4gc2VnICkKICAgICAgICAgICAgICBzZWcyID0gc2VnLT5saW5rOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAoIHNlZy0+c2VyaWYgKQogICAgICAgICAgICBzZWcyID0gc2VnLT5zZXJpZjsKCiAgICAgICAgICBpZiAoIHNlZzIgKQogICAgICAgICAgewogICAgICAgICAgICB2MS54ID0gc2VnLT5maXJzdC0+eCAgLSBwcDE7CiAgICAgICAgICAgIHYyLnggPSBzZWcyLT5maXJzdC0+eCAtIHBwMTsKICAgICAgICAgICAgdjEueSA9IChzZWctPmZpcnN0LT55ICsgc2VnLT5sYXN0LT55KS8yOwogICAgICAgICAgICB2Mi55ID0gKHNlZzItPmZpcnN0LT55ICsgc2VnMi0+bGFzdC0+eSkvMjsKCiAgICAgICAgICAgIGxpbmsgPSBhaF9saW5rX3BhdGgoICZ2MSwgJnYyLCAxICk7CgogICAgICAgICAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgc2VnLT5zZXJpZiA/IFNFUklGX0xJTktfQ09MT1IgOiBMSU5LX0NPTE9SLCAyNTYgKTsKICAgICAgICAgICAgbnZfcGFpbnRlcl9maWxsX3BhdGgoIHBhaW50ZXIsICZzaXplX3RyYW5zZm9ybSwgMCwgbGluayApOwoKICAgICAgICAgICAgbnZfcGF0aF9kZXN0cm95KCBsaW5rICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoIG9wdGlvbl9zaG93X2hvcnpfaGludHMgJiYgb3B0aW9uX3Nob3dfbGlua3MgKQogICAgICB7CiAgICAgICAgQUhfU2VnbWVudCogIHNlZyAgID0gZ2x5cGgtPmhvcnpfc2VnbWVudHM7CiAgICAgICAgRlRfVUludCAgICAgIGNvdW50ID0gZ2x5cGgtPm51bV9oc2VnbWVudHM7CgogICAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzZWcrKyApCiAgICAgICAgewogICAgICAgICAgQUhfU2VnbWVudCogIHNlZzIgPSBOVUxMOwogICAgICAgICAgTlZfUGF0aCAgICAgIGxpbms7CiAgICAgICAgICBOVl9WZWN0b3IgICAgdjEsIHYyOwoKICAgICAgICAgIGlmICggc2VnLT5saW5rICkKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKCBzZWctPmxpbmsgPiBzZWcgKQogICAgICAgICAgICAgIHNlZzIgPSBzZWctPmxpbms7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmICggc2VnLT5zZXJpZiApCiAgICAgICAgICAgIHNlZzIgPSBzZWctPnNlcmlmOwoKICAgICAgICAgIGlmICggc2VnMiApCiAgICAgICAgICB7CiAgICAgICAgICAgIHYxLnkgPSBzZWctPmZpcnN0LT55OwogICAgICAgICAgICB2Mi55ID0gc2VnMi0+Zmlyc3QtPnk7CiAgICAgICAgICAgIHYxLnggPSAoc2VnLT5maXJzdC0+eCArIHNlZy0+bGFzdC0+eCkvMiAtIHBwMTsKICAgICAgICAgICAgdjIueCA9IChzZWcyLT5maXJzdC0+eCArIHNlZzItPmxhc3QtPngpLzIgLSBwcDE7CgogICAgICAgICAgICBsaW5rID0gYWhfbGlua19wYXRoKCAmdjEsICZ2MiwgMCApOwoKICAgICAgICAgICAgbnZfcGFpbnRlcl9zZXRfY29sb3IoIHBhaW50ZXIsIHNlZy0+c2VyaWYgPyBTRVJJRl9MSU5LX0NPTE9SIDogTElOS19DT0xPUiwgMjU2ICk7CiAgICAgICAgICAgIG52X3BhaW50ZXJfZmlsbF9wYXRoKCBwYWludGVyLCAmc2l6ZV90cmFuc2Zvcm0sIDAsIGxpbmsgKTsKCiAgICAgICAgICAgIG52X3BhdGhfZGVzdHJveSggbGluayApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgIE1BSU4gTE9PUChTKSAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZApkcmF3X2dseXBoKCBpbnQgIGdseXBoX2luZGV4ICkKewogIE5WX1BhdGggICBwYXRoOwoKICBwc2hpbnRfdmVydGljYWwgICAgPSAtMTsKCiAgcHMxX2RlYnVnX2hpbnRfZnVuYyA9IG9wdGlvbl9zaG93X3BzX2hpbnRzID8gZHJhd19wczFfaGludCA6IDA7CiAgcHMyX2RlYnVnX2hpbnRfZnVuYyA9IG9wdGlvbl9zaG93X3BzX2hpbnRzID8gZHJhd19wczJfaGludCA6IDA7CgogIGFoX2RlYnVnX2hpbnRlciA9IE5VTEw7CgogIGVycm9yID0gRlRfTG9hZF9HbHlwaCggZmFjZSwgZ2x5cGhfaW5kZXgsIG9wdGlvbl9oaW50aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRlRfTE9BRF9OT19CSVRNQVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGVF9MT0FEX05PX0JJVE1BUCB8IEZUX0xPQURfTk9fSElOVElORyApOwogIGlmIChlcnJvcikgUGFuaWMoICJjb3VsZCBub3QgbG9hZCBnbHlwaCIgKTsKCiAgaWYgKCBmYWNlLT5nbHlwaC0+Zm9ybWF0ICE9IGZ0X2dseXBoX2Zvcm1hdF9vdXRsaW5lICkKICAgIFBhbmljKCAiY291bGQgbm90IGxvYWQgZ2x5cGggb3V0bGluZSIgKTsKCiAgZXJyb3IgPSBudl9wYXRoX25ld19mcm9tX291dGxpbmUoIHJlbmRlcmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlZfT3V0bGluZSopJmZhY2UtPmdseXBoLT5vdXRsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZV90cmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoICk7CiAgaWYgKGVycm9yKSBQYW5pYyggImNvdWxkIG5vdCBjcmVhdGUgZ2x5cGggcGF0aCIgKTsKCiAgLyogdHJhY+kgZHUgZ2x5cGhlIHBsZWluICovCiAgaWYgKCBvcHRpb25fc2hvd19nbHlwaCApCiAgewogICAgbnZfcGFpbnRlcl9zZXRfY29sb3IgKCBwYWludGVyLCAweEZGNDA0MDgwLCAxMjggKTsKICAgIG52X3BhaW50ZXJfZmlsbF9wYXRoICggcGFpbnRlciwgMCwgMCwgcGF0aCApOwogIH0KCiAgaWYgKCBvcHRpb25fc2hvd19zdHJva2UgKQogIHsKICAgIE5WX1BhdGggICBzdHJva2U7CgogICAgZXJyb3IgPSBudl9wYXRoX3N0cm9rZSggcGF0aCwgMC42LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnZfcGF0aF9saW5lY2FwX2J1dHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudl9wYXRoX2xpbmVqb2luX21pdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wLCAmc3Ryb2tlICk7CiAgICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IHN0cm9rZSBnbHlwaCBwYXRoIiApOwoKICAgIG52X3BhaW50ZXJfc2V0X2NvbG9yICggcGFpbnRlciwgMHhGRjAwMDA0MCwgMjU2ICk7CiAgICBudl9wYWludGVyX2ZpbGxfcGF0aCAoIHBhaW50ZXIsIDAsIDAsIHN0cm9rZSApOwoKICAgIG52X3BhdGhfZGVzdHJveSggc3Ryb2tlICk7CiAgfQoKICAvKiB0cmFj6SBkZXMgcG9pbnRzIGRlIGNvbnRyb2xlICovCiAgaWYgKCBvcHRpb25fc2hvd19kb3RzICkKICB7CiAgICBOVl9QYXRoICAgICBwbG90OwogICAgTlZfT3V0bGluZSAgb3V0OwogICAgTlZfU2NhbGUgICAgciA9IDI7CiAgICBOVl9JbnQgICAgICBuLCBmaXJzdCwgbGFzdDsKCiAgICBudl9wYXRoX2dldF9vdXRsaW5lKCBwYXRoLCBOVUxMLCBtZW1vcnksICZvdXQgKTsKCiAgICBmaXJzdCA9IDA7CiAgICBmb3IgKCBuID0gMDsgbiA8IG91dC5uX2NvbnRvdXJzOyBuKysgKQogICAgewogICAgICBpbnQgICAgICAgICAgICBtOwogICAgICBOVl9UcmFuc2Zvcm0gICB0cmFuczsKICAgICAgTlZfQ29sb3IgICAgICAgY29sb3I7CiAgICAgIE5WX1N1YlZlY3RvciogIHZlYzsKCiAgICAgIGxhc3QgID0gb3V0LmNvbnRvdXJzW25dOwoKICAgICAgZm9yICggbSA9IGZpcnN0OyBtIDw9IGxhc3Q7IG0rKyApCiAgICAgIHsKICAgICAgICBjb2xvciA9IChvdXQudGFnc1ttXSAmIEZUX0N1cnZlX1RhZ19PbikKICAgICAgICAgICAgICA/IE9OX0NPTE9SCiAgICAgICAgICAgICAgOiBPRkZfQ09MT1I7CgogICAgICAgIHZlYyA9IG91dC5wb2ludHMgKyBtOwoKICAgICAgICBudl90cmFuc2Zvcm1fc2V0X3RyYW5zbGF0ZSggJnRyYW5zLCB2ZWMtPngvNjQuMCwgdmVjLT55LzY0LjAgKTsKCiAgICAgICAgbnZfcGFpbnRlcl9zZXRfY29sb3IoIHBhaW50ZXIsIGNvbG9yLCAyNTYgKTsKICAgICAgICBudl9wYWludGVyX2ZpbGxfcGF0aCggcGFpbnRlciwgJnRyYW5zLCAwLCBzeW1ib2xfZG90ICk7CgogICAgICAgIGlmICggb3B0aW9uX3Nob3dfaW5kaWNlcyApCiAgICAgICAgewogICAgICAgICAgY2hhciAgdGVtcFs1XTsKCiAgICAgICAgICBzcHJpbnRmKCB0ZW1wLCAiJWQiLCBtICk7CiAgICAgICAgICBudl9waXhtYXBfY2VsbF90ZXh0KCB0YXJnZXQsIHZlYy0+eC82NCArIDQsIHZlYy0+eS82NCAtIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLCBURVhUX0NPTE9SICk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmaXJzdCA9IGxhc3QgKyAxOwogICAgfQogIH0KCiAgYWhfZHJhd19zbW9vdGhfcG9pbnRzKCk7CiAgYWhfZHJhd19lZGdlcygpOwoKICBudl9wYXRoX2Rlc3Ryb3koIHBhdGggKTsKCiAgLyogYXV0cmUgaW5mb3MgKi8KICB7CiAgICBjaGFyICB0ZW1wWzEwMjRdOwogICAgY2hhciAgdGVtcDJbNjRdOwoKICAgIHNwcmludGYoIHRlbXAsICJmb250IG5hbWUgOiAlcyAoJXMpIiwgZmFjZS0+ZmFtaWx5X25hbWUsIGZhY2UtPnN0eWxlX25hbWUgKTsKICAgIG52X3BpeG1hcF9jZWxsX3RleHQoIHRhcmdldCwgMCwgMCwgdGVtcCwgVEVYVF9DT0xPUiApOwoKICAgIEZUX0dldF9HbHlwaF9OYW1lKCBmYWNlLCBnbHlwaF9pbmRleCwgdGVtcDIsIDYzICk7CiAgICB0ZW1wMls2M10gPSAwOwoKICAgIHNwcmludGYoIHRlbXAsICJnbHlwaCAlNGQ6ICVzIiwgZ2x5cGhfaW5kZXgsIHRlbXAyICk7CiAgICBudl9waXhtYXBfY2VsbF90ZXh0KCB0YXJnZXQsIDAsIDgsIHRlbXAsIFRFWFRfQ09MT1IgKTsKCiAgICBpZiAoIHRlbXBfbWVzc2FnZVswXSApCiAgICB7CiAgICAgIG52X3BpeG1hcF9jZWxsX3RleHQoIHRhcmdldCwgMCwgMTYsIHRlbXBfbWVzc2FnZSwgVEVYVF9DT0xPUiApOwogICAgICB0ZW1wX21lc3NhZ2VbMF0gPSAwOwogICAgfQogIH0KfQoKCgojZGVmaW5lICBUT0dHTEVfT1BUSU9OKHZhcixwcmVmaXgpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIHZhciA9ICF2YXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIHNwcmludGYoIHRlbXBfbWVzc2FnZSwgcHJlZml4ICIgaXMgbm93ICVzIiwgICAgXAogICAgICAgICAgICAgICAgICAgICAgIHZhciA/ICJvbiIgOiAib2ZmIiApOyAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9CgoKI2RlZmluZSAgVE9HR0xFX09QVElPTl9ORUcodmFyLHByZWZpeCkgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICB2YXIgPSAhdmFyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBzcHJpbnRmKCB0ZW1wX21lc3NhZ2UsIHByZWZpeCAiIGlzIG5vdyAlcyIsICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAhdmFyID8gIm9uIiA6ICJvZmYiICk7ICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfQoKCnN0YXRpYyB2b2lkCmhhbmRsZV9ldmVudCggTlZWX0V2ZW50UmVjKiAgIGV2ICkKewogIHN3aXRjaCAoZXYtPmtleSkKICB7CiAgICBjYXNlIE5WVl9LZXlfTGVmdDoKICAgICAgewogICAgICAgIGlmICggZ2x5cGhfaW5kZXggPiAwICkKICAgICAgICAgIGdseXBoX2luZGV4LS07CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICBjYXNlIE5WVl9LZXlfUmlnaHQ6CiAgICAgIHsKICAgICAgICBpZiAoIGdseXBoX2luZGV4KzEgPCBmYWNlLT5udW1fZ2x5cGhzICkKICAgICAgICAgIGdseXBoX2luZGV4Kys7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICBjYXNlIE5WVl9LRVkoJ3gnKToKICAgICAgVE9HR0xFX09QVElPTiggb3B0aW9uX3Nob3dfYXhpcywgImdyaWQgYXhpcyBkaXNwbGF5IiApCgogICAgY2FzZSBOVlZfS0VZKCdzJyk6CiAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X3N0cm9rZSwgImdseXBoIHN0cm9rZSBkaXNwbGF5IiApCgogICAgY2FzZSBOVlZfS0VZKCdnJyk6CiAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X2dseXBoLCAiZ2x5cGggZmlsbCBkaXNwbGF5IiApCgogICAgY2FzZSBOVlZfS0VZKCdkJyk6CiAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X2RvdHMsICJjb250cm9sIHBvaW50cyBkaXNwbGF5IiApCgogICAgY2FzZSBOVlZfS0VZKCdlJyk6CiAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X2VtLCAiRU0gc3F1YXJlIGRpc3BsYXkiICkKCiAgICBjYXNlIE5WVl9LRVkoJysnKToKICAgICAgewogICAgICAgIGdyaWRfc2NhbGUgKj0gMS4yOwogICAgICAgIHJlc2V0X3NjYWxlKCBncmlkX3NjYWxlICk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICBjYXNlIE5WVl9LRVkoJy0nKToKICAgICAgewogICAgICAgIGlmIChncmlkX3NjYWxlID4gMC4zKQogICAgICAgIHsKICAgICAgICAgIGdyaWRfc2NhbGUgLz0gMS4yOwogICAgICAgICAgcmVzZXRfc2NhbGUoIGdyaWRfc2NhbGUgKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICBjYXNlIE5WVl9LZXlfVXA6CiAgICAgIHsKICAgICAgICBwaXhlbF9zaXplKys7CiAgICAgICAgcmVzZXRfc2l6ZSggcGl4ZWxfc2l6ZSwgZ3JpZF9zY2FsZSApOwogICAgICAgIHNwcmludGYoIHRlbXBfbWVzc2FnZSwgInBpeGVsIHNpemUgPSAlZCIsIHBpeGVsX3NpemUgKTsKICAgICAgICBicmVhazsKICAgICAgfQoKICAgIGNhc2UgTlZWX0tleV9Eb3duOgogICAgICB7CiAgICAgICAgaWYgKHBpeGVsX3NpemUgPiAxKQogICAgICAgIHsKICAgICAgICAgIHBpeGVsX3NpemUtLTsKICAgICAgICAgIHJlc2V0X3NpemUoIHBpeGVsX3NpemUsIGdyaWRfc2NhbGUgKTsKICAgICAgICAgIHNwcmludGYoIHRlbXBfbWVzc2FnZSwgInBpeGVsIHNpemUgPSAlZCIsIHBpeGVsX3NpemUgKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICBjYXNlIE5WVl9LRVkoJ3onKToKICAgICAgVE9HR0xFX09QVElPTl9ORUcoIHBzX2RlYnVnX25vX3ZlcnRfaGludHMsICJ2ZXJ0aWNhbCBoaW50cyBwcm9jZXNzaW5nIiApCgogICAgY2FzZSBOVlZfS0VZKCdhJyk6CiAgICAgIFRPR0dMRV9PUFRJT05fTkVHKCBwc19kZWJ1Z19ub19ob3J6X2hpbnRzLCAiaG9yaXpvbnRhbCBoaW50cyBwcm9jZXNzaW5nIiApCgogICAgY2FzZSBOVlZfS0VZKCdaJyk6CiAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X3ZlcnRfaGludHMsICJ2ZXJ0aWNhbCBoaW50cyBkaXNwbGF5IiApCgogICAgY2FzZSBOVlZfS0VZKCdBJyk6CiAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X2hvcnpfaGludHMsICJob3Jpem9udGFsIGhpbnRzIGRpc3BsYXkiICkKCiAgICBjYXNlIE5WVl9LRVkoJ1MnKToKICAgICAgVE9HR0xFX09QVElPTiggb3B0aW9uX3Nob3dfc21vb3RoLCAic21vb3RoIHBvaW50cyBkaXNwbGF5IiApOwoKICAgIGNhc2UgTlZWX0tFWSgnaScpOgogICAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd19pbmRpY2VzLCAicG9pbnQgaW5kZXggZGlzcGxheSIgKTsKCiAgICBjYXNlIE5WVl9LRVkoJ2InKToKICAgICAgVE9HR0xFX09QVElPTiggb3B0aW9uX3Nob3dfYmx1ZXMsICJibHVlIHpvbmVzIGRpc3BsYXkiICk7CgogICAgY2FzZSBOVlZfS0VZKCdoJyk6CiAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9oaW50aW5nLCAiaGludGluZyIgKQoKICAgIGNhc2UgTlZWX0tFWSgnSCcpOgogICAgICBwc19wcmludF9oaW50cygpOwogICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICA7CiAgfQp9CgoKCnN0YXRpYyB2b2lkCnVzYWdlKCkKewogIFBhbmljKCAibm8gdXNhZ2UiICk7Cn0KCgojZGVmaW5lICBPUFRJT04xKG4sY29kZSkgICBcCiAgICAgICAgICAgY2FzZSBuIDogICAgICAgIFwKICAgICAgICAgICAgIGNvZGUgICAgICAgICAgXAogICAgICAgICAgICAgYXJnYy0tOyAgICAgICBcCiAgICAgICAgICAgICBhcmd2Kys7ICAgICAgIFwKICAgICAgICAgICAgIGJyZWFrOwoKI2RlZmluZSAgT1BUSU9OMihuLGNvZGUpICAgICBcCiAgICAgICAgICAgY2FzZSBuIDogICAgICAgICAgXAogICAgICAgICAgICAgY29kZSAgICAgICAgICAgIFwKICAgICAgICAgICAgIGFyZ2MgLT0gMjsgICAgICBcCiAgICAgICAgICAgICBhcmd2ICs9IDI7ICAgICAgXAogICAgICAgICAgICAgYnJlYWs7CgoKc3RhdGljIHZvaWQKcGFyc2Vfb3B0aW9ucyggaW50KiAgYXJnY19wLCBjaGFyKioqIGFyZ3ZfcCApCnsKICBpbnQgICAgYXJnYyA9ICphcmdjX3A7CiAgY2hhcioqIGFyZ3YgPSAqYXJndl9wOwoKICB3aGlsZSAoYXJnYyA+IDIgJiYgYXJndlsxXVswXSA9PSAnLScpCiAgewogICAgc3dpdGNoIChhcmd2WzFdWzFdKQogICAgewogICAgICBPUFRJT04yKCAnZicsIGZpcnN0X2dseXBoID0gYXRvaSggYXJndlsyXSApOyApCgogICAgICBPUFRJT04yKCAncycsIHBpeGVsX3NpemUgPSBhdG9pKCBhcmd2WzJdICk7ICkKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdXNhZ2UoKTsKICAgIH0KICB9CgogICphcmdjX3AgPSBhcmdjOwogICphcmd2X3AgPSBhcmd2Owp9CgoKCmludCAgbWFpbiggaW50ICBhcmdjLCBjaGFyKiogIGFyZ3YgKQp7CiAgY2hhciogIGZpbGVuYW1lID0gIi93aW5udC9mb250cy9hcmlhbC50dGYiOwoKICBwYXJzZV9vcHRpb25zKCAmYXJnYywgJmFyZ3YgKTsKCiAgaWYgKCBhcmdjID49IDIgKQogICAgZmlsZW5hbWUgPSBhcmd2WzFdOwoKCiAgLyogY3JlYXRlIGxpYnJhcnkgKi8KICBlcnJvciA9IG52X3JlbmRlcmVyX25ldyggMCwgJnJlbmRlcmVyICk7CiAgaWYgKGVycm9yKSBQYW5pYyggImNvdWxkIG5vdCBjcmVhdGUgTmlydmFuYSByZW5kZXJlciIgKTsKCiAgbWVtb3J5ID0gbnZfcmVuZGVyZXJfZ2V0X21lbW9yeSggcmVuZGVyZXIgKTsKICBpbml0X3N5bWJvbHMoKTsKCiAgZXJyb3IgPSBudnZfZGlzcGxheV9uZXcoIHJlbmRlcmVyLCAmZGlzcGxheSApOwogIGlmIChlcnJvcikgUGFuaWMoICJjb3VsZCBub3QgY3JlYXRlIGRpc3BsYXkiICk7CgogIGVycm9yID0gbnZ2X3N1cmZhY2VfbmV3KCBkaXNwbGF5LCA0NjAsIDQ2MCwgbnZfcGl4bWFwX3R5cGVfYXJnYiwgJnN1cmZhY2UgKTsKICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IGNyZWF0ZSBzdXJmYWNlIiApOwoKICB0YXJnZXQgPSBudnZfc3VyZmFjZV9nZXRfcGl4bWFwKCBzdXJmYWNlICk7CgogIGVycm9yID0gbnZfcGFpbnRlcl9uZXcoIHJlbmRlcmVyLCAmcGFpbnRlciApOwogIGlmIChlcnJvcikgUGFuaWMoICJjb3VsZCBub3QgY3JlYXRlIHBhaW50ZXIiICk7CgogIG52X3BhaW50ZXJfc2V0X3RhcmdldCggcGFpbnRlciwgdGFyZ2V0ICk7CgogIGNsZWFyX2JhY2tncm91bmQoKTsKCiAgZXJyb3IgPSBGVF9Jbml0X0ZyZWVUeXBlKCAmZnJlZXR5cGUgKTsKICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IGluaXRpYWxpc2UgRnJlZVR5cGUiICk7CgogIGVycm9yID0gRlRfTmV3X0ZhY2UoIGZyZWV0eXBlLCBmaWxlbmFtZSwgMCwgJmZhY2UgKTsKICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IG9wZW4gZm9udCBmYWNlIiApOwoKICByZXNldF9zaXplKCBwaXhlbF9zaXplLCBncmlkX3NjYWxlICk7CgoKICBudnZfc3VyZmFjZV9zZXRfdGl0bGUoIHN1cmZhY2UsICJGcmVlVHlwZSBHbHlwaCBWaWV3ZXIiICk7CgogIHsKICAgIE5WVl9FdmVudFJlYyAgZXZlbnQ7CgogICAgZ2x5cGhfaW5kZXggPSBmaXJzdF9nbHlwaDsKICAgIGZvciAoIDs7ICkKICAgIHsKICAgICAgY2xlYXJfYmFja2dyb3VuZCgpOwogICAgICBkcmF3X2dyaWQoKTsKCiAgICAgIHBzX2RlYnVnX2hpbnRzICA9IDA7CiAgICAgIGFoX2RlYnVnX2hpbnRlciA9IDA7CgogICAgICBhaF9kZWJ1Z19kaXNhYmxlX3ZlcnQgPSBwc19kZWJ1Z19ub192ZXJ0X2hpbnRzOwogICAgICBhaF9kZWJ1Z19kaXNhYmxlX2hvcnogPSBwc19kZWJ1Z19ub19ob3J6X2hpbnRzOwoKICAgICAgZHJhd19wc19ibHVlX3pvbmVzKCk7CiAgICAgIGRyYXdfZ2x5cGgoIGdseXBoX2luZGV4ICk7CiAgICAgIHBzMl9kcmF3X2NvbnRyb2xfcG9pbnRzKCk7CgogICAgICBudnZfc3VyZmFjZV9yZWZyZXNoKCBzdXJmYWNlLCBOVUxMICk7CgogICAgICBudnZfc3VyZmFjZV9saXN0ZW4oIHN1cmZhY2UsIDAsICZldmVudCApOwogICAgICBpZiAoIGV2ZW50LmtleSA9PSBOVlZfS2V5X0VzYyApCiAgICAgICAgYnJlYWs7CgogICAgICBoYW5kbGVfZXZlbnQoICZldmVudCApOwogICAgICBzd2l0Y2ggKGV2ZW50LmtleSkKICAgICAgewogICAgICAgIGNhc2UgTlZWX0tleV9Fc2M6CiAgICAgICAgICBnb3RvIEV4aXQ7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICA7CiAgICAgIH0KICAgIH0KICB9CgogRXhpdDoKICAvKiB3YWl0IGZvciBlc2NhcGUgKi8KCgogIC8qIGRlc3Ryb3kgZGlzcGxheSAoYW5kIHN1cmZhY2UpICovCiAgbnZ2X2Rpc3BsYXlfdW5yZWYoIGRpc3BsYXkgKTsKCiAgZG9uZV9zeW1ib2xzKCk7CiAgbnZfcmVuZGVyZXJfdW5yZWYoIHJlbmRlcmVyICk7CgogIHJldHVybiAwOwp9Cg==