LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICBQUk9PRiBDSEVDS0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgTVBJIGZ1ZXIgSW5mb3JtYXRpayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgICogKi8KLyogKiAgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSAgICAgICAgKiAqLwovKiAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAgICAgICAqICovCi8qICogIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsICogKi8KLyogKiAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgICogKi8KLyogKiAgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiAgICAgKiAqLwovKiAqICB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyAgICAqICovCi8qICogIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljICogKi8KLyogKiAgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsICAgICogKi8KLyogKiAgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgKiAqLwovKiAqICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgICAgICAqICovCi8qICogIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAkUmV2aXNpb24kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogJFN0YXRlJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAkRGF0ZSQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogJEF1dGhvciQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgIENvbnRhY3Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgQ2hyaXN0b3BoIFdlaWRlbmJhY2ggICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICBNUEkgZnVlciBJbmZvcm1hdGlrICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgIFN0dWhsc2F0emVuaGF1c3dlZyA4NSAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgNjYxMjMgU2FhcmJydWVja2VuICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICBFbWFpbDogd2VpZGVuYkBtcGktc2IubXBnLmRlICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgIEdlcm1hbnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwoKLyogJFJDU2ZpbGUkICovCgojaW5jbHVkZSAicHJvb2ZjaGVjay5oIgoKCi8qIG9wdGlvbnMgKi8KaW50ICAgICAgICBwY2hlY2tfVGltZWxpbWl0Owpjb25zdCBjaGFyICpwY2hlY2tfUHJvb2ZGaWxlU3VmZml4OwpCT09MICAgICAgIHBjaGVja19RdWlldDsKCi8qIG9wdGlvbnMgZm9yIGdyYXBoIGdlbmVyYXRpb24gKi8KQk9PTCAgICAgICAgcGNoZWNrX0NsYXVzZUNnOwpCT09MICAgICAgICBwY2hlY2tfR2VuTmFtZWRDZywgcGNoZWNrX0dlblJlZENnOwpjb25zdCBjaGFyICAqcGNoZWNrX0NnTmFtZSwgKnBjaGVja19SZWRDZ05hbWU7CkdSQVBIRk9STUFUIHBjaGVja19HcmFwaEZvcm1hdDsKCgpzdGF0aWMgaW50IHBjaGVja19NYXhTcGxpdExldmVsKExJU1QgQ2xhdXNlcykKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSBsaXN0IG9mIGNsYXVzZXMuCiAgUkVUVVJOUzogVGhlIG1heGltdW0gc3BsaXQgbGV2ZWwgb2YgYSBjbGF1c2UuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIGludCBNYXg7CiAgaW50IEFjdDsKICAKICBNYXggPSAwOwogIHdoaWxlICghbGlzdF9FbXB0eShDbGF1c2VzKSkgewogICAgQWN0ID0gY2xhdXNlX1NwbGl0TGV2ZWwobGlzdF9DYXIoQ2xhdXNlcykpOwogICAgaWYgKEFjdCA+IE1heCkgCiAgICAgIE1heCA9IEFjdDsKICAgIENsYXVzZXMgPSBsaXN0X0NkcihDbGF1c2VzKTsKICB9CiAgcmV0dXJuIE1heDsKfQoKCnN0YXRpYyBfX2lubGluZV9fIGludCBwY2hlY2tfTWF4UGFyZW50U3BsaXRMZXZlbChDTEFVU0UgQ2xhdXNlKSAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSBjbGF1c2UKICBSRVRVUk5TOiBUaGUgbWF4IHNwbGl0IGxldmVsIG9mIHRoZSBwYXJlbnQgY2xhdXNlcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICByZXR1cm4gcGNoZWNrX01heFNwbGl0TGV2ZWwoY2xhdXNlX1BhcmVudENsYXVzZXMoQ2xhdXNlKSk7Cn0KCgpzdGF0aWMgQk9PTCBwY2hlY2tfQ2xhdXNlSXNGcm9tTGVmdFNwbGl0KENMQVVTRSBDbGF1c2UpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUICA6IEEgQ2xhdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgUkVUVVJOUzogVFJVRSBpZmYgdGhlIGNsYXVzZSBpcyB0aGUgbGVmdCBoYWxmIG9mIGEgc3BsaXQKICBDQVVUSU9OOiBUaGlzIHdvcmtzIGFsc28gZm9yIGNsYXVzZXMgd2l0aG91dCBwYXJlbnRzLCBzaW5jZQogICAgICAgICAgIHBjaGVja19NYXhQYXJlbnRTcGxpdExldmVsIHJldHVybnMgMCBpbiB0aGF0IGNhc2UuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIHJldHVybiAoY2xhdXNlX1NwbGl0TGV2ZWwoQ2xhdXNlKSA+IHBjaGVja19NYXhQYXJlbnRTcGxpdExldmVsKENsYXVzZSkpOwp9CgoKc3RhdGljIEJPT0wgcGNoZWNrX0NsYXVzZUlzRnJvbVJpZ2h0U3BsaXQoQ0xBVVNFIENsYXVzZSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSBjbGF1c2UKICBSRVRVUk5TOiBUUlVFIGlmZiB0aGUgY2xhdXNlIGlzIGZyb20gdGhlIHJpZ2h0IGhhbGYgb2YgYSBzcGxpdAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBpZiAobGlzdF9FbXB0eShjbGF1c2VfUGFyZW50Q2xhdXNlcyhDbGF1c2UpKSkKICAgIHJldHVybiBGQUxTRTsKCiAgcmV0dXJuIGNsYXVzZV9Jc0VtcHR5Q2xhdXNlKGxpc3RfQ2FyKGNsYXVzZV9QYXJlbnRDbGF1c2VzKENsYXVzZSkpKTsKfQoKc3RhdGljIEJPT0wgcGNoZWNrX0NsYXVzZUlzRnJvbVNwbGl0KENMQVVTRSBDbGF1c2UpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogSU5QVVQgIDogQSBjbGF1c2UKIFJFVFVSTlM6IFRSVUUgaWZmIHRoZSBjbGF1c2UgaXMgZnJvbSBhIHNwbGl0CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIHJldHVybiAocGNoZWNrX0NsYXVzZUlzRnJvbVJpZ2h0U3BsaXQoQ2xhdXNlKSB8fAoJICBwY2hlY2tfQ2xhdXNlSXNGcm9tTGVmdFNwbGl0KENsYXVzZSkpOwp9CgoKc3RhdGljIGludCBwY2hlY2tfTGFiZWxUb051bWJlcihjb25zdCBjaGFyKiBMYWJlbCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSBjbGF1c2UgbGFiZWwKICBSRVRVUk5TOiBUaGUgbGFiZWwgY29udmVydGVkIHRvIGEgbnVtYmVyLgogIEVGRkVDVDogIElmIHRoZSBjb252ZXJzaW9uIGZhaWxzIGFuIGVycm9yIG1lc3NhZ2UgaXMgcHJpbnRlZAogICAgICAgICAgIGFuZCB0aGUgcHJvZ3JhbSBleGl0cy4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgaW50IE51bWJlcjsKCiAgaWYgKCFzdHJpbmdfU3RyaW5nVG9JbnQoTGFiZWwsIEZBTFNFLCAmTnVtYmVyKSkgewogICAgbWlzY19TdGFydFVzZXJFcnJvclJlcG9ydCgpOwogICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIEluIHBjaGVja19MYWJlbFRvTnVtYmVyOiIpOwogICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIiBDb3VsZCBub3QgY29udmVydCBjbGF1c2UiKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCIgbGFiZWwgJXMgdG8gYSBudW1iZXIuXG4iLCBMYWJlbCk7CiAgICBtaXNjX0ZpbmlzaFVzZXJFcnJvclJlcG9ydCgpOwogIH0KCiAgcmV0dXJuIE51bWJlcjsKfQoKCnN0YXRpYyBpbnQgcGNoZWNrX0NvbXBhcmVOdW1iZXJBbmRDbGF1c2UoY29uc3Qgdm9pZCogTnVtYmVyLCBjb25zdCB2b2lkKiBDbGF1c2VQdHIpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIEEgbnVtYmVyIGFuZCBhIHBvaW50ZXIgdG8gYSBDTEFVU0UuCiAgUkVUVVJOUzogMSkgYSBuZWdhdGl2ZSBudW1iZXIgaWYgPG51bWJlcj4gaXMgPCBudW1iZXIgb2YgPENsYXVzZT4KICAgICAgICAgICAyKSAwIGlmIDxOdW1iZXI+IGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgPENsYXVzZT4KICAgICAgICAgICAzKSBhIHBvc2l0aXZlIG51bWJlciBpZiA8TnVtYmVyPiBpcyA+IG51bWJlciBvZiA8Q2xhdXNlPgogIEVGRkVDVDogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBwYXJhbWV0ZXIgdG8gdGhlIGJzZWFyY2ggZnVuY3Rpb24uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIHJldHVybiAoaW50KU51bWJlciAtIGNsYXVzZV9OdW1iZXIoKihjb25zdCBDTEFVU0UqKUNsYXVzZVB0cik7Cn0KCgpzdGF0aWMgdm9pZCBwY2hlY2tfUGFyZW50TnVtYmVyc1RvUG9pbnRlcnNJblZlY3RvcihDTEFVU0UqIENsYXVzZVZlY3RvciwgaW50IFNpemUpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIEEgY2xhdXNlIHZlY3RvciB3aXRob3V0IGR1cGxpY2F0ZSBjbGF1c2VzIGFuZCB0aGUgbWF4aW1hbAogICAgICAgICAgIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdmVjdG9yCiAgRUZGRUNUUzogQWxsIGNsYXVzZSBwYXJlbnQgbnVtYmVycyBhcmUgcmVwbGFjZWQgYnkgcG9pbnRlcnMKICAgICAgICAgICB0byB0aGUgcGFyZW50cy4KICBDQVVUSU9OOiBUaGUgY2xhdXNlIHZlY3RvciBoYXMgdG8gYmUgc29ydGVkIGJ5IGluY3JlYXNpbmcKICAgICAgICAgICBjbGF1c2UgbnVtYmVycywgc2luY2UgdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2gKICAgICAgICAgICBvbiB0aGUgdmVjdG9yLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBpbnQgICAgIFBvc2l0aW9uOwogIExJU1QgICAgTmV3UGFyZW50cywgT2xkUGFyZW50czsKICBMSVNUICAgIFNjYW5QYXJlbnRzOwogIGludCAgICAgUGFyZW50TnVtOwogIENMQVVTRSogUGFyZW50OwogIAogIGZvciAoUG9zaXRpb24gPSAwOyBQb3NpdGlvbiA8IFNpemU7IFBvc2l0aW9uKyspICB7CiAgICBPbGRQYXJlbnRzID0gY2xhdXNlX1BhcmVudENsYXVzZXMoQ2xhdXNlVmVjdG9yW1Bvc2l0aW9uXSk7CiAgICBOZXdQYXJlbnRzID0gbGlzdF9Db3B5KE9sZFBhcmVudHMpOwogICAgCiAgICBmb3IgKFNjYW5QYXJlbnRzID0gTmV3UGFyZW50czsgIWxpc3RfRW1wdHkoU2NhblBhcmVudHMpOyBTY2FuUGFyZW50cyA9IGxpc3RfQ2RyKFNjYW5QYXJlbnRzKSkgeyAgICAgCiAgICAgIFBhcmVudE51bSA9IChpbnQpbGlzdF9DYXIoU2NhblBhcmVudHMpOwogICAgICAvKiBCaW5hcnkgc2VhcmNoIGZvciBwYXJlbnQgY2xhdXNlIHdpdGggbnVtYmVyIDxQYXJlbnROdW0+LiAqLwogICAgICBQYXJlbnQgPSBic2VhcmNoKChjb25zdCB2b2lkKilQYXJlbnROdW0sIENsYXVzZVZlY3RvciwgU2l6ZSwKCQkgICAgICAgc2l6ZW9mKENMQVVTRSksIHBjaGVja19Db21wYXJlTnVtYmVyQW5kQ2xhdXNlKTsKICAgICAgaWYgKFBhcmVudCAhPSBOVUxMKQoJbGlzdF9ScGxhY2EoU2NhblBhcmVudHMsICpQYXJlbnQpOyAgCiAgICAgIGVsc2UgewoJbWlzY19TdGFydFVzZXJFcnJvclJlcG9ydCgpOwoJbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIEVycm9yOiBNaXNzaW5nIHBhcmVudCBjbGF1c2UgJWQgb2YgY2xhdXNlICVkLlxuIiwgCgkJCSAgICAgUGFyZW50TnVtLCBjbGF1c2VfTnVtYmVyKENsYXVzZVZlY3RvcltQb3NpdGlvbl0pKTsKCW1pc2NfRmluaXNoVXNlckVycm9yUmVwb3J0KCk7CiAgICAgIH0KICAgIH0gICAgCiAgICBjbGF1c2VfU2V0UGFyZW50Q2xhdXNlcyhDbGF1c2VWZWN0b3JbUG9zaXRpb25dLCBOZXdQYXJlbnRzKTsKICAgIGxpc3RfRGVsZXRlKE9sZFBhcmVudHMpOyAKICB9Cn0KCgpzdGF0aWMgTElTVCBwY2hlY2tfRm9yY2VQYXJlbnROdW1iZXJzVG9Qb2ludGVyc0luVmVjdG9yKENMQVVTRSogQ2xhdXNlVmVjdG9yLAoJCQkJCQkJaW50IFNpemUpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIEEgY2xhdXNlIHZlY3RvciwgcG9zc2libHkgd2l0aCBkdXBsaWNhdGVzCiAgUkVUVVJOUzogQWxsIG51bWJlcnMgb2YgY2xhdXNlcyA8Yz4gdGhhdCBhcmUgbWlzc2luZyBhIHBhcmVudCBjbGF1c2UKICAgICAgICAgICBmcm9tIHRoZSB0cmFuc2l0aXZlIGh1bGwgb2YgcGFyZW50IGNsYXVzZXMgb2YgPGM+LgogIEVGRkVDVFM6IEFsbCBNQVJLRUQgYW5kIEhJRERFTiBmbGFncyBvZiB0aGUgY2xhdXNlcyBhcmUgY2hhbmdlZC4KICAgICAgICAgICBBbGwgcGFyZW50IG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBwb2ludGVycywgaWYgdGhlCiAgICAgICAgICAgcGFyZW50cyBleGlzdCwgb3RoZXJ3aXNlIHRoZSBwYXJlbnQgbnVtYmVyIGlzIGRlbGV0ZWQKICAgICAgICAgICBmcm9tIHRoZSBsaXN0LgogICAgICAgICAgIFRoZSBwYXJlbnQgbGl0ZXJhbCBsaXN0IGlzIGNoYW5nZWQgYWNjb3JkaW5nbHkuCiAgICAgICAgICAgQSBjbGF1c2UgPGM+IGlzIG1hcmtlZCBhcyBISURERU4sIGlmIGFueSBjbGF1c2UKICAgICAgICAgICBmcm9tIHRoZSB0cmFuc2l0aXZlIGh1bGwgb2YgcGFyZW50IGNsYXVzZXMgb2YgPGM+CiAgICAgICAgICAgd2FzIG1pc3NpbmcgaW4gPENsYXVzZVZlY3Rvcj4uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIGludCAgICAgUG9zaXRpb247CiAgTElTVCAgICBOZXdQYXJlbnRzLCBOZXdQTGl0cywgUGFyZW50cywgUExpdHMsIE1pc3Npbmc7CiAgaW50ICAgICBQYXJlbnROdW0sIFBMaXROdW07CiAgQ0xBVVNFICAqUGFyZW50LCBDbGF1c2U7CgogIE1pc3NpbmcgPSBsaXN0X05pbCgpOwoKICBmb3IgKFBvc2l0aW9uID0gMDsgUG9zaXRpb24gPCBTaXplOyBQb3NpdGlvbisrKSB7CiAgICBjbGF1c2VfUmVtb3ZlRmxhZyhDbGF1c2VWZWN0b3JbUG9zaXRpb25dLCBNQVJLRUQpOyAKICAgIGNsYXVzZV9SZW1vdmVGbGFnKENsYXVzZVZlY3RvcltQb3NpdGlvbl0sIEhJRERFTik7CiAgfQoKICBmb3IgKFBvc2l0aW9uID0gMDsgUG9zaXRpb24gPCBTaXplOyBQb3NpdGlvbisrKSAgewogICAgQ2xhdXNlID0gQ2xhdXNlVmVjdG9yW1Bvc2l0aW9uXTsKICAgIGlmICghY2xhdXNlX0dldEZsYWcoQ2xhdXNlLCBNQVJLRUQpKSB7IAogICAgICBjbGF1c2VfU2V0RmxhZyhDbGF1c2UsIE1BUktFRCk7CiAgICAgIFBhcmVudHMgICAgPSBjbGF1c2VfUGFyZW50Q2xhdXNlcyhDbGF1c2UpOwogICAgICBQTGl0cyAgICAgID0gY2xhdXNlX1BhcmVudExpdGVyYWxzKENsYXVzZSk7CiAgICAgIE5ld1BhcmVudHMgPSBsaXN0X05pbCgpOwogICAgICBOZXdQTGl0cyAgID0gbGlzdF9OaWwoKTsKCiAgICAgIHdoaWxlICghbGlzdF9FbXB0eShQYXJlbnRzKSkgewoJUGFyZW50TnVtID0gKGludClsaXN0X0NhcihQYXJlbnRzKTsKCVBMaXROdW0gICA9IChpbnQpbGlzdF9DYXIoUExpdHMpOwoJLyogQmluYXJ5IHNlYXJjaCBmb3IgcGFyZW50IGNsYXVzZSB3aXRoIG51bWJlciA8UGFyZW50TnVtPi4gKi8KCVBhcmVudCA9IGJzZWFyY2goKGNvbnN0IHZvaWQqKVBhcmVudE51bSwgQ2xhdXNlVmVjdG9yLCBTaXplLAoJCQkgc2l6ZW9mKENMQVVTRSksIHBjaGVja19Db21wYXJlTnVtYmVyQW5kQ2xhdXNlKTsKCWlmIChQYXJlbnQgPT0gTlVMTCkgewoJICBNaXNzaW5nID0gbGlzdF9Db25zKChQT0lOVEVSKVBhcmVudE51bSwgTWlzc2luZyk7IAoJICBjbGF1c2VfU2V0RmxhZyhDbGF1c2UsIEhJRERFTik7Cgl9IGVsc2UgewoJICBpZiAoY2xhdXNlX0dldEZsYWcoKlBhcmVudCwgSElEREVOKSkKCSAgICBjbGF1c2VfU2V0RmxhZyhDbGF1c2UsIEhJRERFTik7CgkgIE5ld1BhcmVudHMgID0gbGlzdF9Db25zKChQT0lOVEVSKSpQYXJlbnQsIE5ld1BhcmVudHMpOwoJICBOZXdQTGl0cyAgICA9IGxpc3RfQ29ucygoUE9JTlRFUilQTGl0TnVtLCBOZXdQTGl0cyk7Cgl9CglQYXJlbnRzID0gbGlzdF9DZHIoUGFyZW50cyk7IAoJUExpdHMgICA9IGxpc3RfQ2RyKFBMaXRzKTsKICAgICAgfQogICAgICBsaXN0X0RlbGV0ZShjbGF1c2VfUGFyZW50Q2xhdXNlcyhDbGF1c2UpKTsKICAgICAgbGlzdF9EZWxldGUoY2xhdXNlX1BhcmVudExpdGVyYWxzKENsYXVzZSkpOwogICAgICBOZXdQYXJlbnRzID0gbGlzdF9OUmV2ZXJzZShOZXdQYXJlbnRzKTsKICAgICAgTmV3UExpdHMgICA9IGxpc3RfTlJldmVyc2UoTmV3UExpdHMpOwogICAgICBjbGF1c2VfU2V0UGFyZW50Q2xhdXNlcyhDbGF1c2UsIE5ld1BhcmVudHMpOwogICAgICBjbGF1c2VfU2V0UGFyZW50TGl0ZXJhbHMoQ2xhdXNlLCBOZXdQTGl0cyk7CiAgICB9IC8qIGlmIGNsYXVzZSBpcyBub3QgbWFya2VkICovCiAgfSAvKiBmb3IgYWxsIGNsYXVzZXMgKi8KIAogIHJldHVybiBNaXNzaW5nOwp9CgoKc3RhdGljIGludCBwY2hlY2tfQ29tcGFyZUNsYXVzZU51bWJlcihjb25zdCB2b2lkKiBDMSwgY29uc3Qgdm9pZCogQzIpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUICA6IFR3byBwb2ludGVycyB0byBDTEFVU0VzLgogIFJFVFVSTlM6IDEpIGEgbmVnYXRpdmUgbnVtYmVyIGlmIHRoZSBudW1iZXIgb2YgQzEgaXMgPCBudW1iZXIgb2YgQzIuCiAgICAgICAgICAgMikgMCBpZiBDMSBhbmQgQzIgaGF2ZSB0aGUgc2FtZSBjbGF1c2UgbnVtYmVyCiAgICAgICAgICAgICAgKHRoYXQgbWVhbnMgYSBwb3NzaWJsZSBidWcgaW4gU1BBU1MpCiAgICAgICAgICAgMykgYSBwb3NpdGl2ZSBudW1iZXIgaWYgbnVtYmVyIG9mIEMxID4gbnVtYmVyIG9mIEMyCiAgRUZGRUNUOiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFzIHBhcmFtZXRlciB0byB0aGUgcXNvcnQgZnVuY3Rpb24uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIHJldHVybiBjbGF1c2VfTnVtYmVyKCooY29uc3QgQ0xBVVNFKilDMSkgLSBjbGF1c2VfTnVtYmVyKCooY29uc3QgQ0xBVVNFKilDMik7Cn0KCgpzdGF0aWMgTElTVCBwY2hlY2tfQ29udmVydFBhcmVudHNJbkxpc3QoTElTVCBMaXN0KQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIGxpc3Qgb2YgY2xhdXNlcy4KICBSRVRVUk5TOiBUaGUgbGlzdCBvZiBtaXNzaW5nIHBhcmVudCBjbGF1c2UgbnVtYmVycyBmcm9tIHRoZSBsaXN0IAogIEVGRkVDVFM6IFBhcmVudCBudW1iZXJzIGFyZSBjb252ZXJ0ZWQgdG8gcG9pbnRlcnMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgaW50ICAgICBTaXplLCBJbmRleDsKICBDTEFVU0UqIENsYXVzZVZlY3RvcjsKICBMSVNUICAgIE1pc3Npbmc7CgogIFNpemUgPSBsaXN0X0xlbmd0aChMaXN0KTsKICBpZiAoU2l6ZSA9PSAwKQogICAgcmV0dXJuIGxpc3RfTmlsKCk7CgogIC8qIGNvbnZlcnQgbGlzdCBpbnRvIHZlY3RvciBmb3IgYmluYXJ5IHNlYXJjaCAqLwogIENsYXVzZVZlY3RvciA9IChDTEFVU0UqKW1lbW9yeV9NYWxsb2Moc2l6ZW9mKENMQVVTRSkgKiBTaXplKTsKICBmb3IgKEluZGV4ID0gMDsgIWxpc3RfRW1wdHkoTGlzdCk7IExpc3QgPSBsaXN0X0NkcihMaXN0KSwgSW5kZXgrKykKICAgIENsYXVzZVZlY3RvcltJbmRleF0gPSBsaXN0X0NhcihMaXN0KTsKCiAgLyogc29ydCB0aGUgY2xhdXNlcyBpbiB2ZWN0b3IgYnkgaW5jcmVhc2luZyBjbGF1c2UgbnVtYmVyICovCiAgcXNvcnQoQ2xhdXNlVmVjdG9yLCBTaXplLCBzaXplb2YoQ0xBVVNFKSwgcGNoZWNrX0NvbXBhcmVDbGF1c2VOdW1iZXIpOwoKICAvKiBjb252ZXJ0IHBhcmVudCBsaXN0cyAqLwogIE1pc3NpbmcgPSBwY2hlY2tfRm9yY2VQYXJlbnROdW1iZXJzVG9Qb2ludGVyc0luVmVjdG9yKENsYXVzZVZlY3RvciwgU2l6ZSk7CiAgCiAgbWVtb3J5X0ZyZWUoQ2xhdXNlVmVjdG9yLCBzaXplb2YoQ0xBVVNFKSAqIFNpemUpOwogIHJldHVybiBNaXNzaW5nOwp9CgoKTElTVCBwY2hlY2tfQ29udmVydFBhcmVudHNJblNQQVNTUHJvb2YoUFJPT0ZTRUFSQ0ggU2VhcmNoLCBMSVNUIEVtcHR5Q2xhdXNlcykgCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUICA6IEEgcHJvb2ZzZWFyY2ggb2JqZWN0IHdpdGggY2xhdXNlcyBzb3J0ZWQgYnkgd2VpZ2h0CiAgICAgICAgICAgYW5kIGFuIHVuc29ydGVkIGxpc3QgPEVtcHR5Q2xhdXNlcz4KICBSRVRVUk5TOiBUaGUgbGlzdHMsIHdoZXJlIHRoZSBjbGF1c2VzIGluIDxFbXB0eUNsYXVzZXM+IGFyZQogICAgICAgICAgIG5vdyBzb3J0ZWQgYnkgd2VpZ2h0LCBhbmQgcGFyZW50IG51bWJlcnMKICAgICAgICAgICBpbiB0aGUgY2xhdXNlcyBhcmUgcmVwbGFjZWQgYnkgcGFyZW50IHBvaW50ZXJzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIExJU1QgICAgQWxsTGlzdHM7IAogIExJU1QgICAgTWlzc2luZzsKCiAgQWxsTGlzdHMgPSBsaXN0X05jb25jKGxpc3RfQ29weShwcmZzX0RvY1Byb29mQ2xhdXNlcyhTZWFyY2gpKSwKCQkJbGlzdF9Db3B5KEVtcHR5Q2xhdXNlcykpOwogIEFsbExpc3RzID0gbGlzdF9OY29uYyhsaXN0X0NvcHkocHJmc19Vc2FibGVDbGF1c2VzKFNlYXJjaCkpLCBBbGxMaXN0cyk7CiAgQWxsTGlzdHMgPSBsaXN0X05jb25jKGxpc3RfQ29weShwcmZzX1dvcmtlZE9mZkNsYXVzZXMoU2VhcmNoKSksIEFsbExpc3RzKTsKICAKICBBbGxMaXN0cyA9IHBjaGVja19DbGF1c2VOdW1iZXJNZXJnZVNvcnQoQWxsTGlzdHMpOwogIE1pc3NpbmcgID0gcGNoZWNrX0NvbnZlcnRQYXJlbnRzSW5MaXN0KEFsbExpc3RzKTsKICBsaXN0X0RlbGV0ZShBbGxMaXN0cyk7CgogIHJldHVybiBNaXNzaW5nOwp9CgoKc3RhdGljIExJU1QgcGNoZWNrX1BhcmVudE51bWJlcnNUb1BhcmVudHMoTElTVCBQcm9vZikKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSBsaXN0IG9mIGNsYXVzZXMsIHJlcHJlc2VudGluZyBhIHByb29mLgogIFJFVFVSTlM6IFRoZSBsaXN0LCB3aGVyZSBwYXJlbnQgbnVtYmVycyBpbiB0aGUKICAgICAgICAgICBwYXJlbnQgbGlzdCBvZiBjbGF1c2VzIGFyZSByZXBsYWNlZAogICAgICAgICAgIGJ5IHRoZSBwYXJlbnRzIChwb2ludGVycykuCiAgQ0FVVElPTjogRm9yIGZpbmRpbmcgdGhlIGNsYXVzZSBjb3JyZXNwb25kaW5nIHRvIGEKICAgICAgICAgICBhIGNsYXVzZSBudW1iZXIsIHRoZSA8UHJvb2Y+IGxpc3QgaXMgc2VhcmNoZWQKCSAgIHdpdGggYmluYXJ5IHNlYXJjaC4gVGhpcyBpcyBjb3JyZWN0IG9ubHkgaWYKCSAgIHRoZSBjbGF1c2UgbnVtYmVycyBpbiA8UHJvb2Y+IGFyZSBpbmNyZWFzaW5nLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBMSVNUICAgIFNjYW5DbGF1c2VzOwogIGludCAgICAgUHJvb2ZMZW5ndGgsIFBvc2l0aW9uOwogIENMQVVTRSogQ2xhdXNlVmVjdG9yOwoKICBpZiAobGlzdF9FbXB0eShQcm9vZikpCiAgICByZXR1cm4gbGlzdF9OaWwoKTsKCiAgLyogY29udmVydCBsaXN0IGludG8gdmVjdG9yIGZvciBiaW5hcnkgc2VhcmNoICovCiAgUHJvb2ZMZW5ndGggID0gbGlzdF9MZW5ndGgoUHJvb2YpOwogIENsYXVzZVZlY3RvciA9IChDTEFVU0UqKSBtZW1vcnlfTWFsbG9jKFByb29mTGVuZ3RoICogc2l6ZW9mKENMQVVTRSkpOwoKICBmb3IgKFNjYW5DbGF1c2VzID0gUHJvb2YsIFBvc2l0aW9uID0gMDsgIWxpc3RfRW1wdHkoU2NhbkNsYXVzZXMpOwogICAgICAgU2NhbkNsYXVzZXMgPSBsaXN0X0NkcihTY2FuQ2xhdXNlcyksIFBvc2l0aW9uKyspIHsKICAgIENsYXVzZVZlY3RvcltQb3NpdGlvbl0gPSBsaXN0X0NhcihTY2FuQ2xhdXNlcyk7CiAgfQoKICAvKiBzb3J0IHRoZSBjbGF1c2VzIGluIHZlY3RvciBieSBpbmNyZWFzaW5nIGNsYXVzZSBudW1iZXIgKi8KICBxc29ydChDbGF1c2VWZWN0b3IsIFByb29mTGVuZ3RoLCBzaXplb2YoQ0xBVVNFKSwgcGNoZWNrX0NvbXBhcmVDbGF1c2VOdW1iZXIpOwogCiAgLyogY29udmVydCBwYXJlbnQgbGlzdHMgKi8KICBwY2hlY2tfUGFyZW50TnVtYmVyc1RvUG9pbnRlcnNJblZlY3RvcihDbGF1c2VWZWN0b3IsIFByb29mTGVuZ3RoKTsKIAogIG1lbW9yeV9GcmVlKENsYXVzZVZlY3RvciwgUHJvb2ZMZW5ndGggKiBzaXplb2YoQ0xBVVNFKSk7CgogIHJldHVybiBQcm9vZjsKfQoKCkxJU1QgcGNoZWNrX1BhcmVudFBvaW50ZXJzVG9QYXJlbnROdW1iZXJzKExJU1QgQ2xhdXNlcykKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBJTlBVVCAgOiBBIGxpc3Qgb2YgY2xhdXNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogUkVUVVJOUzogVGhlIGxpc3Qgd2l0aCBwYXJlbnQgcG9pbnRlcnMgcmVwbGFjZWQgYnkKICAgICAgICAgIHBhcmVudCBudW1iZXJzCiBFRkZFQ1RTOiBTZXRzIG1hcmtzIG9uIGFsbCBjbGF1c2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgTElTVCBTY2FuQ2xhdXNlczsKICBMSVNUIFNjYW5QYXJlbnRzOwoKICBwY2hlY2tfQ2xhdXNlTGlzdFJlbW92ZUZsYWcoQ2xhdXNlcywgTUFSS0VEKTsKCiAgZm9yIChTY2FuQ2xhdXNlcyA9IENsYXVzZXM7ICFsaXN0X0VtcHR5KFNjYW5DbGF1c2VzKTsgU2NhbkNsYXVzZXMgPSBsaXN0X0NkcihTY2FuQ2xhdXNlcykpIHsKICAgIGlmICghY2xhdXNlX0dldEZsYWcobGlzdF9DYXIoU2NhbkNsYXVzZXMpLCBNQVJLRUQpKSB7CiAgICAgIGZvciAoU2NhblBhcmVudHMgPSBjbGF1c2VfUGFyZW50Q2xhdXNlcyhsaXN0X0NhcihTY2FuQ2xhdXNlcykpOyAhbGlzdF9FbXB0eShTY2FuUGFyZW50cyk7CgkgICBTY2FuUGFyZW50cyA9IGxpc3RfQ2RyKFNjYW5QYXJlbnRzKSkKCWxpc3RfUnBsYWNhKFNjYW5QYXJlbnRzLCAoUE9JTlRFUiljbGF1c2VfTnVtYmVyKGxpc3RfQ2FyKFNjYW5QYXJlbnRzKSkpOyAKICAgICAgY2xhdXNlX1NldEZsYWcobGlzdF9DYXIoU2NhbkNsYXVzZXMpLCBNQVJLRUQpOwogICAgfQogIH0KICByZXR1cm4gQ2xhdXNlczsKfQoKCkxJU1QgcGNoZWNrX0NvbnZlcnRUZXJtTGlzdFRvQ2xhdXNlTGlzdChMSVNUIFByb29mUmVzdCwgRkxBR1NUT1JFIEZsYWdzLAoJCQkJCVBSRUNFREVOQ0UgUHJlY2VkZW5jZSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSBsaXN0IG9mIHF1aW50dXBlbHMgKGxpc3RzKSByZXByZXNlbnRpbmcgYSBwcm9vZiwKICAgICAgICAgICBhIGZsYWcgc3RvcmUsIGFuZCBhIHByZWNlZGVuY2UuCiAgUkVUVVJOUzogVGhlIGNvbnZlcnNpb24gb2YgdGhpcyBsaXN0IGludG8gdGhlIGludGVybmFsIGNsYXVzZQogICAgICAgICAgIHN0cnVjdHVyZS4gRm9yIGVhY2ggY2xhdXNlLCB0aGUgbnVtYmVycyBvZiBwYXJlbnQKCSAgIGNsYXVzZXMgYXJlIHJlcGxhY2VkIGJ5IHBvaW50ZXJzIHRvIHRoZSBwYXJlbnRzLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBMSVNUICAgIENsYXVzZXM7CiAgTElTVCAgICBQcm9vZkxpbmU7CiAgVEVSTSAgICBDbGF1c2VUZXJtOwogIENMQVVTRSAgQ2xhdXNlOwogIGludCAgICAgTGV2ZWw7CiAgaW50ICAgICBDbGF1c2VOdW1iZXI7CiAgTElTVCAgICBQYXJlbnRMYWJlbHM7CiAgTElTVCAgICBQYXJlbnRJZHM7ICAgICAKICBMSVNUICAgIFBhcmVudExpdHM7ICAgIC8qIHRoaXMgaXMgYSBkdW1teSBsaXN0OyBwYXJlbnQgbGl0cyBhcmUgbm90IHlldCBzcGVjaWZpZWQgaW4gYSBTUEFTUyBwcm9vZiAqLwogIFJVTEUgICAgT3JpZ2luOwogIGNoYXIqICAgQ2xhdXNlTGFiZWw7CgogIENsYXVzZXMgPSBsaXN0X05pbCgpOyAgLyogcmVzdWx0ICovCgogIHdoaWxlICghbGlzdF9FbXB0eShQcm9vZlJlc3QpKSB7ICAgIAogICAgLyogYnJlYWsgcHJvb2YgbGluZSBpbnRvIGNvbXBvbmVudHMgKi8KICAgIFByb29mTGluZSAgICAgPSBsaXN0X0NhcihQcm9vZlJlc3QpOwogICAgCiAgICBDbGF1c2VMYWJlbCAgID0gbGlzdF9GaXJzdChQcm9vZkxpbmUpOwogICAgQ2xhdXNlVGVybSAgICA9IGxpc3RfU2Vjb25kKFByb29mTGluZSk7ICAgIAogICAgLyogcmVwbGFjZSBieSBOVUxMIGNsYXVzZSwgc2luY2UgZGZnX0NyZWF0ZUNsYXVzZUZyb21UZXJtIGRlbGV0ZXMgY2xhdXNlICEgKi8KICAgIGxpc3RfUnBsYWNhKGxpc3RfQ2RyKFByb29mTGluZSksIGNsYXVzZV9OdWxsKCkpOyAKICAgIFBhcmVudExhYmVscyAgPSAoTElTVClsaXN0X1RoaXJkKFByb29mTGluZSk7CiAgICBMZXZlbCAgICAgICAgID0gKGludClsaXN0X0ZvdXJ0aChQcm9vZkxpbmUpOwogICAgT3JpZ2luICAgICAgICA9IChSVUxFKWxpc3RfRmlmdGgoUHJvb2ZMaW5lKTsKCiAgICAvKiBDb252ZXJzaW9uICovCiAgICBDbGF1c2UgICAgICAgPSBkZmdfQ3JlYXRlQ2xhdXNlRnJvbVRlcm0oQ2xhdXNlVGVybSwgVFJVRSwgRmxhZ3MsUHJlY2VkZW5jZSk7CiAgICAvKiBJdCdzIG5lY2Vzc2FyeSB0byB1cGRhdGUgdGhlIHdlaWdodCBzaW5jZSBkZmdfQ3JlYXRlQ2xhdXNlRnJvbVRlcm0gKi8KICAgIC8qIGRvZXNuJ3Qgc2V0IGl0LiAqLwogICAgY2xhdXNlX1VwZGF0ZVdlaWdodChDbGF1c2UsIEZsYWdzKTsKICAgIENsYXVzZU51bWJlciA9IHBjaGVja19MYWJlbFRvTnVtYmVyKENsYXVzZUxhYmVsKTsKICAgIFBhcmVudElkcyAgICA9IGxpc3RfTmlsKCk7CiAgICBQYXJlbnRMaXRzICAgPSBsaXN0X05pbCgpOwoKICAgIHdoaWxlICghbGlzdF9FbXB0eShQYXJlbnRMYWJlbHMpKSB7CiAgICAgIFBhcmVudElkcyAgPSBsaXN0X0NvbnMoKFBPSU5URVIpcGNoZWNrX0xhYmVsVG9OdW1iZXIobGlzdF9DYXIoUGFyZW50TGFiZWxzKSksIFBhcmVudElkcyk7IAogICAgICBQYXJlbnRMaXRzID0gbGlzdF9Db25zKDAsIFBhcmVudExpdHMpOwogICAgICBQYXJlbnRMYWJlbHMgICA9IGxpc3RfQ2RyKFBhcmVudExhYmVscyk7CiAgICB9CiAgICAKICAgIC8qIHNldCBhbGwgZGF0YSAqLwogICAgY2xhdXNlX1NldE51bWJlcihDbGF1c2UsIENsYXVzZU51bWJlcik7CiAgICBQYXJlbnRJZHMgPSBsaXN0X05SZXZlcnNlKFBhcmVudElkcyk7CiAgICBjbGF1c2VfU2V0UGFyZW50Q2xhdXNlcyhDbGF1c2UsIFBhcmVudElkcyk7CiAgICBjbGF1c2VfU2V0UGFyZW50TGl0ZXJhbHMoQ2xhdXNlLCBQYXJlbnRMaXRzKTsKICAgIENsYXVzZS0+b3JpZ2luID0gT3JpZ2luOwoKICAgIGNsYXVzZV9TZXRTcGxpdExldmVsKENsYXVzZSwgTGV2ZWwpOyAKICAgIGlmIChMZXZlbCA+IDApIHsKICAgICAgY2xhdXNlX0NsZWFyU3BsaXRGaWVsZChDbGF1c2UpOwogICAgICBjbGF1c2VfU2V0U3BsaXRGaWVsZEJpdChDbGF1c2UsIExldmVsKTsKICAgIH0gZWxzZSAKICAgICAgY2xhdXNlX1NldFNwbGl0RmllbGQoQ2xhdXNlLCAoU1BMSVRGSUVMRClOVUxMLDApOwoKICAgIGNsYXVzZV9SZW1vdmVGbGFnKENsYXVzZSwgTUFSS0VEKTsKICAgIENsYXVzZXMgICA9IGxpc3RfQ29ucyhDbGF1c2UsIENsYXVzZXMpOwogICAgUHJvb2ZSZXN0ID0gbGlzdF9DZHIoUHJvb2ZSZXN0KTsgIAogIH0KICBDbGF1c2VzID0gbGlzdF9OUmV2ZXJzZShDbGF1c2VzKTsKICAKICAvKiBjb252ZXJ0IHBhcmVudCBudW1iZXJzIHRvIHBvaW50ZXJzICovCiAgQ2xhdXNlcyA9IHBjaGVja19QYXJlbnROdW1iZXJzVG9QYXJlbnRzKENsYXVzZXMpOwogIAogIHJldHVybiBDbGF1c2VzOwp9CgoKc3RhdGljIEJPT0wgcGNoZWNrX0NsYXVzZUlzVW5tYXJrZWQoQ0xBVVNFIEMpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIEEgY2xhdXNlCiAgUkVUVVJOUzogVGhlIHZhbHVlIG9mIHRoZSBjbGF1c2VzIE1BUktFRCBmbGFnCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIHJldHVybiAhY2xhdXNlX0dldEZsYWcoQywgTUFSS0VEKTsKfQoKCnN0YXRpYyB2b2lkIHBjaGVja19SZW1vdmVVbm1hcmtlZEZyb21UYWJsZWF1KFRBQkxFQVUgVCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSB0YWJsZWF1CiAgUkVUVVJOUzogTm90aGluZy4KICBFRkZFQ1RTOiBEZWxldGUgYWxsIGNsYXVzZXMgdGhhdCBoYXZlIHRoZSBNQVJLRUQgZmxhZwogICAgICAgICAgIHNldCBmcm9tIHRhYmxlYXUuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIGlmICh0YWJfSXNFbXB0eShUKSkKICAgIHJldHVybjsKICAKICB0YWJfU2V0Q2xhdXNlcyhULCBsaXN0X0RlbGV0ZUVsZW1lbnRJZih0YWJfQ2xhdXNlcyhUKSwKCQkJCQkgKEJPT0wgKCopKFBPSU5URVIpKXBjaGVja19DbGF1c2VJc1VubWFya2VkKSk7CiAgCiAgcGNoZWNrX1JlbW92ZVVubWFya2VkRnJvbVRhYmxlYXUodGFiX0xlZnRCcmFuY2goVCkpOwogIHBjaGVja19SZW1vdmVVbm1hcmtlZEZyb21UYWJsZWF1KHRhYl9SaWdodEJyYW5jaChUKSk7Cn0KCgpzdGF0aWMgdm9pZCBwY2hlY2tfQ29sbGVjdFVubWFya2VkU3BsaXRzKFRBQkxFQVUgVCwgTElTVCogU3BsaXRzKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIHRhYmxlYXUsIGEgbGlzdCBvZiBjbGF1c2VzIGJ5IHJlZmVyZW5jZQogIFJFVFVSTlM6IE5vdGhpbmcuCiAgRUZGRUNUUzogQWRkIGFsbCBzcGxpdCBjbGF1c2VzIGluIHRoZSB0YWJsZWF1IHRoYXQgYXJlIG5vdAogICAgICAgICAgIG1hcmtlZCB0byB0aGUgPFNwbGl0cz4gbGlzdC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgTElTVCBTY2FuOwoKICBpZiAodGFiX0lzRW1wdHkoVCkpCiAgICByZXR1cm47CgogIGZvciAoU2NhbiA9IHRhYl9DbGF1c2VzKFQpOyAhbGlzdF9FbXB0eShTY2FuKTsgU2NhbiA9IGxpc3RfQ2RyKFNjYW4pKSB7CiAgICBpZiAoIWNsYXVzZV9HZXRGbGFnKGxpc3RfQ2FyKFNjYW4pLCBNQVJLRUQpICYmIGNsYXVzZV9Jc0Zyb21TcGxpdHRpbmcobGlzdF9DYXIoU2NhbikpKSAKICAgICAgKCpTcGxpdHMpID0gbGlzdF9Db25zKGxpc3RfQ2FyKFNjYW4pLCAqU3BsaXRzKTsKICB9CiAgCiAgcGNoZWNrX0NvbGxlY3RVbm1hcmtlZFNwbGl0cyh0YWJfTGVmdEJyYW5jaChUKSwgU3BsaXRzKTsKICBwY2hlY2tfQ29sbGVjdFVubWFya2VkU3BsaXRzKHRhYl9SaWdodEJyYW5jaChUKSwgU3BsaXRzKTsKfQoKCi8qIEVLOiB1bnVzZWQsIG9ubHkgcmVjdXJzaXZlICovCnN0YXRpYyB2b2lkIHBjaGVja19UYWJsZWF1U3BsaXRzQ29tcGxldGUoVEFCTEVBVSBUKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVCAgOiBBIHRhYmxlYXUKICBSRVRVUk5TOiBDaGVja3MgdGhhdCBldmVyeSBzcGxpdCBoYXMgZXhhY3RseSB0d28gb3Igbm8KICAgICAgICAgICBzdWNjZXNzb3JzLiBUaGlzIGNvbmRpdGlvbiBtdXN0IGJlIHRydWUgYWZ0ZXIKICAgICAgICAgICB0YWJfUmVtb3ZlUmVkdW5kYW50U3BsaXRzIGhhcyBiZWVuIGNhbGxlZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgaWYgKHRhYl9Jc0VtcHR5KFQpKQogICAgcmV0dXJuOwogIAogIGlmICh0YWJfUmlnaHRCcmFuY2hJc0VtcHR5KFQpICYmICF0YWJfTGVmdEJyYW5jaElzRW1wdHkoVCkpIHsKICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBFcnJvcjogU3BsaXQgb2YgY2xhdXNlICVkIGhhcyBubyByaWdodCBicmFuY2guXG4iLCAKCQkJIGNsYXVzZV9OdW1iZXIodGFiX1NwbGl0Q2xhdXNlKFQpKSk7CiAgICBtaXNjX0ZpbmlzaFVzZXJFcnJvclJlcG9ydCgpOwogIH0KIAogIGlmICghdGFiX1JpZ2h0QnJhbmNoSXNFbXB0eShUKSAmJiB0YWJfTGVmdEJyYW5jaElzRW1wdHkoVCkpIHsKICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBFcnJvcjogU3BsaXQgb2YgY2xhdXNlICVkIGhhcyBubyBsZWZ0IGJyYW5jaC5cbiIsIAoJCQkgY2xhdXNlX051bWJlcih0YWJfU3BsaXRDbGF1c2UoVCkpKTsKICAgIG1pc2NfRmluaXNoVXNlckVycm9yUmVwb3J0KCk7CiAgfQogIAogIHBjaGVja19UYWJsZWF1U3BsaXRzQ29tcGxldGUodGFiX0xlZnRCcmFuY2goVCkpOwogIHBjaGVja19UYWJsZWF1U3BsaXRzQ29tcGxldGUodGFiX1JpZ2h0QnJhbmNoKFQpKTsKfQoKCnN0YXRpYyB2b2lkIHBjaGVja19SaWdodFNwbGl0UGFyZW50cyhDTEFVU0UgU3BsaXRDbGF1c2UsIENMQVVTRSBSaWdodFNwbGl0Q2xhdXNlLAoJCQkJICAgICBDTEFVU0UgTGVmdFNwbGl0Q2xhdXNlKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIHNwbGl0IGNsYXVzZSwgYW5kIGl0cyBsZWZ0IGFuZCByaWdodCBzdWNjZXNzb3JzCiAgRUZGRUNUUzogUHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIHNwbGl0IGlzIG5vdCBjb3JyZWN0bHkKICAgICAgICAgICBjbG9zZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIExJU1QgU2NhbjsKICBCT09MIEhhc0VtcHR5LCBDb250YWluc1NwbGl0Q2xhdXNlOwoKICBIYXNFbXB0eSA9IENvbnRhaW5zU3BsaXRDbGF1c2UgPSBGQUxTRTsKCiAgZm9yIChTY2FuID0gY2xhdXNlX1BhcmVudENsYXVzZXMoUmlnaHRTcGxpdENsYXVzZSk7CiAgICAgICAhbGlzdF9FbXB0eShTY2FuKTsgU2NhbiA9IGxpc3RfQ2RyKFNjYW4pKSB7CiAgICBpZiAoY2xhdXNlX0lzRW1wdHlDbGF1c2UobGlzdF9DYXIoU2NhbikpKQogICAgICBIYXNFbXB0eSA9IFRSVUU7CiAgICBpZiAoY2xhdXNlX051bWJlcihsaXN0X0NhcihTY2FuKSkgPT0gY2xhdXNlX051bWJlcihTcGxpdENsYXVzZSkpIAogICAgICBDb250YWluc1NwbGl0Q2xhdXNlID0gVFJVRTsgCiAgfQogIAogIGlmICghSGFzRW1wdHkpIHsKICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBFcnJvcjogUmlnaHQgc3BsaXQgY2xhdXNlICVkIGhhcyBubyBlbXB0eSBjbGF1c2UgYXMgcGFyZW50LlxuIiwgCgkJCSBjbGF1c2VfTnVtYmVyKFNwbGl0Q2xhdXNlKSk7CiAgICBtaXNjX0ZpbmlzaFVzZXJFcnJvclJlcG9ydCgpOwogIH0KCiAgaWYgKCFDb250YWluc1NwbGl0Q2xhdXNlKSB7CiAgICBtaXNjX1N0YXJ0VXNlckVycm9yUmVwb3J0KCk7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gRXJyb3I6IFJpZ2h0IHNwbGl0IGNsYXVzZSAlZCIsIGNsYXVzZV9OdW1iZXIoU3BsaXRDbGF1c2UpKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCIgZG9lcyBub3QgaGF2ZSBpdHMgc3BsaXQgcGFyZW50IGFzIHBhcmVudCBjbGF1c2UuXG4iKTsKICAgIG1pc2NfRmluaXNoVXNlckVycm9yUmVwb3J0KCk7CiAgfQp9CgoKCi8qIEVLOiB1bnVzZWQsIG9ubHkgcmVjdXJzaXZlICovCnN0YXRpYyB2b2lkIHBjaGVja19TcGxpdEZvcm1hdHMoVEFCTEVBVSBUKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVCAgOiBBIHRhYmxlYXUKICBSRVRVUk5TOiBUUlVFIGlmZiBhbGwgc3BsaXRzOgogICAgICAgICAgIC0gaGF2ZSBnZW5lcmF0ZWQgbmVnYXRpb25zIG9mIHRoZSBsZWZ0IHNwbGl0IGNsYXVzZQogCSAgICAgaWYgdGhlIGxlZnQgc3BsaXQgY2xhdXNlIGlzIGdyb3VuZAoJICAgLSB0aGUgY29uZGl0aW9ucyBmb3IgcmlnaHQgc3BsaXQgY2xhdXNlcyBhcmUKICAgICAgICAgICAgIGFzIGRlbWFuZGVkIGluIHBjaGVja19SaWdodFNwbGl0UGFyZW50cwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBMSVNUIFNjYW47CgogIGlmICh0YWJfSXNFbXB0eShUKSkKICAgIHJldHVybjsKCiAgLyogZm9yIHJpZ2h0IHNwbGl0cywgY2hlY2sgdGhhdCBwYXJlbnRzIGhhdmUgYW4gZW1wdHkgY2xhdXNlICovCiAgLyogYW5kIHRoZSBzcGxpdCBjbGF1c2UgYXMgYSBwYXJlbnQgKi8KCiAgZm9yIChTY2FuID0gdGFiX1JpZ2h0U3BsaXRDbGF1c2VzKFQpOyAhbGlzdF9FbXB0eShTY2FuKTsKICAgICAgIFNjYW4gPSBsaXN0X0NkcihTY2FuKSkgewogICAgcGNoZWNrX1JpZ2h0U3BsaXRQYXJlbnRzKHRhYl9TcGxpdENsYXVzZShUKSwgbGlzdF9DYXIoU2NhbiksCgkJCSAgICAgdGFiX0xlZnRTcGxpdENsYXVzZShUKSk7CiAgfQogICAgCiAgcGNoZWNrX1NwbGl0Rm9ybWF0cyh0YWJfUmlnaHRCcmFuY2goVCkpOwogIHBjaGVja19TcGxpdEZvcm1hdHModGFiX0xlZnRCcmFuY2goVCkpOwp9CgoKc3RhdGljIHZvaWQgcGNoZWNrX1NwbGl0TGV2ZWxzKFRBQkxFQVUgVCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQgIDogQSBUYWJsZWF1CiAgUkVUVVJOUzogVFJVRSBpZmYgYWxsIGNsYXVzZXMgaW4gdGhlIHRhYmxlYXUgdGhhdAogICAgICAgICAgIGFyZSBub3Qgc3BsaXR0aW5nIGNsYXVzZXMgaGF2ZSB0aGUgbWF4IHNwbGl0CiAgICAJICAgbGV2ZWwgb2YgdGhlaXIgcGFyZW50cy4KICBDQVVUSU9OOiBXZSBhc3N1bWUgdGhhdCA8VD4gaGFzIGNvcnJlY3QgYW5kIGNvbXBsZXRlIHNwbGl0CiAgICAgICAgICAgZW50cmllcy4gU2VlIHBjaGVja19TcGxpdFRvUHJvYmxlbXMuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIExJU1QgICBTY2FuOwogIENMQVVTRSBDbGF1c2U7CiAgaW50ICAgIENvcnJlY3RMZXZlbDsKCiAgaWYgKHRhYl9Jc0VtcHR5KFQpKQogICAgcmV0dXJuOwoKICAvKiBjaGVjayBzcGxpdCBsZXZlbHMgKi8KICBmb3IgKFNjYW4gPSB0YWJfQ2xhdXNlcyhUKTsgIWxpc3RfRW1wdHkoU2Nhbik7IFNjYW4gPSBsaXN0X0NkcihTY2FuKSkgewogICAgQ2xhdXNlID0gbGlzdF9DYXIoU2Nhbik7CiAgICBpZiAoIWxpc3RfRW1wdHkoY2xhdXNlX1BhcmVudENsYXVzZXMoQ2xhdXNlKSkKCSYmICFjbGF1c2VfSXNGcm9tU3BsaXR0aW5nKENsYXVzZSkpIHsKIAogICAgIENvcnJlY3RMZXZlbCA9IHBjaGVja19NYXhQYXJlbnRTcGxpdExldmVsKENsYXVzZSk7CiAgICAgaWYgKGNsYXVzZV9TcGxpdExldmVsKENsYXVzZSkgIT0gQ29ycmVjdExldmVsKSB7CiAgICAgICBtaXNjX1N0YXJ0VXNlckVycm9yUmVwb3J0KCk7CiAgICAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gRXJyb3I6IFNwbGl0IGxldmVsIG9mIGNsYXVzZSAlZCBzaG91bGQgYmUgJWQuXG4iLAoJCQkgICAgY2xhdXNlX051bWJlcihDbGF1c2UpLCBDb3JyZWN0TGV2ZWwpOwogICAgICAgbWlzY19GaW5pc2hVc2VyRXJyb3JSZXBvcnQoKTsKICAgICB9CiAgICB9CiAgfQoKICBwY2hlY2tfU3BsaXRMZXZlbHModGFiX1JpZ2h0QnJhbmNoKFQpKTsKICBwY2hlY2tfU3BsaXRMZXZlbHModGFiX0xlZnRCcmFuY2goVCkpOwp9CgoKLyogRUs6IHVudXNlZCwgb25seSByZWN1cnNpdmUgKi8Kc3RhdGljIHZvaWQgcGNoZWNrX1NwbGl0UHJlY2hlY2soVEFCTEVBVSBUKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVCAgOiBBIHRhYmxlYXUuCiAgRUZGRUNUUzogU3RvcHMgYW5kIHByaW50cyBhbiBlcnJvciBtZXNzYWdlIGlmIGEgbGVmdCBoYWxmCiAgICAgICAgICAgb2YgYSBzcGxpdCBkb2VzIG5vdCBzdWJzdW1lIGl0cyBwYXJlbnRzLCBvcgoJICAgaWYgbmVnYXRpb25zIGhhdmUgYmVlbiBnZW5lcmF0ZWQgZm9yIGEgbm9uLWdyb3VuZAoJICAgbGVmdCBzcGxpdCBjbGF1c2UuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIGlmICh0YWJfSXNFbXB0eShUKSkKICAgIHJldHVybjsKICAKICBpZiAoIXN1YnNfU3Vic3VtZXModGFiX0xlZnRTcGxpdENsYXVzZShUKSwgdGFiX1NwbGl0Q2xhdXNlKFQpLCAtMSwgLTEpKSB7CiAgICBtaXNjX1N0YXJ0VXNlckVycm9yUmVwb3J0KCk7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gRXJyb3I6IEluY29ycmVjdCBzcGxpdCBvZiAlZCwiLCB0YWJfU3BsaXRDbGF1c2UoVCkpOwogICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIiBsZWZ0IGhhbGYgb2Ygc3BsaXQgZG9lcyBub3Qgc3Vic3VtZSBzcGxpdHRlZCBjbGF1c2UuXG4iKTsJCQkgCiAgICBtaXNjX0ZpbmlzaFVzZXJFcnJvclJlcG9ydCgpOwogIH0KCiAgaWYgKGxpc3RfTGVuZ3RoKHRhYl9SaWdodFNwbGl0Q2xhdXNlcyhUKSkgPiAxICYmCiAgICAgICFjbGF1c2VfSXNHcm91bmQodGFiX0xlZnRTcGxpdENsYXVzZShUKSkpIHsKICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBFcnJvcjogSW5jb3JyZWN0IHNwbGl0IG9mICVkLCIsIHRhYl9TcGxpdENsYXVzZShUKSk7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiIG5vbi1ncm91bmQgc3BsaXQgZ2VuZXJhdGVkIG1vcmUgdGhhbiB0d28gY2xhdXNlLlxuIik7CiAgICBtaXNjX0ZpbmlzaFVzZXJFcnJvclJlcG9ydCgpOwogIH0KCiAgcGNoZWNrX1NwbGl0UHJlY2hlY2sodGFiX0xlZnRCcmFuY2goVCkpOwogIHBjaGVja19TcGxpdFByZWNoZWNrKHRhYl9SaWdodEJyYW5jaChUKSk7Cn0KCgpCT09MIHBjaGVja19CdWlsZFRhYmxlYXVGcm9tUHJvb2YoTElTVCBQcm9vZiwgVEFCTEVBVSogVGFibGVhdSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQgIDogQSBsaXN0IG9mIGNsYXVzZXMgcmVwcmVzZW50aW5nIGEgcHJvb2YsIGFuZCBhIHBvaW50ZXIKICAgICAgICAgICB0byBhIHRhYmxlYXUgdXNlZCBhcyByZXR1cm4gdmFsdWUuCiAgUkVUVVJOUzogVFJVRSBpZmYgbm8gZXJyb3JzIG9jY3VycmVkLCBGQUxTRSBvdGhlcndpc2UuCiAgICAgICAgICAgSWYgVFJVRSBpcyByZXR1cm5lZCA8VGFibGVhdT4gaXMgc2V0IHRvIGEgdGFibGVhdQoJICAgcmVwcmVzZW50aW5nIHRoZSBwcm9vZi4KICBFRkZFQ1RTOiBFcnJvcnMgYXJlIGNvbW1lbnRlZCB3aGVuIHRoZXkgb2NjdXIuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIExJU1QgICAgIFByb29mUmVzdDsKICBUQUJMRUFVICBTcGxpdFBvczsKICBUQUJQQVRIICBQYXRoOwogIENMQVVTRSAgIENsYXVzZTsKICBpbnQgICAgICBDbGF1c2VMZXZlbCwgU3BsaXRMZXZlbDsKICBpbnQgICAgICBQcm9vZkRlcHRoOwoKICBpZiAobGlzdF9FbXB0eShQcm9vZikpIHsKICAgICpUYWJsZWF1ID0gdGFiX0VtcHR5VGFibGVhdSgpOwogICAgcmV0dXJuIFRSVUU7CiAgfQoKICBQcm9vZkRlcHRoID0gcGNoZWNrX01heFNwbGl0TGV2ZWwoUHJvb2YpOwogICpUYWJsZWF1ICAgPSB0YWJfQ3JlYXRlTm9kZSgpOwogIFBhdGggICAgICAgPSB0YWJfUGF0aENyZWF0ZShQcm9vZkRlcHRoLCAqVGFibGVhdSk7CgogIFByb29mUmVzdCA9IFByb29mOwogIHdoaWxlICghbGlzdF9FbXB0eShQcm9vZlJlc3QpKSB7CgogICAgU3BsaXRMZXZlbCAgPSB0YWJfUGF0aExlbmd0aChQYXRoKTsKICAgIENsYXVzZSAgICAgID0gbGlzdF9DYXIoUHJvb2ZSZXN0KTsKICAgIENsYXVzZUxldmVsID0gY2xhdXNlX1NwbGl0TGV2ZWwoQ2xhdXNlKTsgCgogICAgLyogU3BlY2lhbCB0cmVhdG1lbnQgZm9yIGNsYXVzZXMgdGhhdCByZXN1bHQgZnJvbSBhIHNwbGl0dGluZyBzdGVwICovCiAgICBpZiAocGNoZWNrX0NsYXVzZUlzRnJvbVNwbGl0KENsYXVzZSkpIHsKCiAgICAgIGlmIChDbGF1c2VMZXZlbCA9PSAwKSB7CgltaXNjX1N0YXJ0VXNlckVycm9yUmVwb3J0KCk7CgltaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gRXJyb3I6IFNwbGl0IGxldmVsIG9mIHNwbGl0IGNsYXVzZSAlZCBpcyAwLlxuIiwgY2xhdXNlX051bWJlcihDbGF1c2UpKTsKCW1pc2NfRmluaXNoVXNlckVycm9yUmVwb3J0KCk7CiAgICAgIH0KCiAgICAgIGlmIChDbGF1c2VMZXZlbCA+IFNwbGl0TGV2ZWwrMSkgewoJbWlzY19TdGFydFVzZXJFcnJvclJlcG9ydCgpOwoJbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIEVycm9yOiBTcGxpdCBsZXZlbCBvZiBzcGxpdCBjbGF1c2UgJWQiLCBjbGF1c2VfTnVtYmVyKENsYXVzZSkpOwoJbWlzY19Vc2VyRXJyb3JSZXBvcnQoIiBpcyBub3QgaW5jcmVtZW50IG9mIGN1cnJlbnQgc3BsaXQgbGV2ZWwuXG4iKTsKCW1pc2NfRmluaXNoVXNlckVycm9yUmVwb3J0KCk7CiAgICAgIH0KCiAgICAgIFNwbGl0UG9zID0gdGFiX1BhdGhOdGhOb2RlKFBhdGgsIENsYXVzZUxldmVsLTEpOwoKICAgICAgaWYgKHBjaGVja19DbGF1c2VJc0Zyb21MZWZ0U3BsaXQoQ2xhdXNlKSkgewoJLyogTGVmdCBicmFuY2ggb2YgYSBzcGxpdHRpbmcgc3RlcCAqLwoJaWYgKCF0YWJfTGVmdEJyYW5jaElzRW1wdHkoU3BsaXRQb3MpKSB7CgkgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKCSAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIEVycm9yOiBNdWx0aXBsZSBsZWZ0IHNwbGl0cyBmb3IgY2xhdXNlICVkLlxuIiwgCgkJCSAgICAgICBjbGF1c2VfTnVtYmVyKHRhYl9TcGxpdENsYXVzZShTcGxpdFBvcykpKTsKCSAgbWlzY19GaW5pc2hVc2VyRXJyb3JSZXBvcnQoKTsKCX0KCglQYXRoID0gdGFiX1BhdGhQcmVmaXgoQ2xhdXNlTGV2ZWwtMSwgUGF0aCk7Cgl0YWJfU2V0U3BsaXRDbGF1c2UoU3BsaXRQb3MsIGxpc3RfQ2FyKGNsYXVzZV9QYXJlbnRDbGF1c2VzKENsYXVzZSkpKTsKCXRhYl9TZXRMZWZ0U3BsaXRDbGF1c2UoU3BsaXRQb3MsIENsYXVzZSk7Cgl0YWJfQWRkU3BsaXRBdEN1cnNvcihQYXRoLCBUUlVFKTsKICAgICAgfSBlbHNlIHsKCS8qIFJpZ2h0IGJyYW5jaCBvZiBhIHNwbGl0dGluZyBzdGVwICovCglpZiAodGFiX1JpZ2h0QnJhbmNoSXNFbXB0eShTcGxpdFBvcykpIHsKCSAgCgkgIGlmICh0YWJfTGVmdEJyYW5jaElzRW1wdHkoU3BsaXRQb3MpKSB7CgkgICAgbWlzY19TdGFydFVzZXJFcnJvclJlcG9ydCgpOwoJICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBFcnJvcjogUmlnaHQgc3BsaXQgd2l0aCBpbmNvcnJlY3Qgc3BsaXQgbGV2ZWwsIGNsYXVzZSAlZC5cbiIsIAoJCQkJIGNsYXVzZV9OdW1iZXIoQ2xhdXNlKSk7CgkgICAgbWlzY19GaW5pc2hVc2VyRXJyb3JSZXBvcnQoKTsKCSAgfQoKCSAgUGF0aCA9IHRhYl9QYXRoUHJlZml4KENsYXVzZUxldmVsLTEsIFBhdGgpOwoJICB0YWJfQWRkU3BsaXRBdEN1cnNvcihQYXRoLCBGQUxTRSk7Cgl9Cgl0YWJfQWRkUmlnaHRTcGxpdENsYXVzZShTcGxpdFBvcywgQ2xhdXNlKTsgCiAgICAgIH0gLyogY2xhdXNlIGZyb20gcmlnaHQgc3BsaXQgKi8KICAgIH0gLyogY2xhdXNlIGZyb20gc3BsaXQgKi8KICAgICAgCiAgICBpZiAoQ2xhdXNlTGV2ZWwgPiB0YWJfUGF0aExlbmd0aChQYXRoKSkgewogICAgICBtaXNjX1N0YXJ0VXNlckVycm9yUmVwb3J0KCk7CiAgICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBFcnJvcjogU3BsaXQgbGV2ZWwgb2YgY2xhdXNlICVkIGdyZWF0ZXIgdGhhbiBjdXJyZW50IGxldmVsLlxuIiwgCgkJCSAgIGNsYXVzZV9OdW1iZXIoQ2xhdXNlKSk7CiAgICAgIG1pc2NfRmluaXNoVXNlckVycm9yUmVwb3J0KCk7CiAgICB9CiAgICB0YWJfQWRkQ2xhdXNlT25JdHNMZXZlbChDbGF1c2UsIFBhdGgpOyAKICAgIAogICAgUHJvb2ZSZXN0ID0gbGlzdF9DZHIoUHJvb2ZSZXN0KTsgICAKICB9IC8qIHdoaWxlIHByb29mIGlzIG5vdCBlbXB0eSAqLwoKCiAgdGFiX1BhdGhEZWxldGUoUGF0aCk7CgogIHJldHVybiBUUlVFOwp9CgoKc3RhdGljIEJPT0wgcGNoZWNrX1RhYmxlYXVKdXN0aWZpY2F0aW9uc1JlYyhUQUJMRUFVIFQsIFRBQlBBVEggUGF0aCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQgIDogQSBUYWJsZWF1IDxUPiwgYSA8UGF0aD4gaW4gdGhlIHRhYmxlYXUKICBSRVRVUk5TOiBUUlVFIGlmZiBhbGwgY2xhdXNlcyBpbiB0aGUgbGFzdCBub2RlIG9mIHRoZQogICAgICAgICAgIHBhdGggYXJlIGNvcnJlY3RseSBqdXN0aWZpZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIENMQVVTRSAgQ2xhdXNlOwogIExJU1QgICAgU2NhbkNsYXVzZXM7CiAgTElTVCAgICBTY2FuUGFyZW50czsKICBMSVNUICAgIFBhcmVudHM7CiAgQ0xBVVNFICBQYXJlbnQ7CiAgQk9PTCAgICBPaywgUmlnaHRTcGxpdDsKCiAgaWYgKHRhYl9Jc0VtcHR5KFQpKQogICAgcmV0dXJuIFRSVUU7CgogIE9rID0gVFJVRTsgCgogIC8qIGZvciBlYWNoIGNsYXVzZSwgY2hlY2sgdGhhdCBpdHMgcGFyZW50cyBoYXZlIGJlZW4ganVzdGlmaWVkICovCgogIGZvciAoU2NhbkNsYXVzZXMgPSB0YWJfQ2xhdXNlcyh0YWJfUGF0aFRvcChQYXRoKSk7CiAgICAgICAhbGlzdF9FbXB0eShTY2FuQ2xhdXNlcyk7IFNjYW5DbGF1c2VzID0gbGlzdF9DZHIoU2NhbkNsYXVzZXMpKSB7CgogICAgQ2xhdXNlICA9IGxpc3RfQ2FyKFNjYW5DbGF1c2VzKTsKICAgIFBhcmVudHMgPSBjbGF1c2VfUGFyZW50Q2xhdXNlcyhDbGF1c2UpOwogICAgCiAgICBSaWdodFNwbGl0ID0gcGNoZWNrX0NsYXVzZUlzRnJvbVJpZ2h0U3BsaXQoQ2xhdXNlKTsgCiAgICAKICAgIC8qIGNoZWNrIGFsbCBwYXJlbnRzICovCiAgICAKICAgIGZvciAoU2NhblBhcmVudHMgPSBQYXJlbnRzOyAhbGlzdF9FbXB0eShTY2FuUGFyZW50cyk7IAoJIFNjYW5QYXJlbnRzID0gbGlzdF9DZHIoU2NhblBhcmVudHMpKSB7CiAgICAgIAogICAgICBQYXJlbnQgPSBsaXN0X0NhcihTY2FuUGFyZW50cyk7CiAgICAgIAogICAgICBpZiAoKCEoUmlnaHRTcGxpdCAmJiBjbGF1c2VfSXNFbXB0eUNsYXVzZShQYXJlbnQpKSAmJgoJICAhKFJpZ2h0U3BsaXQgJiYgcGNoZWNrX0NsYXVzZUlzRnJvbUxlZnRTcGxpdChQYXJlbnQpKSkgfHwKCSAgKGNsYXVzZV9OdW1iZXIoUGFyZW50KSA+IGNsYXVzZV9OdW1iZXIoQ2xhdXNlKSkgKSB7CglpZiAoIXRhYl9QYXRoQ29udGFpbnNDbGF1c2UoUGF0aCwgUGFyZW50KSkgewoJICBtaXNjX1N0YXJ0VXNlckVycm9yUmVwb3J0KCk7CgkgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBFcnJvcjogUGFyZW50IGNsYXVzZSB3aXRoIG51bWJlciAlZCBpcyBub3QgeWV0IGp1c3RpZmllZC5cbiIsIAoJCQkgICAgICAgY2xhdXNlX051bWJlcihQYXJlbnQpKTsKCSAgbWlzY19GaW5pc2hVc2VyRXJyb3JSZXBvcnQoKTsKCX0KICAgICAgfQogICAgfQogIH0gIC8qIGZvciBhbGwgY2xhdXNlcyBpbiBjdXJyZW50IG5vZGUgKi8KICAKICAKICAvKiBSZWN1cnNpb24gKi8KICAKICBpZiAoIXRhYl9MZWZ0QnJhbmNoSXNFbXB0eShUKSkgewogICAgUGF0aCA9IHRhYl9QYXRoUHVzaCh0YWJfTGVmdEJyYW5jaChUKSwgUGF0aCk7CiAgICBPayAgID0gT2sgJiYgcGNoZWNrX1RhYmxlYXVKdXN0aWZpY2F0aW9uc1JlYyh0YWJfTGVmdEJyYW5jaChUKSwgUGF0aCk7CiAgICBQYXRoID0gdGFiX1BhdGhQb3AoUGF0aCk7CiAgfQogIAogIGlmICghdGFiX1JpZ2h0QnJhbmNoSXNFbXB0eShUKSkgewogICAgUGF0aCA9IHRhYl9QYXRoUHVzaCh0YWJfUmlnaHRCcmFuY2goVCksIFBhdGgpOwogICAgT2sgICA9IE9rICYmIHBjaGVja19UYWJsZWF1SnVzdGlmaWNhdGlvbnNSZWModGFiX1JpZ2h0QnJhbmNoKFQpLCBQYXRoKTsKICAgIFBhdGggPSB0YWJfUGF0aFBvcChQYXRoKTsKICB9CgogIHJldHVybiBPazsKfQoKc3RhdGljIEJPT0wgcGNoZWNrX1RhYmxlYXVKdXN0aWZpY2F0aW9ucyhUQUJMRUFVIFQpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUICA6IEEgVGFibGVhdQogIFJFVFVSTlM6IFRSVUUgaWZmIGZvciBlYWNoIGNsYXVzZSBpbiB0YWJsZWF1LCBhbGwgaXRzIHBhcmVudAogICAgICAgICAgIGNsYXVzZXMgaGF2ZSBiZWVuIGRlcml2ZWQgaW4gYSBzcGxpdCBvbiB0aGUgc2FtZSBsZXZlbAoJICAgb3IgYmVsb3cuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIFRBQlBBVEggUGF0aDsKICBCT09MICAgIE9rOwoKICBQYXRoID0gdGFiX1BhdGhDcmVhdGUodGFiX0RlcHRoKFQpLFQpOwogIE9rICAgPSBwY2hlY2tfVGFibGVhdUp1c3RpZmljYXRpb25zUmVjKFQsUGF0aCk7IAogIHRhYl9QYXRoRGVsZXRlKFBhdGgpOwogIAogIHJldHVybiBPazsKfQoKQk9PTCBwY2hlY2tfVGFibGVhdVByb29mKFRBQkxFQVUqIFRhYmxlYXUsIExJU1QgUHJvb2YpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAKICBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBMSVNUIFJlZHVuZGFudENsYXVzZXM7CiAgTElTVCBFbXB0eUNsYXVzZXM7CiAgTElTVCBVbm1hcmtlZFNwbGl0czsKCiAgdGFiX0xhYmVsTm9kZXMoKlRhYmxlYXUpOwogIC8qIHByaW50IG91dCBjdXJyZW50IHRhYmxlYXUgKi8KICBpZiAocGNoZWNrX0dlbk5hbWVkQ2cpIAogICAgdGFiX1dyaXRlVGFibGVhdSgqVGFibGVhdSwgcGNoZWNrX0NnTmFtZSwgcGNoZWNrX0dyYXBoRm9ybWF0KTsKICAKICBSZWR1bmRhbnRDbGF1c2VzID0gbGlzdF9OaWwoKTsKICBpZiAoIXBjaGVja19RdWlldCkgewogICAgZnB1dHMoInBydW5pbmcgY2xvc2VkIGJyYW5jaGVzLi4uIiwgc3Rkb3V0KTsKICAgIGZmbHVzaChzdGRvdXQpOwogIH0KICAoKlRhYmxlYXUpID0gdGFiX1BydW5lQ2xvc2VkQnJhbmNoZXMoKlRhYmxlYXUsICZSZWR1bmRhbnRDbGF1c2VzKTsgICAvKiBkZWxldGUgZGVzY2VuZGFudHMgb2YgYWxyZWFkeSBjbG9zZWQgYnJhbmNoZXMgKi8KICBpZiAoIXBjaGVja19RdWlldCkKICAgIHB1dHMoImZpbmlzaGVkLiIpOwoKICBpZiAoIXBjaGVja19RdWlldCkgewogICAgZnB1dHMoInJlbW92aW5nIGluY29tcGxldGUgc3BsaXRzLi4uIiwgc3Rkb3V0KTsKICAgIGZmbHVzaChzdGRvdXQpOwogIH0KICAoKlRhYmxlYXUpID0gdGFiX1JlbW92ZUluY29tcGxldGVTcGxpdHMoKlRhYmxlYXUsICZSZWR1bmRhbnRDbGF1c2VzKTsgIC8qIHJlZHVjZSBvcGVuIG5vZGUgcmVkdW5kYW5jaWVzICovCiAgaWYgKCFwY2hlY2tfUXVpZXQpCiAgICBwdXRzKCJmaW5pc2hlZC4iKTsKICAKICBsaXN0X0RlbGV0ZShSZWR1bmRhbnRDbGF1c2VzKTsKCiAgLyogcmVtb3ZlIGFsbCBjbGF1c2VzIHRoYXQgYXJlIG5vdCBuZWVkZWQgZm9yIHRoZSBlbXB0eSBjbGF1c2VzICovCiAgLyogb2YgdGhlIHByb29mIG9yIGZvciB0aGUgdGFibGVhdSBzdHJ1Y3R1cmUgKHNwbGl0cykgKi8KCiAgRW1wdHlDbGF1c2VzID0gbGlzdF9OaWwoKTsKICB0YWJfR2V0RWFybGllc3RFbXB0eUNsYXVzZXMoKlRhYmxlYXUsICZFbXB0eUNsYXVzZXMpOwogIHBjaGVja19DbGF1c2VMaXN0UmVtb3ZlRmxhZyhQcm9vZiwgTUFSS0VEKTsKICBwY2hlY2tfTWFya1JlY3Vyc2l2ZShFbXB0eUNsYXVzZXMpOwogIFVubWFya2VkU3BsaXRzID0gbGlzdF9OaWwoKTsKICBwY2hlY2tfQ29sbGVjdFVubWFya2VkU3BsaXRzKCpUYWJsZWF1LCAmVW5tYXJrZWRTcGxpdHMpOwogIHBjaGVja19NYXJrUmVjdXJzaXZlKFVubWFya2VkU3BsaXRzKTsKICBwY2hlY2tfUmVtb3ZlVW5tYXJrZWRGcm9tVGFibGVhdSgqVGFibGVhdSk7IAogIGxpc3RfRGVsZXRlKFVubWFya2VkU3BsaXRzKTsKICBsaXN0X0RlbGV0ZShFbXB0eUNsYXVzZXMpOwoKICAvKiBwcmludCByZWR1Y2VkIGdyYXBoICovCiAgaWYgKHBjaGVja19HZW5SZWRDZykgCiAgICB0YWJfV3JpdGVUYWJsZWF1KCpUYWJsZWF1LCBwY2hlY2tfUmVkQ2dOYW1lLCBwY2hlY2tfR3JhcGhGb3JtYXQpOwoKICB0YWJfU2V0U3BsaXRMZXZlbHMoKlRhYmxlYXUpOwogIHBjaGVja19TcGxpdExldmVscygqVGFibGVhdSk7CiAgdGFiX0NoZWNrRW1wdGllcygqVGFibGVhdSk7CgogaWYgKCF0YWJfSXNDbG9zZWQoKlRhYmxlYXUpKSB7CiAgICBwdXRzKCJcbmVycm9yOiB0YWJsZWF1IGlzIG5vdCBjbG9zZWQuIik7ICAKICAgIHJldHVybiBGQUxTRTsKIH0KCiAgLyogY2hlY2sganVzdGlmaWNhdGlvbnMgKi8KICBpZiAoIXBjaGVja19RdWlldCkgewogICAgZnB1dHMoImNoZWNraW5nIGp1c3RpZmljYXRpb25zLi4uIiwgc3Rkb3V0KTsKICAgIGZmbHVzaChzdGRvdXQpOwogIH0KICBpZiAoIXBjaGVja19UYWJsZWF1SnVzdGlmaWNhdGlvbnMoKlRhYmxlYXUpKQogICAgcmV0dXJuIEZBTFNFOwogIGlmICghcGNoZWNrX1F1aWV0KQogICAgcHV0cygiZmluaXNoZWQuIik7CiAKICByZXR1cm4gVFJVRTsKfQoKCnZvaWQgcGNoZWNrX01hcmtSZWN1cnNpdmUoTElTVCBDbGF1c2VzKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIGxpc3Qgb2YgY2xhdXNlcyAKICBSRVRVUk5TOiBOb3RoaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIEVGRkVDVFM6IE1hcmtzIGFsbCA8Q2xhdXNlcz4gYW5kIGl0cyBhbmNlc3RvcnMgd2l0aCB0aGUKICAgICAgICAgICBNQVJLRUQgY2xhdXNlIGZsYWcuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIENMQVVTRSBDbGF1c2U7CgogIGZvciAoOyAhbGlzdF9FbXB0eShDbGF1c2VzKTsgQ2xhdXNlcyA9IGxpc3RfQ2RyKENsYXVzZXMpKSB7CiAgICBDbGF1c2UgPSBsaXN0X0NhcihDbGF1c2VzKTsKICAgIGlmICghY2xhdXNlX0dldEZsYWcoQ2xhdXNlLCBNQVJLRUQpKSB7CiAgICAgIHBjaGVja19NYXJrUmVjdXJzaXZlKGNsYXVzZV9QYXJlbnRDbGF1c2VzKENsYXVzZSkpOyAKICAgICAgY2xhdXNlX1NldEZsYWcoQ2xhdXNlLCBNQVJLRUQpOwogICAgfQogIH0KfQoKCnN0YXRpYyBMSVNUIHBjaGVja19Db2xsZWN0VGVybVZhcmlhYmxlcyhURVJNIFRlcm0pCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIEEgdGVybS4KICBSRVRVUk5TOiBBIGxpc3Qgb2YgdGVybXMuIEZvciBlYWNoIHZhcmlhYmxlIGluIDxUZXJtPiB0aGUgbGlzdAogICAgICAgICAgIGNvbnRhaW5zIGV4YWN0bHkgb25lIHRlcm0gcmVwcmVzZW50aW5nIHRoZSB2YXJpYWJsZS4KICBFRkZFQ1Q6ICBNZW1vcnkgaXMgYWxsb2NhdGVkIGZvciB0aGUgdGVybXMuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIExJU1QgUmVzdWx0LCBTY2FuOwoKICBSZXN1bHQgPSB0ZXJtX1ZhcmlhYmxlU3ltYm9scyhUZXJtKTsKICBmb3IgKFNjYW4gPSBSZXN1bHQ7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuID0gbGlzdF9DZHIoU2NhbikpCiAgICBsaXN0X1JwbGFjYShTY2FuLCB0ZXJtX0NyZWF0ZSgoU1lNQk9MKWxpc3RfQ2FyKFNjYW4pLCBsaXN0X05pbCgpKSk7CgogIHJldHVybiBSZXN1bHQ7Cn0KCgpzdGF0aWMgQk9PTCBwY2hlY2tfSXNSaWdodFNwbGl0SGFsZihDTEFVU0UgQykKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQgIDogQSBjbGF1c2UuCiAgUkVUVVJOUzogVFJVRSBpZmYgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBmdWxmaWxsZWQ6CiAgICAgICAgICAgLSB0aGUgZmlyc3QgcGFyZW50IGNsYXVzZSBpcyBhbiBlbXB0eSBjbGF1c2UKCSAgIC0gdGhlIGNsYXVzZSBzdWJzdW1lcyBpdHMgc2Vjb25kIHBhcmVudAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBMSVNUIFBhcmVudHM7CiAgQk9PTCBPazsKCiAgUGFyZW50cyA9IGxpc3RfQ29weShjbGF1c2VfUGFyZW50Q2xhdXNlcyhDKSk7CiAgUGFyZW50cyA9IGxpc3RfUG9pbnRlckRlbGV0ZUR1cGxpY2F0ZXMoUGFyZW50cyk7CgogIE9rID0gRkFMU0U7CiAgaWYgKGxpc3RfTGVuZ3RoKFBhcmVudHMpID09IDIgJiYgY2xhdXNlX0lzRW1wdHlDbGF1c2UobGlzdF9GaXJzdChQYXJlbnRzKSkpCiAgICBPayA9IHN1YnNfU3Vic3VtZXMoQywgbGlzdF9TZWNvbmQoUGFyZW50cyksIC0xLCAtMSk7CgogIGxpc3RfRGVsZXRlKFBhcmVudHMpOwoKICByZXR1cm4gT2s7Cn0KCgpzdGF0aWMgVEVSTSBwY2hlY2tfVW5pdkNsb3N1cmUoVEVSTSBUKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIHRlcm0sIHJlcHJlc2VudGluZyBhIGZvcm11bGEuCiAgUkVUVVJOUzogVGhlIHVuaXZlcnNhbCBjbG9zdXJlIG9mIHRoZSB0ZXJtLgogIEVGRkVDVFM6IDxUPiBpcyBwYXJ0IG9mIHRoZSByZXR1cm5lZCB0ZXJtIQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBMSVNUIFZhcnM7CgogIFZhcnMgPSBwY2hlY2tfQ29sbGVjdFRlcm1WYXJpYWJsZXMoVCk7CiAgCiAgaWYgKGxpc3RfRW1wdHkoVmFycykpCiAgICByZXR1cm4gVDsKICByZXR1cm4gZm9sX0NyZWF0ZVF1YW50aWZpZXIoZm9sX0FsbCgpLCBWYXJzLCBsaXN0X0xpc3QoVCkpOwp9CgoKc3RhdGljIFRFUk0gcGNoZWNrX0NsYXVzZVRvVGVybShDTEFVU0UgQ2xhdXNlKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIGNsYXVzZS4KICBSRVRVUk5TOiBUaGUgY2xhdXNlIHJlcHJlc2VudGVkIGFzIGEgVEVSTS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgaW50ICBMaXRTY2FuOwogIExJU1QgQXJnczsKICBURVJNIExpdDsKICBURVJNIENsYXVzZVRlcm07CgogIEFyZ3MgPSBsaXN0X05pbCgpOwoKICBmb3IgKExpdFNjYW4gPSBjbGF1c2VfRmlyc3RMaXRJbmRleCgpOyBMaXRTY2FuIDw9IGNsYXVzZV9MYXN0TGl0SW5kZXgoQ2xhdXNlKTsKICAgICAgIExpdFNjYW4rKykgewogICAgTGl0ICA9IGNsYXVzZV9MaXRlcmFsU2lnbmVkQXRvbShjbGF1c2VfR2V0TGl0ZXJhbChDbGF1c2UsIExpdFNjYW4pKTsKICAgIEFyZ3MgPSBsaXN0X0NvbnModGVybV9Db3B5KExpdCksIEFyZ3MpOwogIH0KCiAgaWYgKGxpc3RfRW1wdHkoQXJncykpCiAgICBBcmdzID0gbGlzdF9MaXN0KHRlcm1fQ3JlYXRlKGZvbF9GYWxzZSgpLCBsaXN0X05pbCgpKSk7CiAgCiAgLyogQnVpbGQgdGhlIGRpc2p1bmN0aW9uIG9mIHRoZSBsaXRlcmFscyAqLwogIGlmIChsaXN0X0VtcHR5KGxpc3RfQ2RyKEFyZ3MpKSkgeyAgIC8qIG9ubHkgb25lIGFyZyAqLwogICAgQ2xhdXNlVGVybSA9IGxpc3RfQ2FyKEFyZ3MpOwogICAgbGlzdF9EZWxldGUoQXJncyk7CiAgfSBlbHNlCiAgICBDbGF1c2VUZXJtID0gdGVybV9DcmVhdGUoZm9sX09yKCksIEFyZ3MpOwogIENsYXVzZVRlcm0gPSBwY2hlY2tfVW5pdkNsb3N1cmUoQ2xhdXNlVGVybSk7CgogIHJldHVybiBDbGF1c2VUZXJtOwp9CgoKc3RhdGljIExJU1QgcGNoZWNrX0NsYXVzZUxpc3RUb1Rlcm1MaXN0KExJU1QgQ2xhdXNlcykKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQgIDogQSBsaXN0IG9mIGNsYXVzZXMuCiAgUkVUVVJOUzogQSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBjbGF1c2VzIHJlcHJlc2VudGVkIGFzIFRFUk1zLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBMSVNUIFRlcm1zOwoKICBUZXJtcyA9IGxpc3RfTmlsKCk7CiAgZm9yICg7ICFsaXN0X0VtcHR5KENsYXVzZXMpOyBDbGF1c2VzID0gbGlzdF9DZHIoQ2xhdXNlcykpCiAgICBUZXJtcyA9IGxpc3RfQ29ucyhwY2hlY2tfQ2xhdXNlVG9UZXJtKGxpc3RfQ2FyKENsYXVzZXMpKSwgVGVybXMpOwogIAogIHJldHVybiBUZXJtczsKfQoKCnN0YXRpYyB2b2lkIHBjaGVja19TYXZlTnVtYmVyZWRERkdQcm9ibGVtKGludCBOdW1iZXIsIExJU1QgQXhpb21zLAoJCQkJCSAgTElTVCBDb25qZWN0dXJlcywKCQkJCQkgIGNvbnN0IGNoYXIqIFByb29mRmlsZU5hbWUsCgkJCQkJICBjb25zdCBjaGFyKiBEZXN0UHJlZml4KQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVCAgOiBBIChjbGF1c2UpIG51bWJlciwgYSBsaXN0IG9mIGF4aW9tcyBhbmQgY29uamVjdHVyZXMsCiAgICAgICAgICAgYW5kIGEgZmlsZW5hbWUgKG9mIHRoZSBwcm9vZiBmaWxlIG9mIHRoZSBjdXJyZW50bHkKCSAgIGNoZWNrZWQgcHJvb2YpCiAgUkVUVVJOUzogTm90aGluZy4KICBFRkZFQ1RTOiBTYXZlcyBhIERGRyBmaWxlIGNvbnRhaW5pbmcgPEF4aW9tcz4gYW5kIDxDb25qZWN0dXJlcz4KICAgICAgICAgICB1bmRlciB0aGUgbmFtZSAiPERlc3RQcmVmaXg+PE51bWJlcj5fPFByb29mRmlsZU5hbWU+IgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBjaGFyICpGaWxlbmFtZSwgKlRtcCwgKk51bVN0cjsKICBGSUxFICpGaWxlOwoKICBOdW1TdHIgICA9IHN0cmluZ19JbnRUb1N0cmluZyhOdW1iZXIpOwogIFRtcCAgICAgID0gcGNoZWNrX0dlbmVyaWNGaWxlbmFtZShQcm9vZkZpbGVOYW1lLCBOdW1TdHIpOwogIEZpbGVuYW1lID0gc3RyaW5nX0NvbmMoRGVzdFByZWZpeCwgVG1wKTsKICAgIAogIEZpbGUgPSBtaXNjX09wZW5GaWxlKEZpbGVuYW1lLCAidyIpOwogIGZvbF9GUHJpbnRERkdQcm9ibGVtKEZpbGUsICJ7KlN1YiBQcm9vZip9IiwgInsqIFByb29mIENoZWNrZXIgKn0iLAoJCSAgICAgICAidW5zYXRpc2ZpYWJsZSIsCgkJICAgICAgICJ7KiBUaGUgcHJvYmxlbSBpcyB0aGUgY29ycmVjdG5lc3MgdGVzdCBmb3IgYSBzaW5nbGUgcHJvb2YgbGluZSAqfSIsCgkJICAgICAgIEF4aW9tcywgQ29uamVjdHVyZXMpOwogIG1pc2NfQ2xvc2VGaWxlKEZpbGUsIEZpbGVuYW1lKTsKCiAgc3RyaW5nX1N0cmluZ0ZyZWUoTnVtU3RyKTsKICBzdHJpbmdfU3RyaW5nRnJlZShUbXApOwogIHN0cmluZ19TdHJpbmdGcmVlKEZpbGVuYW1lKTsKfQoKCnN0YXRpYyB2b2lkIHBjaGVja19TcGxpdFRvUHJvYmxlbXMoVEFCTEVBVSBULCBjb25zdCBjaGFyKiBQcm9vZkZpbGVOYW1lLAoJCQkJICAgY29uc3QgY2hhciogRGVzdFByZWZpeCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSB0YWJsZWF1LCB3aGljaCBpc24ndCBhIGxlYWYgb2YgdGhlIHRhYmxlYXUgdHJlZSwKICAgICAgICAgICB0aGUgbmFtZSBvZiBhIHByb29mIGZpbGUgYW5kIGEgZmlsZSBuYW1lIHByZWZpeCB1c2VkIGZvcgoJICAgZ2VuZXJhdGluZyBmaWxlcy4KICBSRVRVUk5TOiBOb3RoaW5nLgogIEVGRkVDVDogIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIHByb29mIGNoZWNrIHRhc2tzIGZvciBjbGF1c2VzCiAgICAgICAgICAgcmVzdWx0aW5nIGZyb20gc3BsaXR0aW5nIHN0ZXBzIGFuZCB3cml0ZXMgdGhlbSB0bwoJICAgb3V0cHV0IGZpbGVzLgogIENBVVRJT046IFdlIGFzc3VtZSB0aGF0IHdlIGdldCBub24tbnVsbCBjbGF1c2VzIHdoZW4gY2FsbGluZwogICAgICAgICAgIHRhYl9TcGxpdENsYXVzZSBhbmQgdGFiX0xlZnRTcGxpdENsYXVzZS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgVEVSTSBTcGxpdENsYXVzZVRlcm0sIExlZnRDbGF1c2VUZXJtLCBSaWdodENsYXVzZVRlcm07CiAgVEVSTSBFcXVpdiwgRGlzaiwgVG1wOwogIExJU1QgQ29uaiwgQXJncywgTmVnYXRpb25zOwoKI2lmZGVmIENIRUNLCiAgaWYgKHRhYl9Jc0xlYWYoVCkpIHsKICAgIG1pc2NfU3RhcnRFcnJvclJlcG9ydCgpOwogICAgbWlzY19FcnJvclJlcG9ydCgiXG4gSW4gcGNoZWNrX1NwbGl0VG9Qcm9ibGVtczogVGFibGVhdSBpcyBhIGxlYWYgb2YgdGhlICIpOwogICAgbWlzY19FcnJvclJlcG9ydCgidGFibGVhdSB0cmVlLiIpOwogICAgbWlzY19GaW5pc2hFcnJvclJlcG9ydCgpOwogIH0KI2VuZGlmCgogIFNwbGl0Q2xhdXNlVGVybSA9IHBjaGVja19DbGF1c2VUb1Rlcm0odGFiX1NwbGl0Q2xhdXNlKFQpKTsKICBMZWZ0Q2xhdXNlVGVybSAgPSBwY2hlY2tfQ2xhdXNlVG9UZXJtKHRhYl9MZWZ0U3BsaXRDbGF1c2UoVCkpOwogIAogIC8qIGJ5IGRlZmF1bHQsIHRha2UgYWxsIHJpZ2h0IHNwbGl0IGNsYXVzZXMgYXMgbmVnYXRpb25zICAgICAgICovCiAgLyogaWYgdGhlIGZpcnN0IGNsYXVzZSBpcyB0aGUgc2Vjb25kIGhhbGYgb2YgYSBzcGxpdCBjbGF1c2UsICAgKi8KICAvKiB0YWtlIG9ubHkgdGhlIHJlc3Qgb2YgdGhlIHJpZ2h0IHNwbGl0IGNsYXVzZXMgYXMgbmVnYXRpb25zLiAqLwoKICBOZWdhdGlvbnMgPSB0YWJfUmlnaHRTcGxpdENsYXVzZXMoVCk7CiAgaWYgKCFsaXN0X0VtcHR5KE5lZ2F0aW9ucykgJiYgcGNoZWNrX0lzUmlnaHRTcGxpdEhhbGYobGlzdF9DYXIoTmVnYXRpb25zKSkpIHsKICAgIC8qIEVLOiBNZWluZXIgTWVpbnVuZyBuYWNoIGlzdCBlcyBlaW5lIEludmFyaWFudGUsIGRh3yBkaWUgZXJzdGUgKi8KICAgIC8qIEVsdGVybmtsYXVzZWwgZGllIHJlY2h0ZSBI5GxmdGUgZWluZXMgU3BsaXR0aW5ncyBpc3Q/Pz8gICovCiAgICBOZWdhdGlvbnMgPSBsaXN0X0NkcihOZWdhdGlvbnMpOwogICAgLyogYnVpbGQgQyA8PT4gQycgdiBDJycgICovCiAgICBSaWdodENsYXVzZVRlcm0gPSBwY2hlY2tfQ2xhdXNlVG9UZXJtKGxpc3RfQ2FyKHRhYl9SaWdodFNwbGl0Q2xhdXNlcyhUKSkpOwogICAgRGlzaiAgPSB0ZXJtX0NyZWF0ZShmb2xfT3IoKSwgbGlzdF9Db25zKExlZnRDbGF1c2VUZXJtLCBsaXN0X0xpc3QoUmlnaHRDbGF1c2VUZXJtKSkpOwogICAgRXF1aXYgPSB0ZXJtX0NyZWF0ZShmb2xfRXF1aXYoKSwgbGlzdF9Db25zKFNwbGl0Q2xhdXNlVGVybSwgbGlzdF9MaXN0KERpc2opKSk7CiAgICBDb25qICA9IGxpc3RfTGlzdChFcXVpdik7CiAgICAKICAgIHBjaGVja19TYXZlTnVtYmVyZWRERkdQcm9ibGVtKGNsYXVzZV9OdW1iZXIodGFiX0xlZnRTcGxpdENsYXVzZShUKSksCgkJCQkgIGxpc3RfTmlsKCksIENvbmosIFByb29mRmlsZU5hbWUsIERlc3RQcmVmaXgpOwogICAgdGVybV9EZWxldGVUZXJtTGlzdChDb25qKTsKICB9CiAgCiAgQXJncyA9IGxpc3RfTmlsKCk7CgogIC8qIGJ1aWxkIGNvbmp1bmN0aW9uIG9mIG5lZ2F0aW9ucywgaWYgdGhlcmUgYXJlIGFueS4gKi8KICBpZiAoIWxpc3RfRW1wdHkoTmVnYXRpb25zKSkgewogICAgTGVmdENsYXVzZVRlcm0gPSBwY2hlY2tfQ2xhdXNlVG9UZXJtKHRhYl9MZWZ0U3BsaXRDbGF1c2UoVCkpOwogICAgQXJncyAgPSBwY2hlY2tfQ2xhdXNlTGlzdFRvVGVybUxpc3QoTmVnYXRpb25zKTsKICAgIC8qIEJ1aWxkIHRoZSBjb25qdW5jdGlvbiAqLwogICAgaWYgKGxpc3RfRW1wdHkobGlzdF9DZHIoQXJncykpKSB7ICAvKiBvbmx5IG9uZSBhcmcgKi8KICAgICAgVG1wID0gbGlzdF9DYXIoQXJncyk7CiAgICAgIGxpc3RfRGVsZXRlKEFyZ3MpOwogICAgfSBlbHNlCiAgICAgIFRtcCA9IHRlcm1fQ3JlYXRlKGZvbF9BbmQoKSwgQXJncyk7CiAgICBUbXAgICA9IHRlcm1fQ3JlYXRlKGZvbF9Ob3QoKSwgbGlzdF9MaXN0KFRtcCkpOwogICAgRXF1aXYgPSB0ZXJtX0NyZWF0ZShmb2xfSW1wbGllcygpLGxpc3RfQ29ucyhUbXAsbGlzdF9MaXN0KExlZnRDbGF1c2VUZXJtKSkpOwogICAgQ29uaiAgPSBsaXN0X0xpc3QoRXF1aXYpOwogICAgCiAgICAvKiBwcm9ibGVtIGlkIGlzIG51bWJlciBvZiByaWdodCBwYXJ0IG9mIHNwbGl0IGNsYXVzZSwgaWYgaXQgZXhpc3RzLAogICAgICAgbnVtYmVyIG9mIGZpcnN0IG5lZ2F0aW9uIG90aGVyd2lzZSAqLwogICAgcGNoZWNrX1NhdmVOdW1iZXJlZERGR1Byb2JsZW0oY2xhdXNlX051bWJlcihsaXN0X0Nhcih0YWJfUmlnaHRTcGxpdENsYXVzZXMoVCkpKSwgCgkJCQkgIGxpc3RfTmlsKCksIENvbmosIFByb29mRmlsZU5hbWUsIERlc3RQcmVmaXgpOwogICAgdGVybV9EZWxldGVUZXJtTGlzdChDb25qKTsKICB9Cn0KCgp2b2lkIHBjaGVja19UYWJsZWF1VG9Qcm9vZlRhc2soVEFCTEVBVSBULCBjb25zdCBjaGFyKiBQcm9vZkZpbGVOYW1lLAoJCQkgICAgICAgY29uc3QgY2hhciogRGVzdFByZWZpeCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSBUYWJsZWF1LCB0d28gc3RyaW5ncyBmb3IgZmlsZW5hbWUgZ2VuZXJhdGlvbi4KICBSRVRVUk5TOiBOb3RoaW5nLgogIEVGRkVDVFM6IEdlbmVyYXRlcyBERkcgcHJvYmxlbSBmaWxlcyBmb3IgZWFjaCBjbGF1c2UgaW4gdGhlIHRhYmxlYXUuCiAgICAgICAgICAgVGhlIHByb2JsZW0gYXNzZXJ0cyB0aGF0IHRoZSBjbGF1c2UgZm9sbG93cyBmcm9tCgkgICBpdHMgcGFyZW50cy4gRm9yIHNwbGl0cywgc2VlIHBjaGVja19TcGxpdFRvUHJvYmxlbXMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgTElTVCAgIFNjYW47CiAgTElTVCAgIEF4aW9tcywgQ29uaiwgSGVscDsKICBDTEFVU0UgQ2xhdXNlOwoKICBpZiAodGFiX0lzRW1wdHkoVCkpCiAgICByZXR1cm47CgogIC8qIHRyZWF0IHRoZSBzcGxpdHRpbmcgY2xhdXNlcyBhdCBpbm5lciBub2RlcyBvZiB0aGUgdGFibGVhdSB0cmVlICovCiAgaWYgKCF0YWJfSXNMZWFmKFQpKQogICAgcGNoZWNrX1NwbGl0VG9Qcm9ibGVtcyhULCBQcm9vZkZpbGVOYW1lLCBEZXN0UHJlZml4KTsKIAogIC8qIHRyZWF0IGRlcml2ZWQgY2xhdXNlcyB0aGF0IGRvbid0IHJlc3VsdCBmcm9tIHNwbGl0dGluZyAqLwogIGZvciAoU2NhbiA9IHRhYl9DbGF1c2VzKFQpOyAhbGlzdF9FbXB0eShTY2FuKTsgU2NhbiA9IGxpc3RfQ2RyKFNjYW4pKSB7CiAgICBDbGF1c2UgPSBsaXN0X0NhcihTY2FuKTsKICAgIGlmICghY2xhdXNlX0lzRnJvbVNwbGl0dGluZyhDbGF1c2UpICYmCgkhbGlzdF9FbXB0eShjbGF1c2VfUGFyZW50Q2xhdXNlcyhDbGF1c2UpKSkgewogICAgICBBeGlvbXMgPSBsaXN0X0NvcHkoY2xhdXNlX1BhcmVudENsYXVzZXMoQ2xhdXNlKSk7CiAgICAgIEF4aW9tcyA9IGxpc3RfUG9pbnRlckRlbGV0ZUR1cGxpY2F0ZXMoQXhpb21zKTsKICAgICAgSGVscCAgID0gQXhpb21zOwogICAgICBBeGlvbXMgPSBwY2hlY2tfQ2xhdXNlTGlzdFRvVGVybUxpc3QoQXhpb21zKTsKICAgICAgbGlzdF9EZWxldGUoSGVscCk7CiAgICAgIENvbmogICA9IGxpc3RfTGlzdChwY2hlY2tfQ2xhdXNlVG9UZXJtKENsYXVzZSkpOwogICAgICBwY2hlY2tfU2F2ZU51bWJlcmVkREZHUHJvYmxlbShjbGF1c2VfTnVtYmVyKENsYXVzZSksIEF4aW9tcywgQ29uaiwKCQkJCSAgICBQcm9vZkZpbGVOYW1lLCBEZXN0UHJlZml4KTsKICAgICAgdGVybV9EZWxldGVUZXJtTGlzdChBeGlvbXMpOwogICAgICB0ZXJtX0RlbGV0ZVRlcm1MaXN0KENvbmopOwogICAgfQogIH0KICAKICAvKiByZWN1cnNpb24gKi8KICBwY2hlY2tfVGFibGVhdVRvUHJvb2ZUYXNrKHRhYl9SaWdodEJyYW5jaChUKSwgUHJvb2ZGaWxlTmFtZSwgRGVzdFByZWZpeCk7CiAgcGNoZWNrX1RhYmxlYXVUb1Byb29mVGFzayh0YWJfTGVmdEJyYW5jaChUKSwgUHJvb2ZGaWxlTmFtZSwgRGVzdFByZWZpeCk7Cn0KCgppbnQgcGNoZWNrX1NlcVByb29mRGVwdGgoTElTVCBQcm9vZikKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQgIDogQSBzZXF1ZW50aWFsIHByb29mIChsaXN0IG9mIGNsYXVzZXMpCiAgUkVUVVJOUzogVGhlIG1heGltdW0gY2xhdXNlIGRlcHRoIGluIHRoZSBwcm9vZgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAp7CiAgaW50IE1heDsKCiAgTWF4ID0gMDsKICBmb3IgKCA7ICFsaXN0X0VtcHR5KFByb29mKTsgUHJvb2YgPSBsaXN0X0NkcihQcm9vZikpIAogICAgaWYgKGNsYXVzZV9EZXB0aChsaXN0X0NhcihQcm9vZikpID4gTWF4KQogICAgICBNYXggPSBjbGF1c2VfRGVwdGgobGlzdF9DYXIoUHJvb2YpKTsKICAKICByZXR1cm4gTWF4Owp9CgoKTElTVCBwY2hlY2tfUmVkdWNlU1BBU1NQcm9vZihMSVNUIFByb29mKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIGxpc3Qgb2YgY2xhdXNlcyByZXByZXNlbnRpbmcgYSBTUEFTUyBwcm9vZi4KICAgICAgICAgICBQYXJlbnRzIGFyZSBwb2ludGVycy4KICBSRVRVUk5TOiBBIGxpc3Qgb2YgY2xhdXNlcyB3ZXJlIGluY29tcGxldGUgc3BsaXRzCiAgICAgICAgICAgYW5kIGNsb3NlZCBicmFuY2hlcyB3aXRoIGRlc2NlbmRhbnRzIGhhdmUgYmVlbgoJICAgcmVtb3ZlZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgCnsKICBMSVNUICAgIEVtcHR5Q2xhdXNlcywgUmVkdW5kYW50Q2xhdXNlczsKICBMSVNUICAgIFJlZHVjZWRQcm9vZjsKICBUQUJMRUFVIFRhYmxlYXU7CiAgTElTVCAgICBVbm1hcmtlZFNwbGl0czsKCiAgaWYgKCFwY2hlY2tfQnVpbGRUYWJsZWF1RnJvbVByb29mKFByb29mLCAmVGFibGVhdSkpIHsKICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBFcnJvcjogUHJvb2YgY291bGQgbm90IGJlIHRyYW5zbGF0ZWQgaW50byBhIGNsb3NlZCB0YWJsZWF1LlxuIik7CiAgICBtaXNjX0ZpbmlzaFVzZXJFcnJvclJlcG9ydCgpOwogIH0KCiAgUmVkdW5kYW50Q2xhdXNlcyA9IGxpc3RfTmlsKCk7CiAgVGFibGVhdSA9IHRhYl9QcnVuZUNsb3NlZEJyYW5jaGVzKFRhYmxlYXUsICZSZWR1bmRhbnRDbGF1c2VzKTsKICBUYWJsZWF1ID0gdGFiX1JlbW92ZUluY29tcGxldGVTcGxpdHMoVGFibGVhdSwgJlJlZHVuZGFudENsYXVzZXMpOwogIGxpc3RfRGVsZXRlKFJlZHVuZGFudENsYXVzZXMpOwogIAogIHRhYl9TZXRTcGxpdExldmVscyhUYWJsZWF1KTsKICAKICAvKiAKICAgKiAgZ2V0IG1pbmltYWwgcHJvb2Y6IEZpcnN0IGZpbmQgZWFybGllc3QgZGVyaXZlZCBlbXB0eSBjbGF1c2VzLAogICAqICB0aGVuIHJlY3Vyc2l2ZWx5IG1hcmsgYW5jZXN0b3JzIG9mIHRoZXNlIGNsYXVzZXMuIFB1dAogICAqICBvbmx5IG1hcmtlZCBjbGF1c2VzIGluIDxSZWR1Y2VkUHJvb2Y+LgogICAqLwoKICBFbXB0eUNsYXVzZXMgPSBsaXN0X05pbCgpOwogIHRhYl9HZXRFYXJsaWVzdEVtcHR5Q2xhdXNlcyhUYWJsZWF1LCAmRW1wdHlDbGF1c2VzKTsKICBwY2hlY2tfQ2xhdXNlTGlzdFJlbW92ZUZsYWcoUHJvb2YsIE1BUktFRCk7CiAgcGNoZWNrX01hcmtSZWN1cnNpdmUoRW1wdHlDbGF1c2VzKTsKICBVbm1hcmtlZFNwbGl0cyA9IGxpc3RfTmlsKCk7CiAgcGNoZWNrX0NvbGxlY3RVbm1hcmtlZFNwbGl0cyhUYWJsZWF1LCAmVW5tYXJrZWRTcGxpdHMpOwogIHBjaGVja19NYXJrUmVjdXJzaXZlKFVubWFya2VkU3BsaXRzKTsKICBwY2hlY2tfUmVtb3ZlVW5tYXJrZWRGcm9tVGFibGVhdShUYWJsZWF1KTsgCiAgbGlzdF9EZWxldGUoVW5tYXJrZWRTcGxpdHMpOwoKICBSZWR1Y2VkUHJvb2YgPSBsaXN0X05pbCgpOyAKICB0YWJfVG9DbGF1c2VMaXN0KFRhYmxlYXUsICZSZWR1Y2VkUHJvb2YpOwogIFJlZHVjZWRQcm9vZiA9IHBjaGVja19DbGF1c2VOdW1iZXJNZXJnZVNvcnQoUmVkdWNlZFByb29mKTsKCiAgdGFiX0RlbGV0ZShUYWJsZWF1KTsKICBsaXN0X0RlbGV0ZShFbXB0eUNsYXVzZXMpOyAKCiAgcmV0dXJuIFJlZHVjZWRQcm9vZjsKfQoKCnZvaWQgcGNoZWNrX0RlbGV0ZVByb29mKExJU1QgUHJvb2YpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIEEgUHJvb2YKICBSRVRVUk5TOiBOb3RoaW5nLgogIEVGRkVDVFM6IEZyZWVzIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggcHJvb2YKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBMSVNUIExpbmUsIFNjYW4yLCBTY2FuMTsKICAKICBTY2FuMSA9IFByb29mOwogIHdoaWxlICghbGlzdF9FbXB0eShTY2FuMSkpIHsKICAgIExpbmUgPSBsaXN0X0NhcihTY2FuMSk7CiAgICAKICAgIHN0cmluZ19TdHJpbmdGcmVlKGxpc3RfQ2FyKExpbmUpKTsKICAgIGlmIChsaXN0X1NlY29uZChMaW5lKSAhPSBjbGF1c2VfTnVsbCgpKSAgICAgICAgICAgICAgICAvKiBjbGF1c2UgKi8KICAgICAgdGVybV9EZWxldGUobGlzdF9TZWNvbmQoTGluZSkpOwoKICAgIC8qIGRlbGV0ZSBsYWJlbHMgaW4ganVzdGlmaWNhdGlvbiBsaXN0IGFuZCBsaXN0IGl0c2VsZiAqLwoKICAgIGZvciAoU2NhbjIgPSBsaXN0X1RoaXJkKExpbmUpOyAhbGlzdF9FbXB0eShTY2FuMik7IFNjYW4yID0gbGlzdF9DZHIoU2NhbjIpKSAKICAgICAgc3RyaW5nX1N0cmluZ0ZyZWUobGlzdF9DYXIoU2NhbjIpKTsKICAgIGxpc3RfRGVsZXRlKGxpc3RfVGhpcmQoTGluZSkpOyAgICAgCgogICAgLyogbm93IGNvbnRlbnRzIG9mIGxpbmUgYXJlIGRlbGV0ZWQuIERlbGV0ZSBsaW5lLiAqLwogICAgbGlzdF9EZWxldGUoTGluZSk7ICAgICAKICAgIFNjYW4xID0gbGlzdF9DZHIoU2NhbjEpOwogIH0KICBsaXN0X0RlbGV0ZShQcm9vZik7Cn0KCgpjaGFyKiBwY2hlY2tfR2VuZXJpY0ZpbGVuYW1lKGNvbnN0IGNoYXIqIEZpbGVuYW1lLCBjb25zdCBjaGFyKiBJZCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgVHdvIHN0cmluZ3MuCiAgUkVUVVJOUzogQSBzdHJpbmcgd2l0aCBTdWZmaXggYXMgbmV3IGV4dGVuc2lvbiB0byBGaWxlbmFtZQogICAgICAgICAgIChGaWxlbmFtZSA9IG5hbWUuZXh0IC0+IG5hbWVfPElkPi5wcmYpCiAgRUZGRUNUUzogTWVtb3J5IGlzIGFsbG9jYXRlZCBmb3IgdGhlIHJldHVybmVkIHN0cmluZy4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsJCiAgY2hhciAqSGVscDEsICpIZWxwMjsKICBpbnQgIGk7CgogIEhlbHAxID0gc3RyaW5nX0NvbmMoIl8iLCBJZCk7IAogIEhlbHAyID0gc3RyaW5nX0NvbmMoSGVscDEsIHBjaGVja19Qcm9vZkZpbGVTdWZmaXgpOyAKICBzdHJpbmdfU3RyaW5nRnJlZShIZWxwMSk7CiAgCiAgLyogcmVtb3ZlIGZpbGVuYW1lIGV4dGVuc2lvbiAqLwogIGZvciAoaSA9IDA7IEZpbGVuYW1lW2ldICE9ICcuJyAmJiBpIDwgc3RybGVuKEZpbGVuYW1lKTsgaSsrKQogICAgLyogZW1wdHkgKi87CiAgSGVscDEgPSBzdHJpbmdfUHJlZml4KEZpbGVuYW1lLCBpKTsKCiAgcmV0dXJuIHN0cmluZ19OY29uYyhIZWxwMSwgSGVscDIpOyAgLyogSGVscDEgYW5kIEhlbHAyIGFyZSBmcmVlZCwgdG9vICovCn0KCgp2b2lkIHBjaGVja19DbGF1c2VMaXN0UmVtb3ZlRmxhZyhMSVNUIENsYXVzZXMsIENMQVVTRV9GTEFHUyBGbGFnKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIGxpc3Qgb2YgY2xhdXNlcyBhbmQgYSBjbGF1c2UgZmxhZwogIFJFVFVSTlM6IE5vdGhpbmcuCiAgRUZGRUNUUzogUmVtb3ZlcyB0aGUgPEZsYWc+IGluIGFsbCBjbGF1c2VzIGluIHRoZSBsaXN0CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgZm9yICg7ICFsaXN0X0VtcHR5KENsYXVzZXMpOyBDbGF1c2VzID0gbGlzdF9DZHIoQ2xhdXNlcykpIAogICAgY2xhdXNlX1JlbW92ZUZsYWcobGlzdF9DYXIoQ2xhdXNlcyksIEZsYWcpOwp9CgoKTElTVCBwY2hlY2tfQ2xhdXNlTnVtYmVyTWVyZ2VTb3J0KExJU1QgTCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSBsaXN0IG9mIGNsYXVzZXMgIAogIFJFVFVSTlM6IFRoZSBzb3J0ZWQgbGlzdDogY2xhdXNlX051bWJlcihMW2ldKSA8IGNsYXVzZV9OdW1iZXIoTFtpKzFdKQogIEVGRkVDVFM6IERlc3RydWN0aXZlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIHJldHVybiBjbGF1c2VfTnVtYmVyU29ydChMKTsKfQo=