I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KCi8qIFNpbXBsZSByYXl0cmFjZXIKICogLS0tLS0tLS0tLS0tLS0tLQogKiBGZWF0dXJlcyByZWZsZWN0aW9ucywgYW50aS1hbGlhc2luZwogKiBhbmQgc29mdC1zaGFkb3dzLgogKiAKICogV3JpdHRlbiBieSBNYXJjdXMgR2VlbG5hcmQsIGJlbmNobWFya2lmaWVkIGJ5CiAqIFBldGVyIFJ1bmRiZXJnLCBiaWZmQGNlLmNoYWxtZXJzLnNlCiAqLwoKI2RlZmluZSBXSURUSCAgNjQwCiNkZWZpbmUgSEVJR0hUIDQ4MAojZGVmaW5lIEVQU0lMT04gKDFlLTUpICAvKiBWZXJ5IHNtYWxsIHZhbHVlLCB1c2VkIGZvciBjb29yZGluYXRlLWNvbXBhcnNpb25zICovCiNkZWZpbmUgTUFYVCAoMWU1KSAgICAgIC8qIE1heGltdW0gdC1kaXN0YW5jZSBmb3IgYW4gaW50ZXJzZWN0aW9uLXBvaW50ICovCiNkZWZpbmUgTUFYUkVDIDYgICAgICAgIC8qIE1heGltdW0gYW1vdW50IG9mIHJlY3Vyc2lvbnMgKHJlZmxlY3Rpb24gZXRjLikgKi8KLyogI2RlZmluZSBESVNUUklCIDEyICovICAgICAgLyogQW1vdW50IG9mIGRpc3RyaWJ1dGVkIHJheXMgcGVyICJ2aXJ0dWFsIiByYXkgKi8KaW50IERJU1RSSUI7CiNkZWZpbmUgRElTVExFVkVMUyAzICAgIC8qIEhvdyBkZWVwIGluIHRoZSByZWN1cnNpb24tdHJlZSB0byBhbGxvdyBkaXN0cmlidXRpb24gKi8KCnR5cGVkZWYgdW5zaWduZWQgY2hhciBVQllURTsKdHlwZWRlZiBzdHJ1Y3QgeyBkb3VibGUgeCx5LHo7IH0gVkVDVE9SOwoKVUJZVEUgbWVtb3J5WzMqV0lEVEgqSEVJR0hUXTsKCnR5cGVkZWYgc3RydWN0IHsKICAgIFZFQ1RPUiAgY29sb3I7ICAgICAgICAgICAgICAgICAgICAgIC8qIE9iamVjdCBjb2xvciAocixnLGIpICovCiAgICBkb3VibGUgIGRpZmZ1c2U7ICAgICAgICAgICAgICAgICAgICAvKiBEaWZmdXNlIHJlZmxlY3Rpb24gKDAtMSkgKi8KICAgIGRvdWJsZSAgcmVmbGVjdDsgICAgICAgICAgICAgICAgICAgIC8qIFJlbGVmY3Rpb24gKDAtMSkgKi8KICAgIGRvdWJsZSAgcm91Z2huZXNzOyAgICAgICAgICAgICAgICAgIC8qIEhvdyByb3VnaCB0aGUgcmVmbGVjdGlvbiBpcyAoMD12ZXJ5IHNoYXJwKSAqLwp9IFRFWFRVUkU7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBWRUNUT1IgIHBvczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb3NpdGlvbiAoeCx5LHopICovCiAgICBkb3VibGUgIHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSYWRpdXMgKG9yIHNpemUpICovCiAgICBURVhUVVJFIHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUZXh0dXJlICovCn0gT0JKOwoKLyoKICogIE9iamVjdHMgKCA9IHNwaGVyZXMgKS4gT25seSBvbmUgc3BoZXJlLiBBZGQgbW9yZSBpZiB5b3UgbGlrZSA6KQogKi8KCk9CSiBvYmpzW10gPSB7CiAgICAvKiBPYmplY3QgMSAqLwogICAgewogICAgICAgIHsgMCwgNCwgMS4wIH0sIDEsCiAgICAgICAgewogICAgICAgICAgICB7IDEuMCwgMC40LCAwLjAgfSwKICAgICAgICAgICAgMC40LAogICAgICAgICAgICAwLjgsCiAgICAgICAgICAgIDAuMDIKICAgICAgICB9CiAgICB9LAogICAgLyogT2JqZWN0IDIgKi8KICAgIHsKICAgICAgICB7IC0xLCAzLCAwLjQgfSwgMC40LAogICAgICAgIHsKICAgICAgICAgICAgeyAwLjUsIDAuMywgMS4wIH0sCiAgICAgICAgICAgIDAuNSwKICAgICAgICAgICAgMC45LAogICAgICAgICAgICAwLjAxCiAgICAgICAgfQogICAgfSwKICAgIC8qIE9iamVjdCAzICovCiAgICB7CiAgICAgICAgeyAtMC4zLCAxLCAwLjQgfSwgMC40LAogICAgICAgIHsKICAgICAgICAgICAgeyAwLjEsIDAuOTUsIDAuMiB9LAogICAgICAgICAgICAwLjYsCiAgICAgICAgICAgIDAuOCwKICAgICAgICAgICAgMC4wMQogICAgICAgIH0KICAgIH0sCiAgICAvKiBPYmplY3QgNCAqLwogICAgewogICAgICAgIHsgMS4wLCAyLCAwLjQgfSwgMC40LAogICAgICAgIHsKICAgICAgICAgICAgeyAwLjg2LCAwLjgzLCAwIH0sCiAgICAgICAgICAgIDAuNywKICAgICAgICAgICAgMC42LAogICAgICAgICAgICAwLjAxCiAgICAgICAgfQogICAgfQp9OwoKI2RlZmluZSBOVU1PQkpTIDQKCgovKgogKiBHcm91bmQgcG9zaXRpb24gKHotcG9zKSwgYW5kIHRleHR1cmVzICh0aWxlZCkKICovCgpkb3VibGUgR3JvdW5kcG9zID0gMC4wOwpURVhUVVJFIEdyb3VuZHR4dFsyXSA9IHsKICAgIHsKICAgICAgICB7IDAuMCwgMC4xLCAwLjUgfSwKICAgICAgICAwLjgsCiAgICAgICAgMC40NCwKICAgICAgICAwLjAyCiAgICB9LAogICAgewogICAgICAgIHsgMC42LCAxLjAsIDAuNSB9LAogICAgICAgIDAuOCwKICAgICAgICAwLjQ0LAogICAgICAgIDAuMDEKICAgIH0sCn07CgoKLyoKICogT25seSBvbmUgbGlnaHQtc291cmNlIGlzIHN1cHBvcnRlZCAoYW5kIGl0J3Mgd2hpdGUpLgogKi8KClZFQ1RPUiBMaWdodHBvcyA9IHstMy4wLCAxLjAsIDUuMH07CmRvdWJsZSBMaWdodHIgICA9IDAuNDsgICAgICAgICAgICAgIC8qIExpZ2h0LXJhZGl1cyAoZm9yIHNvZnQgc2hhZG93cykgKi8KCgovKgogKiBUaGUgY2FtZXJhIHBvc2l0aW9uICh4LHkseiksIGFuZCBvcmllbnRhdGlvbi4KICovCgpWRUNUT1IgQ2FtZXJhcG9zICAgPSB7MS41LCAtMS40LCAxLjJ9OwpWRUNUT1IgQ2FtZXJhcmlnaHQgPSB7My4wLCAxLjAsIDAuMH07ClZFQ1RPUiBDYW1lcmFkaXIgICA9IHstMS4wLCAzLjAsIDAuMH07ClZFQ1RPUiBDYW1lcmF1cCAgICA9IHswLjAsIDAuMCwgMi4zNzE3fTsKCgovKgogKiBBbWJpZW50IGxpZ2h0aW5nICgwLjAtMS4wKQogKi8KCmRvdWJsZSBBbWJpZW50ID0gMC4zOwoKCi8qCiAqIFNreWNvbG9ycyAoU2t5Y29sb3JbMF0gPSBob3Jpem9uLCBTa3ljb2xvclsxXSA9IHplbml0ICkKICovCgpWRUNUT1IgU2t5Y29sb3JbMl0gPSB7IHsgMC41LCAwLjMsIDAuNyB9LCB7IDAuMCwgMC4wLCAwLjIgfSB9OwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgSGVscGVycyAoZ2VvbWV0cmljYWwgZXRjKS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdW5zaWduZWQgbG9uZyBybmQgPSAweDUyNDYyNDY3TDsKCnN0YXRpYyBkb3VibGUgSml0dGVyKCB2b2lkICkKewogICAgcm5kID0gKDExMDM1MTUyNDVMKnJuZCArIDEyMzQ1TCkgJiAweDdmZmZmZmZmTDsKICAgIHJldHVybiggMS4wLSgoZG91YmxlKXJuZC8oZG91YmxlKTB4M2ZmZmZmZmYpICk7Cn0KCgpzdGF0aWMgdm9pZCBSZWZsZWN0VmVjdG9yKCBWRUNUT1IgKnYyLCBWRUNUT1IgKnYxLCBWRUNUT1IgKm4gKQp7CiAgICBkb3VibGUgIGEsIGI7CiAKICAgIGIgPSBuLT54Km4tPnggKyBuLT55Km4tPnkgKyBuLT56Km4tPno7ICAgICAgLyogYiA9IHxufF4yICovCiAgICBhID0gdjEtPngqbi0+eCArIHYxLT55Km4tPnkgKyB2MS0+eipuLT56OyAgIC8qIGEgPSB2MbduICAqLwogICAgYSA9IC0yLjAgKiBhIC8gYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhID0gLTIqKHYxt24pL3xufF4yICovCiAgICB2Mi0+eCA9IHYxLT54ICsgYSpuLT54OyAgICAgICAgICAgICAgICAgICAgIC8qIHYyID0gdjEgKyBuKmEgKi8KICAgIHYyLT55ID0gdjEtPnkgKyBhKm4tPnk7CiAgICB2Mi0+eiA9IHYxLT56ICsgYSpuLT56Owp9CgoKc3RhdGljIGRvdWJsZSBWZWN0b3JMZW5ndGgoIFZFQ1RPUiAqdiApCnsKICAgIHJldHVybiggc3FydCggdi0+eCp2LT54ICsgdi0+eSp2LT55ICsgdi0+eip2LT56ICkgKTsKfQoKCnN0YXRpYyB2b2lkIFNjYWxlVmVjdG9yKCBWRUNUT1IgKnYsIGRvdWJsZSBzICkKewogICAgdi0+eCAqPSBzOyB2LT55ICo9IHM7IHYtPnogKj0gczsKfQoKCnN0YXRpYyB2b2lkIERpc3RyaWJWZWN0b3IoIFZFQ1RPUiAqZCwgVkVDVE9SICpuLCBkb3VibGUgc2EsIGRvdWJsZSBzYiApCnsKICAgIFZFQ1RPUiAgYSwgYjsKICAgIGRvdWJsZSAgbmw7CgogICAgaWYoIGZhYnMoIG4tPnogKSA+IEVQU0lMT04gKSB7CiAgICAgICAgYS54ID0gbi0+eSpuLT56OyBhLnkgPSAtbi0+eCpuLT56OyBhLnogPSAwLjA7CiAgICAgICAgYi54ID0gYS55Km4tPno7IGIueSA9IC1hLngqbi0+ejsgYi56ID0gYS54Km4tPnkgLSBhLnkqbi0+eDsKICAgIH0gZWxzZSB7CiAgICAgICAgYS54ID0gbi0+eTsgYS55ID0gLW4tPng7IGEueiA9IDAuMDsKICAgICAgICBiLnggPSBiLnkgPSAwLjA7IGIueiA9IDEuMDsKICAgIH0KICAgIG5sID0gVmVjdG9yTGVuZ3RoKCBuICk7CiAgICBTY2FsZVZlY3RvciggJmEsIHNhKihubC9WZWN0b3JMZW5ndGgoICZhICkpKkppdHRlcigpICk7CiAgICBTY2FsZVZlY3RvciggJmIsIHNiKihubC9WZWN0b3JMZW5ndGgoICZiICkpKkppdHRlcigpICk7CiAgICBkLT54ID0gYS54K2IueDsgZC0+eSA9IGEueStiLnk7IGQtPnogPSBhLnorYi56Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBPYmplY3QgaW50ZXJzZWN0aW9uIGNhbGN1bGF0aW9uIHJvdXRpbmVzLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgZG91YmxlIEludGVyc2VjdE9ianMoIFZFQ1RPUiAqTGluUCwgVkVDVE9SICpMaW5ELAogICAgICAgICAgICAgICAgICAgICAgVkVDVE9SICpQbnQsIFZFQ1RPUiAqTm9ybSwgVEVYVFVSRSAqKnR4dCApCnsKICAgIGludCAgICAgb2JqbiwgdGlsZW51bTsKICAgIGRvdWJsZSAgdCwgdHRtcCwgQSwgQiwgQzsKICAgIFZFQ1RPUiAgUG9zOwoKICAgIHQgPSAtMS4wOwoKICAgIC8qIFRyeSBpbnRlcnNlY3Rpb24gd2l0aCBncm91bmQgcGxhbmUgZmlyc3QgKi8KICAgIGlmKCBmYWJzKExpbkQtPnopID4gRVBTSUxPTiApIHsKICAgICAgICB0dG1wID0gKEdyb3VuZHBvcyAtIExpblAtPnopL0xpbkQtPno7CiAgICAgICAgaWYoICggdHRtcCA+IEVQU0lMT04gKSAmJiAoIHR0bXAgPCBNQVhUICkgKSB7CiAgICAgICAgICAgIHQgPSB0dG1wOwogICAgICAgICAgICBQbnQtPnggPSBMaW5QLT54ICsgTGluRC0+eCp0OyAgIC8qIENhbGN1bGF0ZSBpbnRlcnNlY3Rpb24gcG9pbnQgKi8KICAgICAgICAgICAgUG50LT55ID0gTGluUC0+eSArIExpbkQtPnkqdDsKICAgICAgICAgICAgUG50LT56ID0gTGluUC0+eiArIExpbkQtPnoqdDsKICAgICAgICAgICAgTm9ybS0+eCA9IDAuMDsgICAgICAgICAgICAgICAgICAvKiBTdXJmYWNlIG5vcm1hbCAoYWx3YXlzIHVwKSAqLwogICAgICAgICAgICBOb3JtLT55ID0gMC4wOwogICAgICAgICAgICBOb3JtLT56ID0gMS4wOwogICAgICAgICAgICB0aWxlbnVtID0gKCAoKGludCkoUG50LT54KzUwMDAwLjApKSsoKGludCkoUG50LT55KzUwMDAwLjApKSApICYgMTsKICAgICAgICAgICAgKnR4dCA9ICYgR3JvdW5kdHh0WyB0aWxlbnVtIF07CiAgICAgICAgfQogICAgfQoKICAgIC8qIEdldCBjbG9zZXN0IGludGVyc2VjdGlvbiAoaWYgYW55KSAqLwogICAgZm9yKCBvYmpuID0gMDsgb2JqbiA8IE5VTU9CSlM7IG9iam4rKyApIHsKICAgICAgICBQb3MgPSBvYmpzW29iam5dLnBvczsKICAgICAgICBQb3MueCAtPSBMaW5QLT54OyAgICAgICAgICAgICAgICAgLyogVHJhbnNsYXRlIG9iamVjdCBpbnRvICJsaW5lLXNwYWNlIiAqLwogICAgICAgIFBvcy55IC09IExpblAtPnk7CiAgICAgICAgUG9zLnogLT0gTGluUC0+ejsKICAgICAgICBBID0gMS4wIC8gKExpbkQtPngqTGluRC0+eCArIExpbkQtPnkqTGluRC0+eSArIExpbkQtPnoqTGluRC0+eik7CiAgICAgICAgQiA9IChQb3MueCpMaW5ELT54ICsgUG9zLnkqTGluRC0+eSArIFBvcy56KkxpbkQtPnopICogQTsKICAgICAgICBDID0gKG9ianNbb2Jqbl0ucipvYmpzW29iam5dLnIgLSBQb3MueCpQb3MueCAtIFBvcy55KlBvcy55IC0gUG9zLnoqUG9zLnopICogQTsKICAgICAgICBpZiggKEEgPSBDICsgQipCKSA+IDAuMCApIHsgICAgICAgLyogLi4uZWxzZSBubyBoaXQgKi8KICAgICAgICAgICAgQSA9IHNxcnQoQSk7CiAgICAgICAgICAgIGlmKCAodHRtcCA9IEIgLSBBKSA8IEVQU0lMT04gKSB0dG1wID0gQiArIEE7CiAgICAgICAgICAgIGlmKCAoRVBTSUxPTjx0dG1wKSAmJiAoICh0dG1wPHQpfHwodDwwLjApICkgKSB7CiAgICAgICAgCXQgPSB0dG1wOwogICAgICAgIAlQbnQtPnggPSBMaW5ELT54KnQ7ICAgICAgIC8qIENhbGN1bGF0ZSBpbnRlcnNlY3Rpb24gcG9pbnQgKi8KICAgICAgICAJUG50LT55ID0gTGluRC0+eSp0OwogICAgICAgIAlQbnQtPnogPSBMaW5ELT56KnQ7CiAgICAgICAgCU5vcm0tPnggPSBQbnQtPngtUG9zLng7ICAgLyogQ2FsY3VhbGF0ZSBzdXJmYWNlIG5vcm1hbCAqLwogICAgICAgIAlOb3JtLT55ID0gUG50LT55LVBvcy55OwogICAgICAgIAlOb3JtLT56ID0gUG50LT56LVBvcy56OwogICAgICAgIAlQbnQtPnggKz0gTGluUC0+eDsgICAgICAgIC8qIFRyYW5zbGF0ZSBvYmplY3QgYmFjayB0byAidHJ1ZS1zcGFjZSIgKi8KICAgICAgICAJUG50LT55ICs9IExpblAtPnk7CiAgICAgICAgCVBudC0+eiArPSBMaW5QLT56OwogICAgICAgIAkqdHh0ID0gJm9ianNbb2Jqbl0udDsgICAgIC8qIEdldCBzdXJmYWNlIHByb3BlcnRpZXMgKi8KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4oIHQgKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgTGluZS10cmFjZXIgcm91dGluZSAod29ya3MgcmVjdXJzaXZlbHkpLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBUcmFjZUxpbmUoIFZFQ1RPUiAqTGluUCwgVkVDVE9SICpMaW5ELCBWRUNUT1IgKkNvbG9yLCBpbnQgcmVjY291bnQgKQp7CiAgICBWRUNUT1IgIFBudCwgTm9ybSwgTERpciwgTmV3RGlyLCBOZXdEaXIyLCBUbXBDb2wsIFRtcENvbDI7CiAgICBWRUNUT1IgIFRtcFBudCwgVG1wTm9ybSwgRDsKICAgIGRvdWJsZSAgdCwgQSwgY29zZmk7CiAgICBURVhUVVJFICp0eHQsICp0bXB0eHQ7CiAgICBpbnQgICAgIGksIHNoYWRvd2NvdW50LCB1c2VkaXN0OwoKICAgIENvbG9yLT54ID0gQ29sb3ItPnkgPSBDb2xvci0+eiA9IDAuMDsKCiAgICBpZiggcmVjY291bnQgPiAwICkgewogICAgICAgIC8qIE9ubHkgdXNlIGRpc3RyaWJ1dGVkIHRyYWNpbmcgaW4gaGlnaGVyIG5vZGVzIG9mIHRoZSByZWN1cnNpb24gdHJlZSAqLwogICAgICAgIHVzZWRpc3QgPSAoIChNQVhSRUMtcmVjY291bnQpIDwgRElTVExFVkVMUyApID8gMSA6IDA7CgogICAgICAgIC8qIFRyeSBpbnRlcnNlY3Rpb24gd2l0aCBvYmplY3RzICovCiAgICAgICAgdCA9IEludGVyc2VjdE9ianMoIExpblAsIExpbkQsICZQbnQsICZOb3JtLCAmdHh0ICk7CgogICAgICAgIC8qIEdldCBsaWdodC1pbnRlbnNpdHkgaW4gaW50ZXJzZWN0aW9uLXBvaW50IChzdG9yZSBpbiBjb3NmaSkgKi8KICAgICAgICBpZiggdCA+IEVQU0lMT04gKSB7CiAgICAgICAgICAgIExEaXIueCA9IExpZ2h0cG9zLngtUG50Lng7ICAgICAgIC8qIEdldCBsaW5lIHRvIGxpZ2h0IGZyb20gc3VyZmFjZSAqLwogICAgICAgICAgICBMRGlyLnkgPSBMaWdodHBvcy55LVBudC55OwogICAgICAgICAgICBMRGlyLnogPSBMaWdodHBvcy56LVBudC56OwogICAgICAgICAgICBjb3NmaSA9IExEaXIueCpOb3JtLnggKyBMRGlyLnkqTm9ybS55ICsgTERpci56Kk5vcm0uejsKICAgICAgICAgICAgaWYoY29zZmkgPiAwLjApIHsgICAgLyogSWYgYW5nbGUgYmV0d2VlbiBsaWdodGxpbmUgYW5kIG5vcm1hbCA8IFBJLzIgKi8KICAgICAgICAgICAgICAgIHNoYWRvd2NvdW50ID0gMDsKICAgICAgICAgICAgICAgIGlmKCB1c2VkaXN0ICkgewogICAgICAgICAgICAgICAgICAgIEEgPSBMaWdodHIgLyBWZWN0b3JMZW5ndGgoICZMRGlyICk7CiAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IERJU1RSSUI7IGkrKyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgRGlzdHJpYlZlY3RvciggJkQsICZMRGlyLCBBLCBBICk7CiAgICAgICAgICAgICAgICAgICAgICAgIE5ld0RpciA9IExEaXI7CiAgICAgICAgICAgICAgICAgICAgICAgIE5ld0Rpci54ICs9IEQueDsgTmV3RGlyLnkgKz0gRC55OyBOZXdEaXIueiArPSBELno7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBzaGFkb3dzIChpZ25vcmUgaGl0IGluZm8sIG1heSBiZSB1c2VkIHRob3VnaCkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdCA9IEludGVyc2VjdE9ianMoICZQbnQsICZOZXdEaXIsICZUbXBQbnQsICZUbXBOb3JtLCAmdG1wdHh0ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIHQgPCBFUFNJTE9OICkgfHwgKCB0ID4gMS4wICkgKSBzaGFkb3djb3VudCsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdCA9IEludGVyc2VjdE9ianMoICZQbnQsICZMRGlyLCAmVG1wUG50LCAmVG1wTm9ybSwgJnRtcHR4dCApOwogICAgICAgICAgICAgICAgICAgIGlmKCAoIHQgPCBFUFNJTE9OICkgfHwgKCB0ID4gMS4wICkgKSBzaGFkb3djb3VudCA9IERJU1RSSUI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiggc2hhZG93Y291bnQgPiAwICkgewogICAgICAgICAgICAgICAgICAgIEEgPSBOb3JtLngqTm9ybS54ICsgTm9ybS55Kk5vcm0ueSArIE5vcm0ueipOb3JtLno7CiAgICAgICAgICAgICAgICAgICAgQSAqPSBMRGlyLngqTERpci54ICsgTERpci55KkxEaXIueSArIExEaXIueipMRGlyLno7CiAgICAgICAgICAgICAgICAgICAgY29zZmkgPSAoY29zZmkvc3FydChBKSkqdHh0LT5kaWZmdXNlKihkb3VibGUpc2hhZG93Y291bnQvRElTVFJJQjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29zZmkgPSAwLjA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb3NmaSA9IDAuMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBDb2xvci0+eCA9IHR4dC0+Y29sb3IueCooQW1iaWVudCtjb3NmaSk7CiAgICAgICAgICAgIENvbG9yLT55ID0gdHh0LT5jb2xvci55KihBbWJpZW50K2Nvc2ZpKTsKICAgICAgICAgICAgQ29sb3ItPnogPSB0eHQtPmNvbG9yLnoqKEFtYmllbnQrY29zZmkpOwogICAgICAgICAgICBpZiggdHh0LT5yZWZsZWN0ID4gRVBTSUxPTiApIHsKICAgICAgICAgICAgICAgIFJlZmxlY3RWZWN0b3IoICZOZXdEaXIsIExpbkQsICZOb3JtICk7CiAgICAgICAgICAgICAgICBUbXBDb2wueCA9IFRtcENvbC55ID0gVG1wQ29sLnogPSAwLjA7CiAgICAgICAgICAgICAgICBpZiggdXNlZGlzdCAmJiAoIHR4dC0+cm91Z2huZXNzID4gRVBTSUxPTiApICkgewogICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBESVNUUklCOyBpKysgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIERpc3RyaWJWZWN0b3IoICZELCAmTmV3RGlyLCB0eHQtPnJvdWdobmVzcywgdHh0LT5yb3VnaG5lc3MgKTsKICAgICAgICAgICAgICAgICAgICAgICAgTmV3RGlyMiA9IE5ld0RpcjsKICAgICAgICAgICAgICAgICAgICAgICAgTmV3RGlyMi54ICs9IEQueDsgTmV3RGlyMi55ICs9IEQueTsgTmV3RGlyMi56ICs9IEQuejsKICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2VMaW5lKCAmUG50LCAmTmV3RGlyMiwgJlRtcENvbDIsIHJlY2NvdW50LTEgKTsKICAgICAgICAgICAgICAgICAgICAgICAgVG1wQ29sLnggKz0gVG1wQ29sMi54OwogICAgICAgICAgICAgICAgICAgICAgICBUbXBDb2wueSArPSBUbXBDb2wyLnk7CiAgICAgICAgICAgICAgICAgICAgICAgIFRtcENvbC56ICs9IFRtcENvbDIuejsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgU2NhbGVWZWN0b3IoICZUbXBDb2wsIDEuMC9ESVNUUklCICk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFRyYWNlTGluZSggJlBudCwgJk5ld0RpciwgJlRtcENvbCwgcmVjY291bnQtMSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQ29sb3ItPnggKz0gVG1wQ29sLnggKiB0eHQtPnJlZmxlY3Q7CiAgICAgICAgICAgICAgICBDb2xvci0+eSArPSBUbXBDb2wueSAqIHR4dC0+cmVmbGVjdDsKICAgICAgICAgICAgICAgIENvbG9yLT56ICs9IFRtcENvbC56ICogdHh0LT5yZWZsZWN0OwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyogR2V0IHNreS1jb2xvciAoaW50ZXJwb2xhdGUgYmV0d2VlbiBob3Jpem9uIGFuZCB6ZW5pdCkgKi8KICAgICAgICAgICAgQSA9IHNxcnQoIExpbkQtPngqTGluRC0+eCArIExpbkQtPnkqTGluRC0+eSApOwogICAgICAgICAgICBpZiggQSA+IDAuMCApIEEgPSBhdGFuKCBmYWJzKCBMaW5ELT56ICkgLyBBICkqMC42MzY2MTk3NzsKICAgICAgICAgICAgZWxzZSBBID0gMS4wOwogICAgICAgICAgICBDb2xvci0+eCA9IFNreWNvbG9yWzFdLngqQSArIFNreWNvbG9yWzBdLngqKDEuMC1BKTsKICAgICAgICAgICAgQ29sb3ItPnkgPSBTa3ljb2xvclsxXS55KkEgKyBTa3ljb2xvclswXS55KigxLjAtQSk7CiAgICAgICAgICAgIENvbG9yLT56ID0gU2t5Y29sb3JbMV0ueipBICsgU2t5Y29sb3JbMF0ueiooMS4wLUEpOwogICAgICAgIH0KCiAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGNvbG9yIGRvZXMgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBsZXZlbCAqLwogICAgICAgIGlmKENvbG9yLT54ID4gMS4wKSBDb2xvci0+eCA9IDEuMDsKICAgICAgICBpZihDb2xvci0+eSA+IDEuMCkgQ29sb3ItPnkgPSAxLjA7CiAgICAgICAgaWYoQ29sb3ItPnogPiAxLjApIENvbG9yLT56ID0gMS4wOwogICAgfQp9CgpzdGF0aWMgdm9pZCBUcmFjZVNjZW5lKHZvaWQpCnsKICBWRUNUT1IgIFBpeENvbG9yLCBDb2wsIExpbkQsIFNjYWxlOwogIFZFQ1RPUiAgTGluRDIsIEQ7CiAgaW50ICAgICBzeCwgc3ksIGk7CgogIFNjYWxlLnkgPSAxLjA7CiAgZm9yKCBzeSA9IDA7IHN5IDwgSEVJR0hUOyBzeSsrICkgewogICAgU2NhbGUueiA9ICgoZG91YmxlKShIRUlHSFQvMi1zeSkpLyhkb3VibGUpSEVJR0hUOwogICAgZm9yKCBzeCA9IDA7IHN4IDwgV0lEVEg7IHN4KysgKSB7CiAgICAgIFNjYWxlLnggPSAoKGRvdWJsZSkoc3gtV0lEVEgvMikpLyhkb3VibGUpV0lEVEg7CiAgICAgIAogICAgICAvKiBDYWxjdWxhdGUgbGluZS1kaXJlY3Rpb24gKGZyb20gY2FtZXJhLWNlbnRlciB0aHJvdWdoIGEgcGl4ZWwpICovCiAgICAgIExpbkQueCA9IENhbWVyYXJpZ2h0LngqU2NhbGUueCArIENhbWVyYWRpci54KlNjYWxlLnkgKyBDYW1lcmF1cC54KlNjYWxlLno7CiAgICAgIExpbkQueSA9IENhbWVyYXJpZ2h0LnkqU2NhbGUueCArIENhbWVyYWRpci55KlNjYWxlLnkgKyBDYW1lcmF1cC55KlNjYWxlLno7CiAgICAgIExpbkQueiA9IENhbWVyYXJpZ2h0LnoqU2NhbGUueCArIENhbWVyYWRpci56KlNjYWxlLnkgKyBDYW1lcmF1cC56KlNjYWxlLno7CiAgICAgIAogICAgICAvKiBHZXQgY29sb3IgZm9yIHBpeGVsICovCiNpZiAoRElTVExFVkVMUyA+IDApCiAgICAgIFBpeENvbG9yLnggPSBQaXhDb2xvci55ID0gUGl4Q29sb3IueiA9IDAuMDsKICAgICAgZm9yKCBpID0gMDsgaSA8IERJU1RSSUI7IGkrKyApIHsKCURpc3RyaWJWZWN0b3IoICZELCAmTGluRCwgMC41Lyhkb3VibGUpV0lEVEgsIDAuNS8oZG91YmxlKUhFSUdIVCApOwoJTGluRDIgPSBMaW5EOyBMaW5EMi54ICs9IEQueDsgTGluRDIueSArPSBELnk7IExpbkQyLnogKz0gRC56OwoJVHJhY2VMaW5lKCAmQ2FtZXJhcG9zLCAmTGluRDIsICZDb2wsIE1BWFJFQyApOwoJUGl4Q29sb3IueCArPSBDb2wueDsKCVBpeENvbG9yLnkgKz0gQ29sLnk7CglQaXhDb2xvci56ICs9IENvbC56OwogICAgICB9CiAgICAgIFNjYWxlVmVjdG9yKCAmUGl4Q29sb3IsIDEuMC9ESVNUUklCICk7CiNlbHNlCiAgICAgIFRyYWNlTGluZSggJkNhbWVyYXBvcywgJkxpbkQsICZQaXhDb2xvciwgTUFYUkVDICk7CiNlbmRpZgogIAogICAgICBtZW1vcnlbMyooc3grc3kqV0lEVEgpXT0oVUJZVEUpKFBpeENvbG9yLngqMjU1LjApOwogICAgICBtZW1vcnlbMyooc3grc3kqV0lEVEgpKzFdPShVQllURSkoUGl4Q29sb3IueSoyNTUuMCk7CiAgICAgIG1lbW9yeVszKihzeCtzeSpXSURUSCkrMl09KFVCWVRFKShQaXhDb2xvci56KjI1NS4wKTsKICAgIH0KICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIG1haW4oKSAgLSBDYW1lcmEgZW11bGF0aW9uIGFuZCBwaWN0dXJlIG91dHB1dCB0byBzdGRvdXQuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmludCBtYWluKGludCBjLCBjaGFyICp2W10pCnsKICBpbnQgaTsKCiAgRklMRSAqaW5fZnA7CgogIGZwcmludGYoc3RkZXJyLCJDb21waWxlIGRhdGU6ICVzXG4iLCBDT01QREFURSk7CiAgZnByaW50ZihzdGRlcnIsIkNvbXBpbGVyIHN3aXRjaGVzOiAlc1xuIiwgQ0ZMQUdTKTsKCiAgaW5fZnA9Zm9wZW4odlsxXSwiciIpOwogIGlmICghaW5fZnApIHsKICAgIHByaW50ZigiRVJST1I6IENvdWxkIG5vdCBvcGVuIGluZGF0YSBmaWxlXG4iKTsKICAgIGV4aXQoMSk7CiAgfQoKICBmc2NhbmYoaW5fZnAsIiVkIiwmRElTVFJJQik7CiAgZmNsb3NlKGluX2ZwKTsKICAvKiBFbmQgb2YgQmVuY2htYXJrIHN0dWZmICovCgoKICAvKiBXcml0ZSBQUE0gaGVhZGVyIHRvIHN0ZG91dCAqLwogIGZwcmludGYoIHN0ZG91dCwgIlA2IiApOyBmcHV0YyggMTAsIHN0ZG91dCApOwogIGZwcmludGYoIHN0ZG91dCwgIiVkICVkIiwgV0lEVEgsIEhFSUdIVCApOyBmcHV0YyggMTAsIHN0ZG91dCApOwogIGZwcmludGYoIHN0ZG91dCwgIjI1NSIgKTsgZnB1dGMoIDEwLCBzdGRvdXQgKTsKCiAgLyoqKi4uLmNhbGN1bGF0ZSBpbWFnZS4uLioqKi8KICBUcmFjZVNjZW5lKCk7CgogIC8qKiouLi53cml0ZSBpbWFnZSB0byBzdGRvdXQuLi4qKiovCiAgZm9yIChpPTAgOyBpPDMqV0lEVEgqSEVJR0hUIDsgKSB7CiAgICBmcHV0YyggbWVtb3J5W2krK10mfjEsIHN0ZG91dCk7CiAgICBmcHV0YyggbWVtb3J5W2krK10mfjEsIHN0ZG91dCk7CiAgICBmcHV0YyggbWVtb3J5W2krK10mfjEsIHN0ZG91dCk7CiAgfQoKICByZXR1cm4gMDsgLyoqKi4uLkFOU0kgQyB3YW50cyBtYWluIHRvIHJldHVybiBhbiBpbnQuLi4qKiovCn0K