LyoKICogCQkJCVNoZWxsIExpYnJhcnkgRnVuY3Rpb25zCiAqCiAqICAxOTk4IE1hcmN1cyBNZWlzc25lcgogKiAgMTk5OCBKdWVyZ2VuIFNjaG1pZWQgKGpzY2gpCiAqICBjdXJyZW50bHkgd29yayBpbiBwcm9ncmVzcyBvbiBTSCogYW5kIFNIRUxMMzJfRGxsR2V0Q2xhc3NPYmplY3QgZnVuY3Rpb25zCiAqICA8Y29udGFjdCBqdWVyZ2VuLnNjaG1pZWRAbWV0cm9uZXQuZGUgOTgwNjI0PgogKi8KI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgIndpbmRvd3MuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJmaWxlLmgiCiNpbmNsdWRlICJzaGVsbC5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAibW9kdWxlLmgiCiNpbmNsdWRlICJuZWV4ZS5oIgojaW5jbHVkZSAicmVzb3VyY2UuaCIKI2luY2x1ZGUgImRsZ3MuaCIKI2luY2x1ZGUgIndpbi5oIgojaW5jbHVkZSAiZ3JhcGhpY3MuaCIKI2luY2x1ZGUgImN1cnNvcmljb24uaCIKI2luY2x1ZGUgImludGVyZmFjZXMuaCIKI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKI2luY2x1ZGUgInNobG9iai5oIgojaW5jbHVkZSAiZGVidWcuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgoKLyogRklYTUUgc2hvdWxkIGJlIG1vdmVkIHRvIGEgaGVhZGVyIGZpbGUuIElzRXF1YWxHVUlEIAppcyBkZWNsYXJlZCBidXQgbm90IGV4cG9ydGVkIGluIGNvbXBvYmouYyAhISEqLwojZGVmaW5lIElzRXF1YWxHVUlEKHJndWlkMSwgcmd1aWQyKSAoIW1lbWNtcChyZ3VpZDEsIHJndWlkMiwgc2l6ZW9mKEdVSUQpKSkKI2RlZmluZSBJc0VxdWFsSUlEKHJpaWQxLCByaWlkMikgSXNFcXVhbEdVSUQocmlpZDEsIHJpaWQyKQojZGVmaW5lIElzRXF1YWxDTFNJRChyY2xzaWQxLCByY2xzaWQyKSBJc0VxdWFsR1VJRChyY2xzaWQxLCByY2xzaWQyKQoKc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBTSEVMTF9QZW9wbGVbXSA9CnsKICAgICJCb2IgQW1zdGFkdCIsCiAgICAiRGFnIEFzaGVpbSIsCiAgICAiTWFydGluIEF5b3R0ZSIsCiAgICAiS2FybCBCYWNrc3Ry9m0iLAogICAgIlBldGVyIEJhanVzeiIsCiAgICAiTWFyY2VsIEJhdXIiLAogICAgIkdlb3JnIEJleWVybGUiLAogICAgIlJvc3MgQmlybyIsCiAgICAiTWFydGluIEJvZWhtZSIsCiAgICAiVXdlIEJvbm5lcyIsCiAgICAiRXJpayBCb3MiLAogICAgIkZvbnMgQm90bWFuIiwKICAgICJKb2huIEJyZXphayIsCiAgICAiQW5kcmV3IEJ1bGhhayIsCiAgICAiSm9obiBCdXJ0b24iLAogICAgIk5pZWxzIGRlIENhcnBlbnRpZXIiLAogICAgIkdvcmRvbiBDaGFmZmVlIiwKICAgICJKaW1lbiBDaGluZyIsCiAgICAiUGFzY2FsIEN1b3EiLAogICAgIkRhdmlkIEEuIEN1dGhiZXJ0IiwKICAgICJIdXcgRC4gTS4gRGF2aWVzIiwKICAgICJSb21hbiBEb2xlanNpIiwKICAgICJGcmFucyB2YW4gRG9yc3NlbGFlciIsCiAgICAiQ2hyaXMgRmFoZXJ0eSIsCiAgICAiQ2Fyc3RlbiBGYWxsZXNlbiIsCiAgICAiUGF1bCBGYWxzdGFkIiwKICAgICJEYXZpZCBGYXVyZSIsCiAgICAiQ2xhdXMgRmlzY2hlciIsCiAgICAiT2xhZiBGbGViYmUiLAogICAgIkNoYWQgRnJhbGVpZ2giLAogICAgIk1hdHRoZXcgRnJhbmNpcyIsCiAgICAiUGV0ZXIgR2FsYmF2eSIsCiAgICAiUmFtb24gR2FyY2lhIiwKICAgICJNYXR0aGV3IEdoaW8iLAogICAgIkpvZHkgR29sZGJlcmciLAogICAgIkhhbnMgZGUgR3JhYWZmIiwKICAgICJDaGFybGVzIE0uIEhhbm51bSIsCiAgICAiQWRyaWFuIEhhcnZleSIsCiAgICAiSm9obiBIYXJ2ZXkiLAogICAgIkJpbGwgSGF3ZXMiLAogICAgIkNhbWVyb24gSGVpZGUiLAogICAgIkpvY2hlbiBIb2VuaWNrZSIsCiAgICAiT25ubyBIb3ZlcnMiLAogICAgIkplZmZyZXkgSHN1IiwKICAgICJNaWd1ZWwgZGUgSWNhemEiLAogICAgIkp1a2thIElpdm9uZW4iLAogICAgIkxlZSBKYWVraWwiLAogICAgIkFsZXhhbmRyZSBKdWxsaWFyZCIsCiAgICAiQmFuZyBKdW4tWW91bmciLAogICAgIlBhdmVsIEthbmtvdnNreSIsCiAgICAiSm9jaGVuIEthcnJlciIsCiAgICAiQW5kcmVhcyBLaXJzY2hiYXVtIiwKICAgICJSZWluIEtsYXplcyIsCiAgICAiQWxicmVjaHQgS2xlaW5lIiwKICAgICJFcmljIEtvaGwiLAogICAgIkpvbiBLb25yYXRoIiwKICAgICJBbGV4IEtvcm9ia2EiLAogICAgIkdyZWcgS3JlaWRlciIsCiAgICAiQW5hbmQgS3VtcmlhIiwKICAgICJTY290dCBBLiBMYWlyZCIsCiAgICAiRGF2aWQgTGVlIExhbWJlcnQiLAogICAgIkFuZHJldyBMZXd5Y2t5IiwKICAgICJQZXIgTGluZHN0cvZtIiwKICAgICJNYXJ0aW4gdm9uIExvZXdpcyIsCiAgICAiTWljaGllbCB2YW4gTG9vbiIsCiAgICAiS2VubmV0aCBNYWNEb25hbGQiLAogICAgIlBldGVyIE1hY0RvbmFsZCIsCiAgICAiV2lsbGlhbSBNYWdybyIsCiAgICAiSnVlcmdlbiBNYXJxdWFyZHQiLAogICAgIlJpY2FyZG8gTWFzc2FybyIsCiAgICAiTWFyY3VzIE1laXNzbmVyIiwKICAgICJHcmFoYW0gTWVuaGVubml0dCIsCiAgICAiRGF2aWQgTWV0Y2FsZmUiLAogICAgIkJydWNlIE1pbG5lciIsCiAgICAiU3RlZmZlbiBNb2VsbGVyIiwKICAgICJBbmRyZWFzIE1vaHIiLAogICAgIkphbWVzIE1vb2R5IiwKICAgICJQaGlsaXBwZSBEZSBNdXl0ZXIiLAogICAgIkl0YWkgTmFoc2hvbiIsCiAgICAiS3Jpc3RpYW4gTmllbHNlbiIsCiAgICAiSGVucmlrIE9sc2VuIiwKICAgICJNaWNoYWVsIFBhdHJhIiwKICAgICJEaW1pdHJpZSBPLiBQYXVuIiwKICAgICJKaW0gUGV0ZXJzb24iLAogICAgIlJvYmVydCBQb3VsaW90IiwKICAgICJLZWl0aCBSZXlub2xkcyIsCiAgICAiU2xhdmVuIFJlemljIiwKICAgICJKb2huIFJpY2hhcmRzb24iLAogICAgIlJpY2sgUmljaGFyZHNvbiIsCiAgICAiRG91ZyBSaWRnd2F5IiwKICAgICJCZXJuaGFyZCBSb3NlbmtyYWVuemVyIiwKICAgICJKb2hhbm5lcyBSdXNjaGVpbnNraSIsCiAgICAiVGhvbWFzIFNhbmRmb3JkIiwKICAgICJDb25zdGFudGluZSBTYXB1bnR6YWtpcyIsCiAgICAiUGFibG8gU2FyYXR4YWdhIiwKICAgICJEYW5pZWwgU2NoZXBsZXIiLAogICAgIlBldGVyIFNjaGxhaWxlIiwKICAgICJVbHJpY2ggU2NobWlkIiwKICAgICJCZXJuZCBTY2htaWR0IiwKICAgICJKdWVyZ2VuIFNjaG1pZWQiLAogICAgIkluZ28gU2NobmVpZGVyIiwKICAgICJWaWN0b3IgU2NobmVpZGVyIiwKICAgICJZbmd2aSBTaWd1cmpvbnNzb24iLAogICAgIlN0ZXBoZW4gU2ltbW9ucyIsCiAgICAiUmljayBTbGFka2V5IiwKICAgICJXaWxsaWFtIFNtaXRoIiwKICAgICJEb21pbmlrIFN0cmFzc2VyIiwKICAgICJWYWRpbSBTdHJpemhldnNreSIsCiAgICAiQmVydGhvIFN0dWx0aWVucyIsCiAgICAiRXJpayBTdmVuZHNlbiIsCiAgICAiVHJpc3RhbiBUYXJyYW50IiwKICAgICJBbmRyZXcgVGF5bG9yIiwKICAgICJEdW5jYW4gQyBUaG9tc29uIiwKICAgICJHb3JhbiBUaHluaSIsCiAgICAiSmltbXkgVGlydGF3YW5nc2EiLAogICAgIkpvbiBUb21icyIsCiAgICAiTGludXMgVG9ydmFsZHMiLAogICAgIkdyZWdvcnkgVHJ1YmV0c2tveSIsCiAgICAiUGV0cmkgVHVvbW9sYSIsCiAgICAiTWljaGFlbCBWZWtzbGVyIiwKICAgICJTdmVuIFZlcmRvb2xhZWdlIiwKICAgICJSb25hbiBXYWlkZSIsCiAgICAiRXJpYyBXYXJua2UiLAogICAgIk1hbmZyZWQgV2VpY2hlbCIsCiAgICAiVWxyaWNoIFdlaWdhbmQiLAogICAgIk1vcnRlbiBXZWxpbmRlciIsCiAgICAiTGVuIFdoaXRlIiwKICAgICJMYXdzb24gV2hpdG5leSIsCiAgICAiSmFuIFdpbGxhbW93aXVzIiwKICAgICJDYXJsIFdpbGxpYW1zIiwKICAgICJLYXJsIEd1ZW50ZXIgV3VlbnNjaCIsCiAgICAiRXJpYyBZb3VuZ2RhbGUiLAogICAgIkphbWVzIFlvdW5nbWFuIiwKICAgICJOaWtpdGEgVi4gWW91c2hjaGVua28iLAogICAgIk1pa29sYWogWmFsZXdza2kiLAogICAgIkpvaG4gWmVybyIsCiAgICAiTHVpeiBPdGF2aW8gTC4gWm9yemVsbGEiLAogICAgTlVMTAp9OwoKCi8qIC5JQ08gZmlsZSBJQ09ORElSIGRlZmluaXRpb25zICovCgojcHJhZ21hIHBhY2soMSkKCnR5cGVkZWYgc3RydWN0CnsKICAgIEJZVEUgICAgICAgIGJXaWR0aDsgICAgICAgICAgLyogV2lkdGgsIGluIHBpeGVscywgb2YgdGhlIGltYWdlCSovCiAgICBCWVRFICAgICAgICBiSGVpZ2h0OyAgICAgICAgIC8qIEhlaWdodCwgaW4gcGl4ZWxzLCBvZiB0aGUgaW1hZ2UJKi8KICAgIEJZVEUgICAgICAgIGJDb2xvckNvdW50OyAgICAgLyogTnVtYmVyIG9mIGNvbG9ycyBpbiBpbWFnZSAoMCBpZiA+PThicHApICovCiAgICBCWVRFICAgICAgICBiUmVzZXJ2ZWQ7ICAgICAgIC8qIFJlc2VydmVkICggbXVzdCBiZSAwKQkJKi8KICAgIFdPUkQgICAgICAgIHdQbGFuZXM7ICAgICAgICAgLyogQ29sb3IgUGxhbmVzCQkJKi8KICAgIFdPUkQgICAgICAgIHdCaXRDb3VudDsgICAgICAgLyogQml0cyBwZXIgcGl4ZWwJCQkqLwogICAgRFdPUkQgICAgICAgZHdCeXRlc0luUmVzOyAgICAvKiBIb3cgbWFueSBieXRlcyBpbiB0aGlzIHJlc291cmNlPwkqLwogICAgRFdPUkQgICAgICAgZHdJbWFnZU9mZnNldDsgICAvKiBXaGVyZSBpbiB0aGUgZmlsZSBpcyB0aGlzIGltYWdlPwkqLwp9IGljb0lDT05ESVJFTlRSWSwgKkxQaWNvSUNPTkRJUkVOVFJZOwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgV09SRCAgICAgICAgICAgIGlkUmVzZXJ2ZWQ7ICAgLyogUmVzZXJ2ZWQgKG11c3QgYmUgMCkJCSovCiAgICBXT1JEICAgICAgICAgICAgaWRUeXBlOyAgICAgICAvKiBSZXNvdXJjZSBUeXBlICgxIGZvciBpY29ucykJKi8KICAgIFdPUkQgICAgICAgICAgICBpZENvdW50OyAgICAgIC8qIEhvdyBtYW55IGltYWdlcz8JCQkqLwogICAgaWNvSUNPTkRJUkVOVFJZIGlkRW50cmllc1sxXTsgLyogQW4gZW50cnkgZm9yIGVhY2ggaW1hZ2UgKGlkQ291bnQgb2YgJ2VtKSAqLwp9IGljb0lDT05ESVIsICpMUGljb0lDT05ESVI7CgojcHJhZ21hIHBhY2soNCkKCnN0YXRpYyBjb25zdCBjaGFyKglscHN0ck1zZ1duZENyZWF0ZWQgPSAiT1RIRVJXSU5ET1dDUkVBVEVEIjsKc3RhdGljIGNvbnN0IGNoYXIqCWxwc3RyTXNnV25kRGVzdHJveWVkID0gIk9USEVSV0lORE9XREVTVFJPWUVEIjsKc3RhdGljIGNvbnN0IGNoYXIqCWxwc3RyTXNnU2hlbGxBY3RpdmF0ZSA9ICJBQ1RJVkFURVNIRUxMV0lORE9XIjsKCnN0YXRpYyBIV05EMTYJU0hFTExfaFduZCA9IDA7CnN0YXRpYyBISE9PSwlTSEVMTF9oSG9vayA9IDA7CnN0YXRpYyBVSU5UMTYJdU1zZ1duZENyZWF0ZWQgPSAwOwpzdGF0aWMgVUlOVDE2CXVNc2dXbmREZXN0cm95ZWQgPSAwOwpzdGF0aWMgVUlOVDE2CXVNc2dTaGVsbEFjdGl2YXRlID0gMDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCURyYWdBY2NlcHRGaWxlcwkJW1NIRUxMLjldCiAqLwp2b2lkIFdJTkFQSSBEcmFnQWNjZXB0RmlsZXMoSFdORDE2IGhXbmQsIEJPT0wxNiBiKQp7CiAgICBXTkQqIHduZCA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOwoKICAgIGlmKCB3bmQgKQoJd25kLT5kd0V4U3R5bGUgPSBiPyB3bmQtPmR3RXhTdHlsZSB8IFdTX0VYX0FDQ0VQVEZJTEVTCgkJCSAgOiB3bmQtPmR3RXhTdHlsZSAmIH5XU19FWF9BQ0NFUFRGSUxFUzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCURyYWdRdWVyeUZpbGUJCVtTSEVMTC4xMV0KICovClVJTlQxNiBXSU5BUEkgRHJhZ1F1ZXJ5RmlsZShIRFJPUDE2IGhEcm9wLCBXT1JEIHdGaWxlLCBMUFNUUiBscHN6RmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgd0xlbmd0aCkKewogICAgLyogaERyb3AgaXMgYSBnbG9iYWwgbWVtb3J5IGJsb2NrIGFsbG9jYXRlZCB3aXRoIEdNRU1fU0hBUkUgCiAgICAgKiB3aXRoIERST1BGSUxFU1RSVUNUIGFzIGEgaGVhZGVyIGFuZCBmaWxlbmFtZXMgZm9sbG93aW5nCiAgICAgKiBpdCwgemVybyBsZW5ndGggZmlsZW5hbWUgaXMgaW4gdGhlIGVuZCAqLyAgICAgICAKICAgIAogICAgTFBEUk9QRklMRVNUUlVDVCBscERyb3BGaWxlU3RydWN0OwogICAgTFBTVFIgbHBDdXJyZW50OwogICAgV09SRCAgaTsKICAgIAogICAgVFJBQ0UocmVnLCIoJTA0eCwgJWksICVwLCAldSlcbiIsCgkJaERyb3Asd0ZpbGUsbHBzekZpbGUsd0xlbmd0aCk7CiAgICAKICAgIGxwRHJvcEZpbGVTdHJ1Y3QgPSAoTFBEUk9QRklMRVNUUlVDVCkgR2xvYmFsTG9jazE2KGhEcm9wKTsgCiAgICBpZighbHBEcm9wRmlsZVN0cnVjdCkgcmV0dXJuIDA7CgogICAgbHBDdXJyZW50ID0gKExQU1RSKSBscERyb3BGaWxlU3RydWN0ICsgbHBEcm9wRmlsZVN0cnVjdC0+d1NpemU7CiAgICAKICAgIGkgPSAwOwogICAgd2hpbGUgKGkrKyA8IHdGaWxlKQogICAgewoJd2hpbGUgKCpscEN1cnJlbnQrKyk7ICAvKiBza2lwIGZpbGVuYW1lICovCglpZiAoISpscEN1cnJlbnQpIAoJICAgIHJldHVybiAod0ZpbGUgPT0gMHhGRkZGKSA/IGkgOiAwOyAgCiAgICB9CiAgICAKICAgIGkgPSBzdHJsZW4obHBDdXJyZW50KTsgCiAgICBpZiAoIWxwc3pGaWxlKSByZXR1cm4gaSsxOyAgIC8qIG5lZWRlZCBidWZmZXIgc2l6ZSAqLwogICAgCiAgICBpID0gKHdMZW5ndGggPiBpKSA/IGkgOiB3TGVuZ3RoLTE7CiAgICBzdHJuY3B5KGxwc3pGaWxlLCBscEN1cnJlbnQsIGkpOwogICAgbHBzekZpbGVbaV0gPSAnXDAnOwoKICAgIEdsb2JhbFVubG9jazE2KGhEcm9wKTsKICAgIHJldHVybiBpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJRHJhZ0ZpbmlzaAkJW1NIRUxMLjEyXQogKi8Kdm9pZCBXSU5BUEkgRHJhZ0ZpbmlzaChIRFJPUDE2IGgpCnsKICAgIEdsb2JhbEZyZWUxNigoSEdMT0JBTDE2KWgpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJRHJhZ1F1ZXJ5UG9pbnQJCVtTSEVMTC4xM10KICovCkJPT0wxNiBXSU5BUEkgRHJhZ1F1ZXJ5UG9pbnQoSERST1AxNiBoRHJvcCwgUE9JTlQxNiAqcCkKewogICAgTFBEUk9QRklMRVNUUlVDVCBscERyb3BGaWxlU3RydWN0OyAgCiAgICBCT09MMTYgICAgICAgICAgIGJSZXQ7CgogICAgbHBEcm9wRmlsZVN0cnVjdCA9IChMUERST1BGSUxFU1RSVUNUKSBHbG9iYWxMb2NrMTYoaERyb3ApOwoKICAgIG1lbWNweShwLCZscERyb3BGaWxlU3RydWN0LT5wdE1vdXNlUG9zLHNpemVvZihQT0lOVDE2KSk7CiAgICBiUmV0ID0gbHBEcm9wRmlsZVN0cnVjdC0+ZkluTm9uQ2xpZW50QXJlYTsKCiAgICBHbG9iYWxVbmxvY2sxNihoRHJvcCk7CiAgICByZXR1cm4gYlJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU0hFTExfRmluZEV4ZWN1dGFibGUgW0ludGVybmFsXQogKgogKiBVdGlsaXR5IGZvciBjb2RlIHNoYXJpbmcgYmV0d2VlbiBGaW5kRXhlY3V0YWJsZSBhbmQgU2hlbGxFeGVjdXRlCiAqLwpzdGF0aWMgSElOU1RBTkNFMzIgU0hFTExfRmluZEV4ZWN1dGFibGUoIExQQ1NUUiBscEZpbGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscE9wZXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBscFJlc3VsdCkKewogICAgY2hhciAqZXh0ZW5zaW9uID0gTlVMTDsgLyogcG9pbnRlciB0byBmaWxlIGV4dGVuc2lvbiAqLwogICAgY2hhciB0bXBleHRbNV07ICAgICAgICAgLyogbG9jYWwgY29weSB0byBtdW5nIGFzIHdlIHBsZWFzZSAqLwogICAgY2hhciBmaWxldHlwZVsyNTZdOyAgICAgLyogcmVnaXN0cnkgbmFtZSBmb3IgdGhpcyBmaWxldHlwZSAqLwogICAgTE9ORyBmaWxldHlwZWxlbj0yNTY7ICAgLyogbGVuZ3RoIG9mIGFib3ZlICovCiAgICBjaGFyIGNvbW1hbmRbMjU2XTsgICAgICAvKiBjb21tYW5kIGZyb20gcmVnaXN0cnkgKi8KICAgIExPTkcgY29tbWFuZGxlbj0yNTY7ICAgIC8qIFRoaXMgaXMgdGhlIG1vc3QgRE9TIGNhbiBoYW5kbGUgOikgKi8KICAgIGNoYXIgYnVmZmVyWzI1Nl07ICAgICAgIC8qIFVzZWQgdG8gR2V0UHJvZmlsZVN0cmluZyAqLwogICAgSElOU1RBTkNFMzIgcmV0dmFsPTMxOyAgLyogZGVmYXVsdCAtICdObyBhc3NvY2lhdGlvbiB3YXMgZm91bmQnICovCiAgICBjaGFyICp0b2s7ICAgICAgICAgICAgICAvKiB0b2tlbiBwb2ludGVyICovCiAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAvKiByYW5kb20gY291bnRlciAqLwogICAgY2hhciB4bHBGaWxlWzI1Nl07ICAgICAgLyogcmVzdWx0IG9mIFNlYXJjaFBhdGggKi8KCiAgICBUUkFDRShleGVjLCAiJXNcbiIsIChscEZpbGUgIT0gTlVMTD9scEZpbGU6Ii0iKSApOwoKICAgIGxwUmVzdWx0WzBdPSdcMCc7IC8qIFN0YXJ0IG9mZiB3aXRoIGFuIGVtcHR5IHJldHVybiBzdHJpbmcgKi8KCiAgICAvKiB0cmFwIE5VTEwgcGFyYW1ldGVycyBvbiBlbnRyeSAqLwogICAgaWYgKCggbHBGaWxlID09IE5VTEwgKSB8fCAoIGxwUmVzdWx0ID09IE5VTEwgKSB8fCAoIGxwT3BlcmF0aW9uID09IE5VTEwgKSkKICAgIHsKCVdBUk4oZXhlYywgIihscEZpbGU9JXMsbHBSZXN1bHQ9JXMsbHBPcGVyYXRpb249JXMpOiBOVUxMIHBhcmFtZXRlclxuIiwKICAgICAgICAgICBscEZpbGUsIGxwT3BlcmF0aW9uLCBscFJlc3VsdCk7CiAgICAgICAgcmV0dXJuIDI7IC8qIEZpbGUgbm90IGZvdW5kLiBDbG9zZSBlbm91Z2gsIEkgZ3Vlc3MuICovCiAgICB9CgogICAgaWYgKFNlYXJjaFBhdGgzMkEoIE5VTEwsIGxwRmlsZSwiLmV4ZSIsc2l6ZW9mKHhscEZpbGUpLHhscEZpbGUsTlVMTCkpCiAgICB7CglUUkFDRShleGVjLCAiU2VhcmNoUGF0aDMyQSByZXR1cm5lZCBub24temVyb1xuIik7CiAgICAgICAgbHBGaWxlID0geGxwRmlsZTsKICAgIH0KCiAgICAvKiBGaXJzdCB0aGluZyB3ZSBuZWVkIGlzIHRoZSBmaWxlJ3MgZXh0ZW5zaW9uICovCiAgICBleHRlbnNpb24gPSBzdHJyY2hyKCB4bHBGaWxlLCAnLicgKTsgLyogQXNzdW1lIGxhc3QgIi4iIGlzIHRoZSBvbmU7ICovCgkJCQkJLyogRmlsZS0+UnVuIGluIHByb2dtYW4gdXNlcyAqLwoJCQkJCS8qIC5cRklMRS5FWEUgOiggKi8KICAgIFRSQUNFKGV4ZWMsICJ4bHBGaWxlPSVzLGV4dGVuc2lvbj0lc1xuIiwgeGxwRmlsZSwgZXh0ZW5zaW9uKTsKCiAgICBpZiAoKGV4dGVuc2lvbiA9PSBOVUxMKSB8fCAoZXh0ZW5zaW9uID09ICZ4bHBGaWxlW3N0cmxlbih4bHBGaWxlKV0pKQogICAgewogICAgICAgIFdBUk4oZXhlYywgIlJldHVybmluZyAzMSAtIE5vIGFzc29jaWF0aW9uXG4iKTsKICAgICAgICByZXR1cm4gMzE7IC8qIG5vIGFzc29jaWF0aW9uICovCiAgICB9CgogICAgLyogTWFrZSBsb2NhbCBjb3B5ICYgbG93ZXJjYXNlIGl0IGZvciByZWcgJiAncHJvZ3JhbXM9JyBsb29rdXAgKi8KICAgIGxzdHJjcHluMzJBKCB0bXBleHQsIGV4dGVuc2lvbiwgNSApOwogICAgQ2hhckxvd2VyMzJBKCB0bXBleHQgKTsKICAgIFRSQUNFKGV4ZWMsICIlcyBmaWxlXG4iLCB0bXBleHQpOwogICAgCiAgICAvKiBUaHJlZSBwbGFjZXMgdG8gY2hlY2s6ICovCiAgICAvKiAxLiB3aW4uaW5pLCBbd2luZG93c10sIHByb2dyYW1zIChOQiBubyBsZWFkaW5nICcuJykgKi8KICAgIC8qIDIuIFJlZ2lzdHJ5LCBIS0VZX0NMQVNTX1JPT1RcPGZpbGV0eXBlPlxzaGVsbFxvcGVuXGNvbW1hbmQgKi8KICAgIC8qIDMuIHdpbi5pbmksIFtleHRlbnNpb25zXSwgZXh0ZW5zaW9uIChOQiBubyBsZWFkaW5nICcuJyAqLwogICAgLyogQWxsIEkga25vdyBvZiB0aGUgb3JkZXIgaXMgdGhhdCByZWdpc3RyeSBpcyBjaGVja2VkIGJlZm9yZSAqLwogICAgLyogZXh0ZW5zaW9uczsgaG93ZXZlciwgaXQnZCBtYWtlIHNlbnNlIHRvIGNoZWNrIHRoZSBwcm9ncmFtcyAqLwogICAgLyogc2VjdGlvbiBmaXJzdCwgc28gdGhhdCdzIHdoYXQgaGFwcGVucyBoZXJlLiAqLwoKICAgIC8qIFNlZSBpZiBpdCdzIGEgcHJvZ3JhbSAtIGlmIEdldFByb2ZpbGVTdHJpbmcgZmFpbHMsIHdlIHNraXAgdGhpcwogICAgICogc2VjdGlvbi4gQWN0dWFsbHksIGlmIEdldFByb2ZpbGVTdHJpbmcgZmFpbHMsIHdlJ3ZlIHByb2JhYmx5CiAgICAgKiBnb3QgYSBsb3QgbW9yZSB0byB3b3JyeSBhYm91dCB0aGFuIHJ1bm5pbmcgYSBwcm9ncmFtLi4uICovCiAgICBpZiAoIEdldFByb2ZpbGVTdHJpbmczMkEoIndpbmRvd3MiLCAicHJvZ3JhbXMiLCAiZXhlIHBpZiBiYXQgY29tIiwKCQkJCQkJICBidWZmZXIsIHNpemVvZihidWZmZXIpKSA+IDAgKQoJICB7CgkJZm9yIChpPTA7aTxzdHJsZW4oYnVmZmVyKTsgaSsrKSBidWZmZXJbaV09dG9sb3dlcihidWZmZXJbaV0pOwoKCQl0b2sgPSBzdHJ0b2soYnVmZmVyLCAiIFx0Iik7IC8qID8gKi8KCQl3aGlsZSggdG9rIT0gTlVMTCkKCQkgIHsKCQkJaWYgKHN0cmNtcCh0b2ssICZ0bXBleHRbMV0pPT0wKSAvKiBoYXZlIHRvIHNraXAgdGhlIGxlYWRpbmcgIi4iICovCgkJCSAgewoJCQkJc3RyY3B5KGxwUmVzdWx0LCB4bHBGaWxlKTsKCQkJCS8qIE5lZWQgdG8gcGVyaGFwcyBjaGVjayB0aGF0IHRoZSBmaWxlIGhhcyBhIHBhdGgKCQkJCSAqIGF0dGFjaGVkICovCgkJCQlUUkFDRShleGVjLCAiZm91bmQgJXNcbiIsCgkJCQkJCQkgbHBSZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMzsKCgkJLyogR3JlYXRlciB0aGFuIDMyIHRvIGluZGljYXRlIHN1Y2Nlc3MgRklYTUUgQWNjb3JkaW5nIHRvIHRoZQoJCSAqIGRvY3MsIEkgc2hvdWxkIGJlIHJldHVybmluZyBhIGhhbmRsZSBmb3IgdGhlCgkJICogZXhlY3V0YWJsZS4gRG9lcyB0aGlzIG1lYW4gSSdtIHN1cHBvc2VkIHRvIG9wZW4gdGhlCgkJICogZXhlY3V0YWJsZSBmaWxlIG9yIHNvbWV0aGluZz8gTW9yZSBSVEZNLCBJIGd1ZXNzLi4uICovCgkJCSAgfQoJCQl0b2s9c3RydG9rKE5VTEwsICIgXHQiKTsKCQkgIH0KCSAgfQoKICAgIC8qIENoZWNrIHJlZ2lzdHJ5ICovCiAgICBpZiAoUmVnUXVlcnlWYWx1ZTE2KCBIS0VZX0NMQVNTRVNfUk9PVCwgdG1wZXh0LCBmaWxldHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxldHlwZWxlbiApID09IEVSUk9SX1NVQ0NFU1MgKQogICAgewoJZmlsZXR5cGVbZmlsZXR5cGVsZW5dPSdcMCc7CglUUkFDRShleGVjLCAiRmlsZSB0eXBlOiAlc1xuIiwKCQkgICAgIGZpbGV0eXBlKTsKCgkvKiBMb29raW5nIGZvciAuLi5idWZmZXJcc2hlbGxcbHBPcGVyYXRpb25cY29tbWFuZCAqLwoJc3RyY2F0KCBmaWxldHlwZSwgIlxcc2hlbGxcXCIgKTsKCXN0cmNhdCggZmlsZXR5cGUsIGxwT3BlcmF0aW9uICk7CglzdHJjYXQoIGZpbGV0eXBlLCAiXFxjb21tYW5kIiApOwoJCglpZiAoUmVnUXVlcnlWYWx1ZTE2KCBIS0VZX0NMQVNTRVNfUk9PVCwgZmlsZXR5cGUsIGNvbW1hbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmRsZW4gKSA9PSBFUlJPUl9TVUNDRVNTICkKCXsKCSAgICAvKiBJcyB0aGVyZSBhIHJlcGxhY2UoKSBmdW5jdGlvbiBhbnl3aGVyZT8gKi8KCSAgICBjb21tYW5kW2NvbW1hbmRsZW5dPSdcMCc7CgkgICAgc3RyY3B5KCBscFJlc3VsdCwgY29tbWFuZCApOwoJICAgIHRvaz1zdHJzdHIoIGxwUmVzdWx0LCAiJTEiICk7CgkgICAgaWYgKHRvayAhPSBOVUxMKQoJICAgIHsKCQl0b2tbMF09J1wwJzsgLyogdHJ1bmNhdGUgc3RyaW5nIGF0IHRoZSBwZXJjZW50ICovCgkJc3RyY2F0KCBscFJlc3VsdCwgeGxwRmlsZSApOyAvKiB3aGF0IGlmIG5vIGRpciBpbiB4bHBGaWxlPyAqLwoJCXRvaz1zdHJzdHIoIGNvbW1hbmQsICIlMSIgKTsKCQlpZiAoKHRvayE9TlVMTCkgJiYgKHN0cmxlbih0b2spPjIpKQoJCXsKCQkgICAgc3RyY2F0KCBscFJlc3VsdCwgJnRva1syXSApOwoJCX0KCSAgICB9CgkgICAgcmV0dmFsPTMzOyAvKiBGSVhNRSBzZWUgYWJvdmUgKi8KCX0KICAgIH0KICAgIGVsc2UgLyogQ2hlY2sgd2luLmluaSAqLwogICAgewoJLyogVG9zcyB0aGUgbGVhZGluZyBkb3QgKi8KCWV4dGVuc2lvbisrOwoJaWYgKCBHZXRQcm9maWxlU3RyaW5nMzJBKCAiZXh0ZW5zaW9ucyIsIGV4dGVuc2lvbiwgIiIsIGNvbW1hbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY29tbWFuZCkpID4gMCkKCSAgewoJCWlmIChzdHJsZW4oY29tbWFuZCkhPTApCgkJICB7CgkJCXN0cmNweSggbHBSZXN1bHQsIGNvbW1hbmQgKTsKCQkJdG9rPXN0cnN0ciggbHBSZXN1bHQsICJeIiApOyAvKiBzaG91bGQgYmUgXi5leHRlbnNpb24/ICovCgkJCWlmICh0b2sgIT0gTlVMTCkKCQkJICB7CgkJCQl0b2tbMF09J1wwJzsKCQkJCXN0cmNhdCggbHBSZXN1bHQsIHhscEZpbGUgKTsgLyogd2hhdCBpZiBubyBkaXIgaW4geGxwRmlsZT8gKi8KCQkJCXRvaz1zdHJzdHIoIGNvbW1hbmQsICJeIiApOyAvKiBzZWUgYWJvdmUgKi8KCQkJCWlmICgodG9rICE9IE5VTEwpICYmIChzdHJsZW4odG9rKT41KSkKCQkJCSAgewoJCQkJCXN0cmNhdCggbHBSZXN1bHQsICZ0b2tbNV0pOwoJCQkJICB9CgkJCSAgfQoJCQlyZXR2YWw9MzM7IC8qIEZJWE1FIC0gc2VlIGFib3ZlICovCgkJICB9CgkgIH0KCX0KCiAgICBUUkFDRShleGVjLCAicmV0dXJuaW5nICVzXG4iLCBscFJlc3VsdCk7CiAgICByZXR1cm4gcmV0dmFsOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQlTaGVsbEV4ZWN1dGUxNgkJW1NIRUxMLjIwXQogKi8KSElOU1RBTkNFMTYgV0lOQVBJIFNoZWxsRXhlY3V0ZTE2KCBIV05EMTYgaFduZCwgTFBDU1RSIGxwT3BlcmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscEZpbGUsIExQQ1NUUiBscFBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwRGlyZWN0b3J5LCBJTlQxNiBpU2hvd0NtZCApCnsKICAgIEhJTlNUQU5DRTE2IHJldHZhbD0zMTsKICAgIGNoYXIgb2xkX2RpclsxMDI0XTsKICAgIGNoYXIgY21kWzI1Nl07CgogICAgVFJBQ0UoZXhlYywgIiglMDR4LCclcycsJyVzJywnJXMnLCclcycsJXgpXG4iLAoJCWhXbmQsIGxwT3BlcmF0aW9uID8gbHBPcGVyYXRpb246IjxudWxsPiIsIGxwRmlsZSA/IGxwRmlsZToiPG51bGw+IiwKCQlscFBhcmFtZXRlcnMgPyBscFBhcmFtZXRlcnMgOiAiPG51bGw+IiwgCgkJbHBEaXJlY3RvcnkgPyBscERpcmVjdG9yeSA6ICI8bnVsbD4iLCBpU2hvd0NtZCk7CgogICAgaWYgKGxwRmlsZT09TlVMTCkgcmV0dXJuIDA7IC8qIHNob3VsZCBub3QgaGFwcGVuICovCiAgICBpZiAobHBPcGVyYXRpb249PU5VTEwpIC8qIGRlZmF1bHQgaXMgb3BlbiAqLwogICAgICBscE9wZXJhdGlvbj0ib3BlbiI7CgogICAgaWYgKGxwRGlyZWN0b3J5KQogICAgewogICAgICAgIEdldEN1cnJlbnREaXJlY3RvcnkzMkEoIHNpemVvZihvbGRfZGlyKSwgb2xkX2RpciApOwogICAgICAgIFNldEN1cnJlbnREaXJlY3RvcnkzMkEoIGxwRGlyZWN0b3J5ICk7CiAgICB9CgogICAgcmV0dmFsID0gU0hFTExfRmluZEV4ZWN1dGFibGUoIGxwRmlsZSwgbHBPcGVyYXRpb24sIGNtZCApOwoKICAgIGlmIChyZXR2YWwgPiAzMikgIC8qIEZvdW5kICovCiAgICB7CiAgICAgICAgaWYgKGxwUGFyYW1ldGVycykKICAgICAgICB7CiAgICAgICAgICAgIHN0cmNhdChjbWQsIiAiKTsKICAgICAgICAgICAgc3RyY2F0KGNtZCxscFBhcmFtZXRlcnMpOwogICAgICAgIH0KCiAgICAgICAgVFJBQ0UoZXhlYywic3RhcnRpbmcgJXNcbiIsY21kKTsKICAgICAgICByZXR2YWwgPSBXaW5FeGVjMzIoIGNtZCwgaVNob3dDbWQgKTsKICAgIH0KICAgIGlmIChscERpcmVjdG9yeSkgU2V0Q3VycmVudERpcmVjdG9yeTMyQSggb2xkX2RpciApOwogICAgcmV0dXJuIHJldHZhbDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFNoZWxsRXhlY3V0ZTMyQSAgIChTSEVMTDMyLjI0NSkKICovCkhJTlNUQU5DRTMyIFdJTkFQSSBTaGVsbEV4ZWN1dGUzMkEoIEhXTkQzMiBoV25kLCBMUENTVFIgbHBPcGVyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscEZpbGUsIExQQ1NUUiBscFBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscERpcmVjdG9yeSwgSU5UMzIgaVNob3dDbWQgKQp7CiAgICByZXR1cm4gU2hlbGxFeGVjdXRlMTYoIGhXbmQsIGxwT3BlcmF0aW9uLCBscEZpbGUsIGxwUGFyYW1ldGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEaXJlY3RvcnksIGlTaG93Q21kICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBGaW5kRXhlY3V0YWJsZTE2ICAgKFNIRUxMLjIxKQogKi8KSElOU1RBTkNFMTYgV0lOQVBJIEZpbmRFeGVjdXRhYmxlMTYoIExQQ1NUUiBscEZpbGUsIExQQ1NUUiBscERpcmVjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGxwUmVzdWx0ICkKewogICAgcmV0dXJuIChISU5TVEFOQ0UxNilGaW5kRXhlY3V0YWJsZTMyQSggbHBGaWxlLCBscERpcmVjdG9yeSwgbHBSZXN1bHQgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgRmluZEV4ZWN1dGFibGUzMkEgICAoU0hFTEwzMi4xODQpCiAqLwpISU5TVEFOQ0UzMiBXSU5BUEkgRmluZEV4ZWN1dGFibGUzMkEoIExQQ1NUUiBscEZpbGUsIExQQ1NUUiBscERpcmVjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBscFJlc3VsdCApCnsKICAgIEhJTlNUQU5DRTMyIHJldHZhbD0zMTsgICAgLyogZGVmYXVsdCAtICdObyBhc3NvY2lhdGlvbiB3YXMgZm91bmQnICovCiAgICBjaGFyIG9sZF9kaXJbMTAyNF07CgogICAgVFJBQ0UoZXhlYywgIkZpbGUgJXMsIERpciAlc1xuIiwgCgkJIChscEZpbGUgIT0gTlVMTD9scEZpbGU6Ii0iKSwgCgkJIChscERpcmVjdG9yeSAhPSBOVUxMP2xwRGlyZWN0b3J5OiItIikpOwoKICAgIGxwUmVzdWx0WzBdPSdcMCc7IC8qIFN0YXJ0IG9mZiB3aXRoIGFuIGVtcHR5IHJldHVybiBzdHJpbmcgKi8KCiAgICAvKiB0cmFwIE5VTEwgcGFyYW1ldGVycyBvbiBlbnRyeSAqLwogICAgaWYgKCggbHBGaWxlID09IE5VTEwgKSB8fCAoIGxwUmVzdWx0ID09IE5VTEwgKSkKICAgIHsKCS8qIEZJWE1FIC0gc2hvdWxkIHRocm93IGEgd2FybmluZywgcGVyaGFwcyEgKi8KCXJldHVybiAyOyAvKiBGaWxlIG5vdCBmb3VuZC4gQ2xvc2UgZW5vdWdoLCBJIGd1ZXNzLiAqLwogICAgfQoKICAgIGlmIChscERpcmVjdG9yeSkKICAgIHsKICAgICAgICBHZXRDdXJyZW50RGlyZWN0b3J5MzJBKCBzaXplb2Yob2xkX2RpciksIG9sZF9kaXIgKTsKICAgICAgICBTZXRDdXJyZW50RGlyZWN0b3J5MzJBKCBscERpcmVjdG9yeSApOwogICAgfQoKICAgIHJldHZhbCA9IFNIRUxMX0ZpbmRFeGVjdXRhYmxlKCBscEZpbGUsICJvcGVuIiwgbHBSZXN1bHQgKTsKCiAgICBUUkFDRShleGVjLCAicmV0dXJuaW5nICVzXG4iLCBscFJlc3VsdCk7CiAgICBpZiAobHBEaXJlY3RvcnkpIFNldEN1cnJlbnREaXJlY3RvcnkzMkEoIG9sZF9kaXIgKTsKICAgIHJldHVybiByZXR2YWw7Cn0KCnR5cGVkZWYgc3RydWN0CnsKICAgIExQQ1NUUiAgc3pBcHA7CiAgICBMUENTVFIgIHN6T3RoZXJTdHVmZjsKICAgIEhJQ09OMzIgaEljb247Cn0gQUJPVVRfSU5GTzsKCiNkZWZpbmUJCUlEQ19TVEFUSUNfVEVYVAkJMTAwCiNkZWZpbmUJCUlEQ19MSVNUQk9YCQk5OQojZGVmaW5lCQlJRENfV0lORV9URVhUCQk5OAoKI2RlZmluZQkJRFJPUF9GSUVMRF9UT1AJCSgtMTUpCiNkZWZpbmUJCURST1BfRklFTERfSEVJR0hUCTE1CgpleHRlcm4gSElDT04zMiBoSWNvblRpdGxlRm9udDsKCnN0YXRpYyBCT09MMzIgX19nZXRfZHJvcGxpbmUoIEhXTkQzMiBoV25kLCBMUFJFQ1QzMiBscHJlY3QgKQp7CiAgICBIV05EMzIgaFduZEN0bCA9IEdldERsZ0l0ZW0zMihoV25kLCBJRENfV0lORV9URVhUKTsKICAgIGlmKCBoV25kQ3RsICkKICAgIHsKCUdldFdpbmRvd1JlY3QzMiggaFduZEN0bCwgbHByZWN0ICk7CglNYXBXaW5kb3dQb2ludHMzMiggMCwgaFduZCwgKExQUE9JTlQzMilscHJlY3QsIDIgKTsKCWxwcmVjdC0+Ym90dG9tID0gKGxwcmVjdC0+dG9wICs9IERST1BfRklFTERfVE9QKTsKCXJldHVybiBUUlVFOwogICAgfQogICAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBBYm91dERsZ1Byb2MzMiAgKG5vdCBhbiBleHBvcnRlZCBBUEkgZnVuY3Rpb24pCiAqLwpMUkVTVUxUIFdJTkFQSSBBYm91dERsZ1Byb2MzMiggSFdORDMyIGhXbmQsIFVJTlQzMiBtc2csIFdQQVJBTTMyIHdQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKQp7CiAgICBIV05EMzIgaFduZEN0bDsKICAgIGNoYXIgVGVtcGxhdGVbNTEyXSwgQXBwVGl0bGVbNTEyXTsKCiAgICBzd2l0Y2gobXNnKQogICAgewogICAgY2FzZSBXTV9JTklURElBTE9HOgogICAgICAgIHsKICAgICAgICAgICAgQUJPVVRfSU5GTyAqaW5mbyA9IChBQk9VVF9JTkZPICopbFBhcmFtOwogICAgICAgICAgICBpZiAoaW5mbykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QgKnBzdHIgPSBTSEVMTF9QZW9wbGU7CiAgICAgICAgICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UzMkEoaFduZCwgc3RjMSwgU1RNX1NFVElDT04zMixpbmZvLT5oSWNvbiwgMCk7CiAgICAgICAgICAgICAgICBHZXRXaW5kb3dUZXh0MzJBKCBoV25kLCBUZW1wbGF0ZSwgc2l6ZW9mKFRlbXBsYXRlKSApOwogICAgICAgICAgICAgICAgc3ByaW50ZiggQXBwVGl0bGUsIFRlbXBsYXRlLCBpbmZvLT5zekFwcCApOwogICAgICAgICAgICAgICAgU2V0V2luZG93VGV4dDMyQSggaFduZCwgQXBwVGl0bGUgKTsKICAgICAgICAgICAgICAgIFNldFdpbmRvd1RleHQzMkEoIEdldERsZ0l0ZW0zMihoV25kLCBJRENfU1RBVElDX1RFWFQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c3pPdGhlclN0dWZmICk7CiAgICAgICAgICAgICAgICBoV25kQ3RsID0gR2V0RGxnSXRlbTMyKGhXbmQsIElEQ19MSVNUQk9YKTsKICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBXTV9TRVRSRURSQVcsIDAsIDAgKTsKICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBXTV9TRVRGT05ULCBoSWNvblRpdGxlRm9udCwgMCApOwogICAgICAgICAgICAgICAgd2hpbGUgKCpwc3RyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBMQl9BRERTVFJJTkczMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTMyKS0xLCAoTFBBUkFNKSpwc3RyICk7CiAgICAgICAgICAgICAgICAgICAgcHN0cisrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIFdNX1NFVFJFRFJBVywgMSwgMCApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAxOwoKICAgIGNhc2UgV01fUEFJTlQ6Cgl7CgkgICAgUkVDVDMyIHJlY3Q7CgkgICAgUEFJTlRTVFJVQ1QzMiBwczsKCSAgICBIREMzMiBoREMgPSBCZWdpblBhaW50MzIoIGhXbmQsICZwcyApOwoKCSAgICBpZiggX19nZXRfZHJvcGxpbmUoIGhXbmQsICZyZWN0ICkgKQoJCUdSQVBIX0RyYXdMaW5lcyggaERDLCAoTFBQT0lOVDMyKSZyZWN0LCAxLCBHZXRTdG9ja09iamVjdDMyKCBCTEFDS19QRU4gKSApOwoJICAgIEVuZFBhaW50MzIoIGhXbmQsICZwcyApOwoJfQoJYnJlYWs7CgogICAgY2FzZSBXTV9MQlRSQUNLUE9JTlQ6CgoJaFduZEN0bCA9IEdldERsZ0l0ZW0zMihoV25kLCBJRENfTElTVEJPWCk7CglpZiggKElOVDE2KUdldEtleVN0YXRlMTYoIFZLX0NPTlRST0wgKSA8IDAgKQoJewoJICAgIGlmKCBEcmFnRGV0ZWN0MzIoIGhXbmRDdGwsICooKExQUE9JTlQzMikmbFBhcmFtKSApICkKCSAgICB7CgkJSU5UMzIgaWR4ID0gU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIExCX0dFVENVUlNFTDMyLCAwLCAwICk7CgkJaWYoIGlkeCAhPSAtMSApCgkJewoJCSAgICBJTlQzMiBsZW5ndGggPSBTZW5kTWVzc2FnZTMyQSggaFduZEN0bCwgTEJfR0VUVEVYVExFTjMyLCAoV1BBUkFNMzIpaWR4LCAwICk7CgkJICAgIEhHTE9CQUwxNiBoTWVtT2JqID0gR2xvYmFsQWxsb2MxNiggR01FTV9NT1ZFQUJMRSwgbGVuZ3RoICsgMSApOwoJCSAgICBjaGFyKiBwc3RyID0gKGNoYXIqKUdsb2JhbExvY2sxNiggaE1lbU9iaiApOwoKCQkgICAgaWYoIHBzdHIgKQoJCSAgICB7CgkJCUhDVVJTT1IxNiBoQ3Vyc29yID0gTG9hZEN1cnNvcjE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UxNihPQ1JfRFJBR09CSkVDVCkgKTsKCQkJU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIExCX0dFVFRFWFQzMiwgKFdQQVJBTTMyKWlkeCwgKExQQVJBTSlwc3RyICk7CgkJCVNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBMQl9ERUxFVEVTVFJJTkczMiwgKFdQQVJBTTMyKWlkeCwgMCApOwoJCQlVcGRhdGVXaW5kb3czMiggaFduZEN0bCApOwoJCQlpZiggIURyYWdPYmplY3QxNigoSFdORDE2KWhXbmQsIChIV05EMTYpaFduZCwgRFJBR09CSl9EQVRBLCAwLCAoV09SRCloTWVtT2JqLCBoQ3Vyc29yKSApCgkJCSAgICBTZW5kTWVzc2FnZTMyQSggaFduZEN0bCwgTEJfQUREU1RSSU5HMzIsIChXUEFSQU0zMiktMSwgKExQQVJBTSlwc3RyICk7CgkJICAgIH0KCQkgICAgaWYoIGhNZW1PYmogKSBHbG9iYWxGcmVlMTYoIGhNZW1PYmogKTsKCQl9CgkgICAgfQoJfQoJYnJlYWs7CgogICAgY2FzZSBXTV9RVUVSWURST1BPQkpFQ1Q6CglpZiggd1BhcmFtID09IDAgKQoJewoJICAgIExQRFJBR0lORk8gbHBEcmFnSW5mbyA9IChMUERSQUdJTkZPKVBUUl9TRUdfVE9fTElOKChTRUdQVFIpbFBhcmFtKTsKCSAgICBpZiggbHBEcmFnSW5mbyAmJiBscERyYWdJbmZvLT53RmxhZ3MgPT0gRFJBR09CSl9EQVRBICkKCSAgICB7CgkJUkVDVDMyIHJlY3Q7CgkJaWYoIF9fZ2V0X2Ryb3BsaW5lKCBoV25kLCAmcmVjdCApICkKCQl7CgkJICAgIFBPSU5UMzIgcHQgPSB7IGxwRHJhZ0luZm8tPnB0LngsIGxwRHJhZ0luZm8tPnB0LnkgfTsKCQkgICAgcmVjdC5ib3R0b20gKz0gRFJPUF9GSUVMRF9IRUlHSFQ7CgkJICAgIGlmKCBQdEluUmVjdDMyKCAmcmVjdCwgcHQgKSApCgkJICAgIHsKCQkJU2V0V2luZG93TG9uZzMyQSggaFduZCwgRFdMX01TR1JFU1VMVCwgMSApOwoJCQlyZXR1cm4gVFJVRTsKCQkgICAgfQoJCX0KCSAgICB9Cgl9CglicmVhazsKCiAgICBjYXNlIFdNX0RST1BPQkpFQ1Q6CglpZiggd1BhcmFtID09IGhXbmQgKQoJewoJICAgIExQRFJBR0lORk8gbHBEcmFnSW5mbyA9IChMUERSQUdJTkZPKVBUUl9TRUdfVE9fTElOKChTRUdQVFIpbFBhcmFtKTsKCSAgICBpZiggbHBEcmFnSW5mbyAmJiBscERyYWdJbmZvLT53RmxhZ3MgPT0gRFJBR09CSl9EQVRBICYmIGxwRHJhZ0luZm8tPmhMaXN0ICkKCSAgICB7CgkJY2hhciogcHN0ciA9IChjaGFyKilHbG9iYWxMb2NrMTYoIChIR0xPQkFMMTYpKGxwRHJhZ0luZm8tPmhMaXN0KSApOwoJCWlmKCBwc3RyICkKCQl7CgkJICAgIHN0YXRpYyBjaGFyIF9fYXBwZW5kaXhfc3RyW10gPSAiIHdpdGgiOwoKCQkgICAgaFduZEN0bCA9IEdldERsZ0l0ZW0zMiggaFduZCwgSURDX1dJTkVfVEVYVCApOwoJCSAgICBTZW5kTWVzc2FnZTMyQSggaFduZEN0bCwgV01fR0VUVEVYVCwgNTEyLCAoTFBBUkFNKVRlbXBsYXRlICk7CgkJICAgIGlmKCAhbHN0cm5jbXAzMkEoIFRlbXBsYXRlLCAiV0lORSIsIDQgKSApCgkJCVNldFdpbmRvd1RleHQzMkEoIEdldERsZ0l0ZW0zMihoV25kLCBJRENfU1RBVElDX1RFWFQpLCBUZW1wbGF0ZSApOwoJCSAgICBlbHNlCgkJICAgIHsKCQkJY2hhciogcGNoID0gVGVtcGxhdGUgKyBzdHJsZW4oVGVtcGxhdGUpIC0gc3RybGVuKF9fYXBwZW5kaXhfc3RyKTsKCQkJKnBjaCA9ICdcMCc7CgkJCVNlbmRNZXNzYWdlMzJBKCBHZXREbGdJdGVtMzIoaFduZCwgSURDX0xJU1RCT1gpLCBMQl9BRERTVFJJTkczMiwgCgkJCQkJKFdQQVJBTTMyKS0xLCAoTFBBUkFNKVRlbXBsYXRlICk7CgkJICAgIH0KCgkJICAgIGxzdHJjcHkzMkEoIFRlbXBsYXRlLCBwc3RyICk7CgkJICAgIGxzdHJjYXQzMkEoIFRlbXBsYXRlLCBfX2FwcGVuZGl4X3N0ciApOwoJCSAgICBTZXRXaW5kb3dUZXh0MzJBKCBoV25kQ3RsLCBUZW1wbGF0ZSApOwoKCQkgICAgU2V0V2luZG93TG9uZzMyQSggaFduZCwgRFdMX01TR1JFU1VMVCwgMSApOwoJCSAgICByZXR1cm4gVFJVRTsKCQl9CgkgICAgfQoJfQoJYnJlYWs7CgogICAgY2FzZSBXTV9DT01NQU5EOgogICAgICAgIGlmICh3UGFyYW0gPT0gSURPSykKICAgICAgICB7CiAgICAgICAgICAgIEVuZERpYWxvZzMyKGhXbmQsIFRSVUUpOwogICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIEFib3V0RGxnUHJvYzE2ICAgKFNIRUxMLjMzKQogKi8KTFJFU1VMVCBXSU5BUEkgQWJvdXREbGdQcm9jMTYoIEhXTkQxNiBoV25kLCBVSU5UMTYgbXNnLCBXUEFSQU0xNiB3UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICkKewogICAgcmV0dXJuIEFib3V0RGxnUHJvYzMyKCBoV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBTaGVsbEFib3V0MTYgICAoU0hFTEwuMjIpCiAqLwpCT09MMTYgV0lOQVBJIFNoZWxsQWJvdXQxNiggSFdORDE2IGhXbmQsIExQQ1NUUiBzekFwcCwgTFBDU1RSIHN6T3RoZXJTdHVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhJQ09OMTYgaEljb24gKQp7CiAgICByZXR1cm4gU2hlbGxBYm91dDMyQSggaFduZCwgc3pBcHAsIHN6T3RoZXJTdHVmZiwgaEljb24gKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgU2hlbGxBYm91dDMyQSAgIChTSEVMTDMyLjI0MykKICovCkJPT0wzMiBXSU5BUEkgU2hlbGxBYm91dDMyQSggSFdORDMyIGhXbmQsIExQQ1NUUiBzekFwcCwgTFBDU1RSIHN6T3RoZXJTdHVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISUNPTjMyIGhJY29uICkKewogICAgQUJPVVRfSU5GTyBpbmZvOwogICAgaW5mby5zekFwcCAgICAgICAgPSBzekFwcDsKICAgIGluZm8uc3pPdGhlclN0dWZmID0gc3pPdGhlclN0dWZmOwogICAgaW5mby5oSWNvbiAgICAgICAgPSBoSWNvbjsKICAgIGlmICghaEljb24pIGluZm8uaEljb24gPSBMb2FkSWNvbjE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UxNihPSUNfV0lORUlDT04pICk7CiAgICByZXR1cm4gRGlhbG9nQm94SW5kaXJlY3RQYXJhbTMyQSggV0lOX0dldFdpbmRvd0luc3RhbmNlKCBoV25kICksCiAgICAgICAgICAgICAgICAgICAgICAgICBTWVNSRVNfR2V0UmVzUHRyKCBTWVNSRVNfRElBTE9HX1NIRUxMX0FCT1VUX01TR0JPWCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhXbmQsIEFib3V0RGxnUHJvYzMyLCAoTFBBUkFNKSZpbmZvICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBTaGVsbEFib3V0MzJXICAgKFNIRUxMMzIuMjQ0KQogKi8KQk9PTDMyIFdJTkFQSSBTaGVsbEFib3V0MzJXKCBIV05EMzIgaFduZCwgTFBDV1NUUiBzekFwcCwgTFBDV1NUUiBzek90aGVyU3R1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSElDT04zMiBoSWNvbiApCnsKICAgIEJPT0wzMiByZXQ7CiAgICBBQk9VVF9JTkZPIGluZm87CgogICAgaW5mby5zekFwcCAgICAgICAgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHN6QXBwICk7CiAgICBpbmZvLnN6T3RoZXJTdHVmZiA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3pPdGhlclN0dWZmICk7CiAgICBpbmZvLmhJY29uICAgICAgICA9IGhJY29uOwogICAgaWYgKCFoSWNvbikgaW5mby5oSWNvbiA9IExvYWRJY29uMTYoIDAsIE1BS0VJTlRSRVNPVVJDRTE2KE9JQ19XSU5FSUNPTikgKTsKICAgIHJldCA9IERpYWxvZ0JveEluZGlyZWN0UGFyYW0zMkEoIFdJTl9HZXRXaW5kb3dJbnN0YW5jZSggaFduZCApLAogICAgICAgICAgICAgICAgICAgICAgICAgU1lTUkVTX0dldFJlc1B0ciggU1lTUkVTX0RJQUxPR19TSEVMTF9BQk9VVF9NU0dCT1ggKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoV25kLCBBYm91dERsZ1Byb2MzMiwgKExQQVJBTSkmaW5mbyApOwogICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUilpbmZvLnN6QXBwICk7CiAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKWluZm8uc3pPdGhlclN0dWZmICk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQlTaGVsbF9Ob3RpZnlJY29uCVtTSEVMTDMyLjI0OV0KICoJRklYTUUKICoJVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBkZWFsIHdpdGggdGhlIHN5c3RyYXkuCiAqCUFueSBpZGVhcyBvbiBob3cgdGhpcyBpcyB0byBiZSBpbXBsaW1lbnRlZD8KICovCkJPT0wzMiBXSU5BUEkgU2hlbGxfTm90aWZ5SWNvbigJRFdPUkQgZHdNZXNzYWdlLAoJCQkJUE5PVElGWUlDT05EQVRBIHBuaWQgKQp7CiAgICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCVNoZWxsX05vdGlmeUljb24JW1NIRUxMMzIuMjQwXQogKglGSVhNRQogKglUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGRlYWwgd2l0aCB0aGUgc3lzdHJheS4KICoJQW55IGlkZWFzIG9uIGhvdyB0aGlzIGlzIHRvIGJlIGltcGxpbWVudGVkPwogKi8KQk9PTDMyIFdJTkFQSSBTaGVsbF9Ob3RpZnlJY29uQShEV09SRCBkd01lc3NhZ2UsCgkJCQlQTk9USUZZSUNPTkRBVEEgcG5pZCApCnsKICAgIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJU0hFTExfR2V0UmVzb3VyY2VUYWJsZQogKi8Kc3RhdGljIERXT1JEIFNIRUxMX0dldFJlc291cmNlVGFibGUoSEZJTEUzMiBoRmlsZSxMUEJZVEUgKnJldHB0cikKewogIElNQUdFX0RPU19IRUFERVIJbXpfaGVhZGVyOwogIGNoYXIJCQltYWdpY1s0XTsKICBpbnQJCQlzaXplOwogIAogICpyZXRwdHIgPSBOVUxMOwogIF9sbHNlZWszMiggaEZpbGUsIDAsIFNFRUtfU0VUICk7CiAgaWYgKAkoX2xyZWFkMzIoaEZpbGUsJm16X2hlYWRlcixzaXplb2YobXpfaGVhZGVyKSkgIT0gc2l6ZW9mKG16X2hlYWRlcikpIHx8CiAgCShtel9oZWFkZXIuZV9tYWdpYyAhPSBJTUFHRV9ET1NfU0lHTkFUVVJFKQogICkgeyAvKiAuSUNPIGZpbGUgPyAqLwogICAgICAgIGlmIChtel9oZWFkZXIuZV9jYmxwID09IDEpIHsgLyogSUNPTkhFQURFUi5pZFR5cGUsIG11c3QgYmUgMSAqLwoJICAgICpyZXRwdHIgPSAoTFBCWVRFKS0xOwogIAkgICAgcmV0dXJuIDE7Cgl9CgllbHNlCgkgICAgcmV0dXJuIDA7IC8qIGZhaWxlZCAqLwogIH0KICBfbGxzZWVrMzIoIGhGaWxlLCBtel9oZWFkZXIuZV9sZmFuZXcsIFNFRUtfU0VUICk7CiAgaWYgKF9scmVhZDMyKCBoRmlsZSwgbWFnaWMsIHNpemVvZihtYWdpYykgKSAhPSBzaXplb2YobWFnaWMpKQoJcmV0dXJuIDA7CiAgX2xsc2VlazMyKCBoRmlsZSwgbXpfaGVhZGVyLmVfbGZhbmV3LCBTRUVLX1NFVCk7CgogIGlmICgqKERXT1JEKiltYWdpYyAgPT0gSU1BR0VfTlRfU0lHTkFUVVJFKQoJcmV0dXJuIElNQUdFX05UX1NJR05BVFVSRTsKICBpZiAoKihXT1JEKiltYWdpYyA9PSBJTUFHRV9PUzJfU0lHTkFUVVJFKSB7CiAgCUlNQUdFX09TMl9IRUFERVIJbmVfaGVhZGVyOwogIAlMUEJZVEUJCQlwVHlwZUluZm8gPSAoTFBCWVRFKS0xOwoKICAJaWYgKF9scmVhZDMyKGhGaWxlLCZuZV9oZWFkZXIsc2l6ZW9mKG5lX2hlYWRlcikpIT1zaXplb2YobmVfaGVhZGVyKSkKCQlyZXR1cm4gMDsKCglpZiAobmVfaGVhZGVyLm5lX21hZ2ljICE9IElNQUdFX09TMl9TSUdOQVRVUkUpIHJldHVybiAwOwoJc2l6ZSA9IG5lX2hlYWRlci5ybmFtZV90YWJfb2Zmc2V0IC0gbmVfaGVhZGVyLnJlc291cmNlX3RhYl9vZmZzZXQ7CglpZiggc2l6ZSA+IHNpemVvZihORV9UWVBFSU5GTykgKQoJewoJICAgIHBUeXBlSW5mbyA9IChCWVRFKilIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemUpOwoJICAgIGlmKCBwVHlwZUluZm8gKSB7CgkJX2xsc2VlazMyKGhGaWxlLCBtel9oZWFkZXIuZV9sZmFuZXcrbmVfaGVhZGVyLnJlc291cmNlX3RhYl9vZmZzZXQsIFNFRUtfU0VUKTsKCQlpZiggX2xyZWFkMzIoIGhGaWxlLCAoY2hhciopcFR5cGVJbmZvLCBzaXplKSAhPSBzaXplICkgeyAKCQkgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHBUeXBlSW5mbyk7IAoJCSAgICBwVHlwZUluZm8gPSBOVUxMOwoJCX0KCSAgICB9Cgl9CiAgCSpyZXRwdHIgPSBwVHlwZUluZm87CiAgICAgICAgcmV0dXJuIElNQUdFX09TMl9TSUdOQVRVUkU7CiAgfSBlbHNlCiAgCXJldHVybiAwOyAvKiBmYWlsZWQgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQlTSEVMTF9Mb2FkUmVzb3VyY2UKICovCnN0YXRpYyBIR0xPQkFMMTYgU0hFTExfTG9hZFJlc291cmNlKEhJTlNUQU5DRTE2IGhJbnN0LCBIRklMRTMyIGhGaWxlLCBORV9OQU1FSU5GTyogcE5JbmZvLCBXT1JEIHNpemVTaGlmdCkKewogQllURSoJcHRyOwogSEdMT0JBTDE2IGhhbmRsZSA9IERpcmVjdFJlc0FsbG9jKCBoSW5zdCwgMHgxMCwgKERXT1JEKXBOSW5mby0+bGVuZ3RoIDw8IHNpemVTaGlmdCk7CgogaWYoIChwdHIgPSAoQllURSopR2xvYmFsTG9jazE2KCBoYW5kbGUgKSkgKQogICB7CiAgICBfbGxzZWVrMzIoIGhGaWxlLCAoRFdPUkQpcE5JbmZvLT5vZmZzZXQgPDwgc2l6ZVNoaWZ0LCBTRUVLX1NFVCk7CiAgICAgX2xyZWFkMzIoIGhGaWxlLCAoY2hhciopcHRyLCBwTkluZm8tPmxlbmd0aCA8PCBzaXplU2hpZnQpOwogICAgIHJldHVybiBoYW5kbGU7CiAgIH0KIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICBJQ09fTG9hZEljb24KICovCnN0YXRpYyBIR0xPQkFMMTYgSUNPX0xvYWRJY29uKEhJTlNUQU5DRTE2IGhJbnN0LCBIRklMRTMyIGhGaWxlLCBMUGljb0lDT05ESVJFTlRSWSBscGlJREUpCnsKIEJZVEUqICBwdHI7CiBIR0xPQkFMMTYgaGFuZGxlID0gRGlyZWN0UmVzQWxsb2MoIGhJbnN0LCAweDEwLCBscGlJREUtPmR3Qnl0ZXNJblJlcyk7CgogaWYoIChwdHIgPSAoQllURSopR2xvYmFsTG9jazE2KCBoYW5kbGUgKSkgKQogICB7CiAgICBfbGxzZWVrMzIoIGhGaWxlLCBscGlJREUtPmR3SW1hZ2VPZmZzZXQsIFNFRUtfU0VUKTsKICAgICBfbHJlYWQzMiggaEZpbGUsIChjaGFyKilwdHIsIGxwaUlERS0+ZHdCeXRlc0luUmVzKTsKICAgICByZXR1cm4gaGFuZGxlOwogICB9CiByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgICAgICAgICAgSUNPX0dldEljb25EaXJlY3RvcnkKICoKICogIFJlYWQgLmljbyBmaWxlIGFuZCBidWlsZCBwaG9ueSBJQ09ORElSIHN0cnVjdCBmb3IgR2V0SWNvbklECiAqLwpzdGF0aWMgSEdMT0JBTDE2IElDT19HZXRJY29uRGlyZWN0b3J5KEhJTlNUQU5DRTE2IGhJbnN0LCBIRklMRTMyIGhGaWxlLCBMUGljb0lDT05ESVIqIGxwbHBpSUQgKSAKewogIFdPUkQJCWlkWzNdOwkvKiBpZFJlc2VydmVkLCBpZFR5cGUsIGlkQ291bnQgKi8KICBMUGljb0lDT05ESVIJbHBpSUQ7CiAgaW50CQlpOwogCiAgX2xsc2VlazMyKCBoRmlsZSwgMCwgU0VFS19TRVQgKTsKICBpZiggX2xyZWFkMzIoaEZpbGUsKGNoYXIqKWlkLHNpemVvZihpZCkpICE9IHNpemVvZihpZCkgKSByZXR1cm4gMDsKCiAgLyogY2hlY2sgLklDTyBoZWFkZXIgCiAgICoKICAgKiAtIHNlZSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vd2luMzJkZXYvdWkvaWNvbnMuaHRtCiAgICovCgogIGlmKCBpZFswXSB8fCBpZFsxXSAhPSAxIHx8ICFpZFsyXSApIHJldHVybiAwOwoKICBpID0gaWRbMl0qc2l6ZW9mKGljb0lDT05ESVJFTlRSWSkgKyBzaXplb2YoaWQpOwoKICBscGlJRCA9IChMUGljb0lDT05ESVIpSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBpKTsKCiAgaWYoIF9scmVhZDMyKGhGaWxlLChjaGFyKilscGlJRC0+aWRFbnRyaWVzLGkpID09IGkgKQogIHsgIAogICAgIEhHTE9CQUwxNiBoYW5kbGUgPSBEaXJlY3RSZXNBbGxvYyggaEluc3QsIDB4MTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFsyXSpzaXplb2YoSUNPTkRJUkVOVFJZKSArIHNpemVvZihpZCkgKTsKICAgICBpZiggaGFuZGxlICkgCiAgICAgewogICAgICAgQ1VSU09SSUNPTkRJUiogICAgIGxwSUQgPSAoQ1VSU09SSUNPTkRJUiopR2xvYmFsTG9jazE2KCBoYW5kbGUgKTsKICAgICAgIGxwSUQtPmlkUmVzZXJ2ZWQgPSBscGlJRC0+aWRSZXNlcnZlZCA9IGlkWzBdOwogICAgICAgbHBJRC0+aWRUeXBlID0gbHBpSUQtPmlkVHlwZSA9IGlkWzFdOwogICAgICAgbHBJRC0+aWRDb3VudCA9IGxwaUlELT5pZENvdW50ID0gaWRbMl07CiAgICAgICBmb3IoIGk9MDsgaSA8IGxwaUlELT5pZENvdW50OyBpKysgKQogICAgICAgICB7CgkgICAgbWVtY3B5KCh2b2lkKikobHBJRC0+aWRFbnRyaWVzICsgaSksIAoJCSAgICh2b2lkKikobHBpSUQtPmlkRW50cmllcyArIGkpLCBzaXplb2YoSUNPTkRJUkVOVFJZKSAtIDIpOwoJICAgIGxwSUQtPmlkRW50cmllc1tpXS5pY29uLndSZXNJZCA9IGk7CiAgICAgICAgIH0KICAgICAgKmxwbHBpSUQgPSBscGlJRDsKICAgICAgIHJldHVybiBoYW5kbGU7CiAgICAgfQogIH0KICAvKiBmYWlsICovCgogIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscGlJRCk7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJSW50ZXJuYWxFeHRyYWN0SWNvbgkJW1NIRUxMLjM5XQogKgogKiBUaGlzIGFib3J0aW9uIGlzIGNhbGxlZCBkaXJlY3RseSBieSBQcm9nbWFuCiAqLwpIR0xPQkFMMTYgV0lOQVBJIEludGVybmFsRXh0cmFjdEljb24oSElOU1RBTkNFMTYgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwc3pFeGVGaWxlTmFtZSwgVUlOVDE2IG5JY29uSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIG4gKQp7CiAgSEdMT0JBTDE2IAloUmV0ID0gMDsKICBIR0xPQkFMMTYqCVJldFB0ciA9IE5VTEw7CiAgTFBCWVRFICAJcERhdGE7CiAgT0ZTVFJVQ1QgCW9mczsKICBEV09SRAkJc2lnOwogIEhGSUxFMzIgCWhGaWxlID0gT3BlbkZpbGUzMiggbHBzekV4ZUZpbGVOYW1lLCAmb2ZzLCBPRl9SRUFEICk7CiAgVUlOVDE2CWljb25EaXJDb3VudCA9IDAsaWNvbkNvdW50ID0gMDsKICAKICBUUkFDRShyZWcsIiglMDR4LGZpbGUgJXMsc3RhcnQgJWQsZXh0cmFjdCAlZFxuIiwgCgkJICAgICAgIGhJbnN0YW5jZSwgbHBzekV4ZUZpbGVOYW1lLCBuSWNvbkluZGV4LCBuKTsKCiAgaWYoIGhGaWxlID09IEhGSUxFX0VSUk9SMzIgfHwgIW4gKSByZXR1cm4gMDsKCiAgaFJldCA9IEdsb2JhbEFsbG9jMTYoIEdNRU1fRklYRUQgfCBHTUVNX1pFUk9JTklULCBzaXplb2YoSElDT04xNikqbik7CiAgUmV0UHRyID0gKEhJQ09OMTYqKUdsb2JhbExvY2sxNihoUmV0KTsKCiAgKlJldFB0ciA9IChuID09IDB4RkZGRik/IDA6IDE7CS8qIGVycm9yIHJldHVybiB2YWx1ZXMgKi8KCiAgc2lnID0gU0hFTExfR2V0UmVzb3VyY2VUYWJsZShoRmlsZSwmcERhdGEpOwoKICBpZigoc2lnID09IElNQUdFX09TMl9TSUdOQVRVUkUpCiAgfHwgKHNpZyA9PSAxKSkgLyogLklDTyBmaWxlICovCiAgewogICAgSElDT04xNgkgaEljb24gPSAwOwogICAgTkVfVFlQRUlORk8qIHBUSW5mbyA9IChORV9UWVBFSU5GTyopKHBEYXRhICsgMik7CiAgICBORV9OQU1FSU5GTyogcEljb25TdG9yYWdlID0gTlVMTDsKICAgIE5FX05BTUVJTkZPKiBwSWNvbkRpciA9IE5VTEw7CiAgICBMUGljb0lDT05ESVIgbHBpSUQgPSBOVUxMOwogCiAgICBpZiggcERhdGEgPT0gKEJZVEUqKS0xICkKICAgIHsKCS8qIGNoZWNrIGZvciAuSUNPIGZpbGUgKi8KCgloSWNvbiA9IElDT19HZXRJY29uRGlyZWN0b3J5KGhJbnN0YW5jZSwgaEZpbGUsICZscGlJRCk7CglpZiggaEljb24gKSB7IGljb25EaXJDb3VudCA9IDE7IGljb25Db3VudCA9IGxwaUlELT5pZENvdW50OyB9CiAgICB9CiAgICBlbHNlIHdoaWxlKCBwVEluZm8tPnR5cGVfaWQgJiYgIShwSWNvblN0b3JhZ2UgJiYgcEljb25EaXIpICkKICAgIHsKCS8qIGZpbmQgaWNvbiBkaXJlY3RvcnkgYW5kIGljb24gcmVwb3NpdG9yeSAqLwoKCWlmKCBwVEluZm8tPnR5cGVfaWQgPT0gTkVfUlNDVFlQRV9HUk9VUF9JQ09OICkgCgkgIHsKCSAgICAgaWNvbkRpckNvdW50ID0gcFRJbmZvLT5jb3VudDsKCSAgICAgcEljb25EaXIgPSAoKE5FX05BTUVJTkZPKikocFRJbmZvICsgMSkpOwoJICAgICBUUkFDRShyZWcsIlx0Zm91bmQgZGlyZWN0b3J5IC0gJWkgaWNvbiBmYW1pbGllc1xuIiwgaWNvbkRpckNvdW50KTsKCSAgfQoJaWYoIHBUSW5mby0+dHlwZV9pZCA9PSBORV9SU0NUWVBFX0lDT04gKSAKCSAgeyAKCSAgICAgaWNvbkNvdW50ID0gcFRJbmZvLT5jb3VudDsKCSAgICAgcEljb25TdG9yYWdlID0gKChORV9OQU1FSU5GTyopKHBUSW5mbyArIDEpKTsKCSAgICAgVFJBQ0UocmVnLCJcdHRvdGFsIGljb25zIC0gJWlcbiIsIGljb25Db3VudCk7CgkgIH0KICAJcFRJbmZvID0gKE5FX1RZUEVJTkZPICopKChjaGFyKikocFRJbmZvKzEpK3BUSW5mby0+Y291bnQqc2l6ZW9mKE5FX05BTUVJTkZPKSk7CiAgICB9CgogICAgLyogbG9hZCByZXNvdXJjZXMgYW5kIGNyZWF0ZSBpY29ucyAqLwoKICAgIGlmKCAocEljb25TdG9yYWdlICYmIHBJY29uRGlyKSB8fCBscGlJRCApCiAgICAgIGlmKCBuSWNvbkluZGV4ID09IChVSU5UMTYpLTEgKSBSZXRQdHJbMF0gPSBpY29uRGlyQ291bnQ7CiAgICAgIGVsc2UgaWYoIG5JY29uSW5kZXggPCBpY29uRGlyQ291bnQgKQogICAgICB7CgkgIFVJTlQxNiAgIGksIGljb247CgoJICBpZiggbiA+IGljb25EaXJDb3VudCAtIG5JY29uSW5kZXggKSBuID0gaWNvbkRpckNvdW50IC0gbkljb25JbmRleDsKCgkgIGZvciggaSA9IG5JY29uSW5kZXg7IGkgPCBuSWNvbkluZGV4ICsgbjsgaSsrICkgCgkgIHsKCSAgICAgIC8qIC5JQ08gZmlsZXMgaGF2ZSBvbmx5IG9uZSBpY29uIGRpcmVjdG9yeSAqLwoKCSAgICAgIGlmKCBscGlJRCA9PSBOVUxMICkKCSAgICAgICAgICAgaEljb24gPSBTSEVMTF9Mb2FkUmVzb3VyY2UoIGhJbnN0YW5jZSwgaEZpbGUsIHBJY29uRGlyICsgaSwgCgkJCQkJCQkgICAgICAqKFdPUkQqKXBEYXRhICk7CgkgICAgICBSZXRQdHJbaS1uSWNvbkluZGV4XSA9IEdldEljb25JRCggaEljb24sIDMgKTsKCSAgICAgIEdsb2JhbEZyZWUxNihoSWNvbik7IAogICAgICAgICAgfQoKCSAgZm9yKCBpY29uID0gbkljb25JbmRleDsgaWNvbiA8IG5JY29uSW5kZXggKyBuOyBpY29uKysgKQoJICB7CgkgICAgICBoSWNvbiA9IDA7CgkgICAgICBpZiggbHBpSUQgKQoJCSAgIGhJY29uID0gSUNPX0xvYWRJY29uKCBoSW5zdGFuY2UsIGhGaWxlLCAKCQkJCQkgbHBpSUQtPmlkRW50cmllcyArIFJldFB0cltpY29uLW5JY29uSW5kZXhdKTsKCSAgICAgIGVsc2UKCSAgICAgICAgIGZvciggaSA9IDA7IGkgPCBpY29uQ291bnQ7IGkrKyApCgkJICAgaWYoIHBJY29uU3RvcmFnZVtpXS5pZCA9PSAoUmV0UHRyW2ljb24tbkljb25JbmRleF0gfCAweDgwMDApICkKCQkgICAgIGhJY29uID0gU0hFTExfTG9hZFJlc291cmNlKCBoSW5zdGFuY2UsIGhGaWxlLCBwSWNvblN0b3JhZ2UgKyBpLAoJCQkJCQkJCSAgICAqKFdPUkQqKXBEYXRhICk7CgkgICAgICBpZiggaEljb24gKQoJICAgICAgewoJCSAgUmV0UHRyW2ljb24tbkljb25JbmRleF0gPSBMb2FkSWNvbkhhbmRsZXIoIGhJY29uLCBUUlVFICk7IAoJCSAgRmFyU2V0T3duZXIoIFJldFB0cltpY29uLW5JY29uSW5kZXhdLCBHZXRFeGVQdHIoaEluc3RhbmNlKSApOwoJICAgICAgfQoJICAgICAgZWxzZQoJCSAgUmV0UHRyW2ljb24tbkljb25JbmRleF0gPSAwOwoJICB9CiAgICAgIH0KICAgIGlmKCBscGlJRCApIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscGlJRCk7CiAgICBlbHNlIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBwRGF0YSk7CiAgfSAKICBpZiggc2lnID09IElNQUdFX05UX1NJR05BVFVSRSkKICB7CiAgCUxQQllURQkJCXBlaW1hZ2UsaWRhdGEsaWdkYXRhOwoJTFBJTUFHRV9ET1NfSEVBREVSCWRoZWFkZXI7CglMUElNQUdFX05UX0hFQURFUlMJcGVfaGVhZGVyOwoJTFBJTUFHRV9TRUNUSU9OX0hFQURFUglwZV9zZWN0aW9uczsKCUxQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZCXJvb3RyZXNkaXIsaWNvbnJlc2RpcixpY29uZ3JvdXByZXNkaXI7CglMUElNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlkJaWRhdGFlbnQsaWdkYXRhZW50OwoJSEFORExFMzIJCWZtYXBwaW5nOwoJaW50CQkJaSxqOwoJTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkJeHJlc2VudDsKCUNVUlNPUklDT05ESVIJCSoqY2lkczsKCQoJZm1hcHBpbmcgPSBDcmVhdGVGaWxlTWFwcGluZzMyQShoRmlsZSxOVUxMLFBBR0VfUkVBRE9OTFl8U0VDX0NPTU1JVCwwLDAsTlVMTCk7CglpZiAoZm1hcHBpbmcgPT0gMCkgeyAvKiBGSVhNRSwgSU5WQUxJRF9IQU5ETEVfVkFMVUU/ICovCgkJV0FSTihyZWcsImZhaWxlZCB0byBjcmVhdGUgZmlsZW1hcC5cbiIpOwoJCV9sY2xvc2UzMiggaEZpbGUpOwoJCXJldHVybiAwOwoJfQoJcGVpbWFnZSA9IE1hcFZpZXdPZkZpbGUoZm1hcHBpbmcsRklMRV9NQVBfUkVBRCwwLDAsMCk7CglpZiAoIXBlaW1hZ2UpIHsKCQlXQVJOKHJlZywiZmFpbGVkIHRvIG1tYXAgZmlsZW1hcC5cbiIpOwoJCUNsb3NlSGFuZGxlKGZtYXBwaW5nKTsKCQlfbGNsb3NlMzIoIGhGaWxlKTsKCQlyZXR1cm4gMDsKCX0KCWRoZWFkZXIgPSAoTFBJTUFHRV9ET1NfSEVBREVSKXBlaW1hZ2U7CgkvKiBpdCBpcyBhIHBlIGhlYWRlciwgU0hFTExfR2V0UmVzb3VyY2VUYWJsZSBjaGVja2VkIHRoYXQgKi8KCXBlX2hlYWRlciA9IChMUElNQUdFX05UX0hFQURFUlMpKHBlaW1hZ2UrZGhlYWRlci0+ZV9sZmFuZXcpOwoJLyogcHJvYmFibHkgbWFrZXMgcHJvYmxlbXMgd2l0aCBzaG9ydCBQRSBoZWFkZXJzLi4uIGJ1dCBJIGhhdmVuJ3Qgc2VlbiAKCSAqIG9uZSB5ZXQuLi4gCgkgKi8KCXBlX3NlY3Rpb25zID0gKExQSU1BR0VfU0VDVElPTl9IRUFERVIpKCgoY2hhciopcGVfaGVhZGVyKStzaXplb2YoKnBlX2hlYWRlcikpOwoJcm9vdHJlc2RpciA9IE5VTEw7Cglmb3IgKGk9MDtpPHBlX2hlYWRlci0+RmlsZUhlYWRlci5OdW1iZXJPZlNlY3Rpb25zO2krKykgewoJCWlmIChwZV9zZWN0aW9uc1tpXS5DaGFyYWN0ZXJpc3RpY3MgJiBJTUFHRV9TQ05fQ05UX1VOSU5JVElBTElaRURfREFUQSkKCQkJY29udGludWU7CgkJLyogRklYTUU6IGRvZXNuJ3Qgd29yayB3aGVuIHRoZSByZXNvdXJjZXMgYXJlIG5vdCBpbiBhIHNlcGVyYXRlIHNlY3Rpb24gKi8KCQlpZiAocGVfc2VjdGlvbnNbaV0uVmlydHVhbEFkZHJlc3MgPT0gcGVfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5W0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9SRVNPVVJDRV0uVmlydHVhbEFkZHJlc3MpIHsKCQkJcm9vdHJlc2RpciA9IChMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSkoKGNoYXIqKXBlaW1hZ2UrcGVfc2VjdGlvbnNbaV0uUG9pbnRlclRvUmF3RGF0YSk7CgkJCWJyZWFrOwoJCX0KCX0KCglpZiAoIXJvb3RyZXNkaXIpIHsKCQlXQVJOKHJlZywiaGF2ZW4ndCBmb3VuZCBzZWN0aW9uIGZvciByZXNvdXJjZSBkaXJlY3RvcnkuXG4iKTsKCQlVbm1hcFZpZXdPZkZpbGUocGVpbWFnZSk7CgkJQ2xvc2VIYW5kbGUoZm1hcHBpbmcpOwoJCV9sY2xvc2UzMiggaEZpbGUpOwoJCXJldHVybiAwOwoJfQoJaWNvbmdyb3VwcmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHJvb3RyZXNkaXIsUlRfR1JPVVBfSUNPTjMyVywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKXJvb3RyZXNkaXIsRkFMU0UpOwoJaWYgKCFpY29uZ3JvdXByZXNkaXIpIHsKCQlXQVJOKHJlZywiTm8gSWNvbmdyb3VwcmVzb3VyY2VkaXJlY3RvcnkhXG4iKTsKCQlVbm1hcFZpZXdPZkZpbGUocGVpbWFnZSk7CgkJQ2xvc2VIYW5kbGUoZm1hcHBpbmcpOwoJCV9sY2xvc2UzMiggaEZpbGUpOwoJCXJldHVybiAwOwoJfQoKCWljb25EaXJDb3VudCA9IGljb25ncm91cHJlc2Rpci0+TnVtYmVyT2ZOYW1lZEVudHJpZXMraWNvbmdyb3VwcmVzZGlyLT5OdW1iZXJPZklkRW50cmllczsKCWlmKCBuSWNvbkluZGV4ID09IChVSU5UMTYpLTEgKSB7CgkJUmV0UHRyWzBdID0gaWNvbkRpckNvdW50OwoJCVVubWFwVmlld09mRmlsZShwZWltYWdlKTsKCQlDbG9zZUhhbmRsZShmbWFwcGluZyk7CgkJX2xjbG9zZTMyKCBoRmlsZSk7CgkJcmV0dXJuIGhSZXQ7Cgl9CgoJaWYgKG5JY29uSW5kZXggPj0gaWNvbkRpckNvdW50KSB7CgkJV0FSTihyZWcsIm5JY29uSW5kZXggJWQgaXMgbGFyZ2VyIHRoYW4gaWNvbkRpckNvdW50ICVkXG4iLAoJCQkgICAgbkljb25JbmRleCxpY29uRGlyQ291bnQpOwoJCVVubWFwVmlld09mRmlsZShwZWltYWdlKTsKCQlDbG9zZUhhbmRsZShmbWFwcGluZyk7CgkJX2xjbG9zZTMyKCBoRmlsZSk7CgkJR2xvYmFsRnJlZTE2KGhSZXQpOwoJCXJldHVybiAwOwoJfQoJY2lkcyA9IChDVVJTT1JJQ09ORElSKiopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxuKnNpemVvZihDVVJTT1JJQ09ORElSKikpOwoJCQoJLyogY2FsbGVyIGp1c3Qgd2FudGVkIHRoZSBudW1iZXIgb2YgZW50cmllcyAqLwoKCXhyZXNlbnQgPSAoTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkpKGljb25ncm91cHJlc2RpcisxKTsKCS8qIGFzc3VyZSB3ZSBkb24ndCBnZXQgdG9vIG11Y2ggLi4uICovCglpZiggbiA+IGljb25EaXJDb3VudCAtIG5JY29uSW5kZXggKSBuID0gaWNvbkRpckNvdW50IC0gbkljb25JbmRleDsKCgkvKiBzdGFydGluZyBmcm9tIHNwZWNpZmllZCBpbmRleCAuLi4gKi8KCXhyZXNlbnQgPSB4cmVzZW50K25JY29uSW5kZXg7CgoJZm9yIChpPTA7aTxuO2krKyx4cmVzZW50KyspIHsKCQlDVVJTT1JJQ09ORElSCSpjaWQ7CgkJTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkJcmVzZGlyOwoKCQkvKiBnbyBkb3duIHRoaXMgcmVzb3VyY2UgZW50cnksIG5hbWUgKi8KCQlyZXNkaXIgPSAoTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkpKChEV09SRClyb290cmVzZGlyKyh4cmVzZW50LT51Mi5zLk9mZnNldFRvRGlyZWN0b3J5KSk7CgkJLyogZGVmYXVsdCBsYW5ndWFnZSAoMCkgKi8KCQlyZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcocmVzZGlyLChMUFdTVFIpMCwoRFdPUkQpcm9vdHJlc2RpcixUUlVFKTsKCQlpZ2RhdGFlbnQgPSAoTFBJTUFHRV9SRVNPVVJDRV9EQVRBX0VOVFJZKXJlc2RpcjsKCgkJLyogbG9va3VwIGFkZHJlc3MgaW4gbWFwcGVkIGltYWdlIGZvciB2aXJ0dWFsIGFkZHJlc3MgKi8KCQlpZ2RhdGEgPSBOVUxMOwoJCWZvciAoaj0wO2o8cGVfaGVhZGVyLT5GaWxlSGVhZGVyLk51bWJlck9mU2VjdGlvbnM7aisrKSB7CgkJCWlmIChpZ2RhdGFlbnQtPk9mZnNldFRvRGF0YSA8IHBlX3NlY3Rpb25zW2pdLlZpcnR1YWxBZGRyZXNzKQoJCQkJY29udGludWU7CgkJCWlmIChpZ2RhdGFlbnQtPk9mZnNldFRvRGF0YStpZ2RhdGFlbnQtPlNpemUgPiBwZV9zZWN0aW9uc1tqXS5WaXJ0dWFsQWRkcmVzcytwZV9zZWN0aW9uc1tqXS5TaXplT2ZSYXdEYXRhKQoJCQkJY29udGludWU7CgkJCWlnZGF0YSA9IHBlaW1hZ2UrKGlnZGF0YWVudC0+T2Zmc2V0VG9EYXRhLXBlX3NlY3Rpb25zW2pdLlZpcnR1YWxBZGRyZXNzK3BlX3NlY3Rpb25zW2pdLlBvaW50ZXJUb1Jhd0RhdGEpOwoJCX0KCQlpZiAoIWlnZGF0YSkgewoJCQlXQVJOKHJlZywibm8gbWF0Y2hpbmcgcmVhbCBhZGRyZXNzIGZvciBpY29uZ3JvdXAhXG4iKTsKCQkJVW5tYXBWaWV3T2ZGaWxlKHBlaW1hZ2UpOwoJCQlDbG9zZUhhbmRsZShmbWFwcGluZyk7CgkJCV9sY2xvc2UzMiggaEZpbGUpOwoJCQlyZXR1cm4gMDsKCQl9CgkJLyogZm91bmQgKi8KCQljaWQgPSAoQ1VSU09SSUNPTkRJUiopaWdkYXRhOwoJCWNpZHNbaV0gPSBjaWQ7CgkJUmV0UHRyW2ldID0gTG9va3VwSWNvbklkRnJvbURpcmVjdG9yeUV4MzIoaWdkYXRhLFRSVUUsU1lTTUVUUklDU19DWElDT04sU1lTTUVUUklDU19DWUlDT04sMCk7Cgl9CglpY29ucmVzZGlyPUdldFJlc0RpckVudHJ5Vyhyb290cmVzZGlyLFJUX0lDT04zMlcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKXJvb3RyZXNkaXIsRkFMU0UpOwoJaWYgKCFpY29ucmVzZGlyKSB7CgkgICAgV0FSTihyZWcsIk5vIEljb25yZXNvdXJjZWRpcmVjdG9yeSFcbiIpOwoJICAgIFVubWFwVmlld09mRmlsZShwZWltYWdlKTsKCSAgICBDbG9zZUhhbmRsZShmbWFwcGluZyk7CgkgICAgX2xjbG9zZTMyKCBoRmlsZSk7CgkgICAgcmV0dXJuIDA7Cgl9Cglmb3IgKGk9MDtpPG47aSsrKSB7CgkgICAgTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkJeHJlc2RpcjsKCgkgICAgeHJlc2RpciA9IEdldFJlc0RpckVudHJ5VyhpY29ucmVzZGlyLChMUFdTVFIpUmV0UHRyW2ldLChEV09SRClyb290cmVzZGlyLEZBTFNFKTsKCSAgICB4cmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHhyZXNkaXIsKExQV1NUUikwLChEV09SRClyb290cmVzZGlyLFRSVUUpOwoKCSAgICBpZGF0YWVudCA9IChMUElNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlkpeHJlc2RpcjsKCgkgICAgaWRhdGEgPSBOVUxMOwoJICAgIC8qIG1hcCB2aXJ0dWFsIHRvIGFkZHJlc3MgaW4gaW1hZ2UgKi8KCSAgICBmb3IgKGo9MDtqPHBlX2hlYWRlci0+RmlsZUhlYWRlci5OdW1iZXJPZlNlY3Rpb25zO2orKykgewoJCWlmIChpZGF0YWVudC0+T2Zmc2V0VG9EYXRhIDwgcGVfc2VjdGlvbnNbal0uVmlydHVhbEFkZHJlc3MpCgkJICAgIGNvbnRpbnVlOwoJCWlmIChpZGF0YWVudC0+T2Zmc2V0VG9EYXRhK2lkYXRhZW50LT5TaXplID4gcGVfc2VjdGlvbnNbal0uVmlydHVhbEFkZHJlc3MrcGVfc2VjdGlvbnNbal0uU2l6ZU9mUmF3RGF0YSkKCQkgICAgY29udGludWU7CgkJaWRhdGEgPSBwZWltYWdlKyhpZGF0YWVudC0+T2Zmc2V0VG9EYXRhLXBlX3NlY3Rpb25zW2pdLlZpcnR1YWxBZGRyZXNzK3BlX3NlY3Rpb25zW2pdLlBvaW50ZXJUb1Jhd0RhdGEpOwoJICAgIH0KCSAgICBpZiAoIWlkYXRhKSB7CgkJV0FSTihyZWcsIm5vIG1hdGNoaW5nIHJlYWwgYWRkcmVzcyBmb3VuZCBmb3IgaWNvbmRhdGEhXG4iKTsKCQlSZXRQdHJbaV09MDsKCQljb250aW51ZTsKCSAgICB9CgkgICAgUmV0UHRyW2ldID0gQ3JlYXRlSWNvbkZyb21SZXNvdXJjZUV4MzIoaWRhdGEsaWRhdGFlbnQtPlNpemUsVFJVRSwweDAwMDMwMDAwLFNZU01FVFJJQ1NfQ1hJQ09OLFNZU01FVFJJQ1NfQ1lJQ09OLDApOwoJfQoJVW5tYXBWaWV3T2ZGaWxlKHBlaW1hZ2UpOwoJQ2xvc2VIYW5kbGUoZm1hcHBpbmcpOwoJX2xjbG9zZTMyKCBoRmlsZSk7CglyZXR1cm4gaFJldDsKICB9CiAgX2xjbG9zZTMyKCBoRmlsZSApOwogIC8qIHJldHVybiBhcnJheSB3aXRoIGljb24gaGFuZGxlcyAqLwogIHJldHVybiBoUmV0OwoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgRXh0cmFjdEljb24xNiAgIChTSEVMTC4zNCkKICovCkhJQ09OMTYgV0lOQVBJIEV4dHJhY3RJY29uMTYoIEhJTlNUQU5DRTE2IGhJbnN0YW5jZSwgTFBDU1RSIGxwc3pFeGVGaWxlTmFtZSwKCVVJTlQxNiBuSWNvbkluZGV4ICkKewogICAgcmV0dXJuIEV4dHJhY3RJY29uMzJBKCBoSW5zdGFuY2UsIGxwc3pFeGVGaWxlTmFtZSwgbkljb25JbmRleCApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgRXh0cmFjdEljb24zMkEgICAoU0hFTEwzMi4xMzMpCiAqLwpISUNPTjMyIFdJTkFQSSBFeHRyYWN0SWNvbjMyQSggSElOU1RBTkNFMzIgaEluc3RhbmNlLCBMUENTVFIgbHBzekV4ZUZpbGVOYW1lLAoJVUlOVDMyIG5JY29uSW5kZXggKQp7CiAgICBIR0xPQkFMMTYgaGFuZGxlID0gSW50ZXJuYWxFeHRyYWN0SWNvbihoSW5zdGFuY2UsbHBzekV4ZUZpbGVOYW1lLG5JY29uSW5kZXgsIDEpOwoKICAgIGlmKCBoYW5kbGUgKQogICAgewoJSElDT04xNiogcHRyID0gKEhJQ09OMTYqKUdsb2JhbExvY2sxNihoYW5kbGUpOwoJSElDT04xNiAgaEljb24gPSAqcHRyOwoKCUdsb2JhbEZyZWUxNihoYW5kbGUpOwoJcmV0dXJuIGhJY29uOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIEV4dHJhY3RJY29uMzJXICAgKFNIRUxMMzIuMTgwKQogKi8KSElDT04zMiBXSU5BUEkgRXh0cmFjdEljb24zMlcoIEhJTlNUQU5DRTMyIGhJbnN0YW5jZSwgTFBDV1NUUiBscHN6RXhlRmlsZU5hbWUsCglVSU5UMzIgbkljb25JbmRleCApCnsKCUxQU1RSCWV4ZWZuID0gSEVBUF9zdHJkdXBXdG9BKEdldFByb2Nlc3NIZWFwKCksMCxscHN6RXhlRmlsZU5hbWUpOwoJSElDT04zMglyZXQgPSBFeHRyYWN0SWNvbjMyQShoSW5zdGFuY2UsZXhlZm4sbkljb25JbmRleCk7CgoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGV4ZWZuKTsKCXJldHVybiByZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQlFeHRyYWN0QXNzb2NpYXRlZEljb24JW1NIRUxMLjM2XQogKiAKICogUmV0dXJuIGljb24gZm9yIGdpdmVuIGZpbGUgKGVpdGhlciBmcm9tIGZpbGUgaXRzZWxmIG9yIGZyb20gYXNzb2NpYXRlZAogKiBleGVjdXRhYmxlKSBhbmQgcGF0Y2ggcGFyYW1ldGVycyBpZiBuZWVkZWQuCiAqLwpISUNPTjMyIFdJTkFQSSBFeHRyYWN0QXNzb2NpYXRlZEljb24zMkEoSElOU1RBTkNFMzIgaEluc3QsTFBTVFIgbHBJY29uUGF0aCwKCUxQV09SRCBscGlJY29uKQp7CglyZXR1cm4gRXh0cmFjdEFzc29jaWF0ZWRJY29uMTYoaEluc3QsbHBJY29uUGF0aCxscGlJY29uKTsKfQoKSElDT04xNiBXSU5BUEkgRXh0cmFjdEFzc29jaWF0ZWRJY29uMTYoSElOU1RBTkNFMTYgaEluc3QsTFBTVFIgbHBJY29uUGF0aCwKCUxQV09SRCBscGlJY29uKQp7CiAgICBISUNPTjE2IGhJY29uID0gRXh0cmFjdEljb24xNihoSW5zdCwgbHBJY29uUGF0aCwgKmxwaUljb24pOwoKICAgIGlmKCBoSWNvbiA8IDIgKQogICAgewoKCWlmKCBoSWNvbiA9PSAxICkgLyogbm8gaWNvbnMgZm91bmQgaW4gZ2l2ZW4gZmlsZSAqLwoJewoJICAgIGNoYXIgIHRlbXBQYXRoWzB4ODBdOwoJICAgIFVJTlQxNiAgdVJldCA9IEZpbmRFeGVjdXRhYmxlMTYobHBJY29uUGF0aCxOVUxMLHRlbXBQYXRoKTsKCgkgICAgaWYoIHVSZXQgPiAzMiAmJiB0ZW1wUGF0aFswXSApCgkgICAgewoJCXN0cmNweShscEljb25QYXRoLHRlbXBQYXRoKTsKCQloSWNvbiA9IEV4dHJhY3RJY29uMTYoaEluc3QsIGxwSWNvblBhdGgsICpscGlJY29uKTsKCgkJaWYoIGhJY29uID4gMiApIHJldHVybiBoSWNvbjsKCSAgICB9CgkgICAgZWxzZSBoSWNvbiA9IDA7Cgl9CgoJaWYoIGhJY29uID09IDEgKSAKCSAgICAqbHBpSWNvbiA9IDI7ICAgLyogTVNET1MgaWNvbiAtIHdlIGZvdW5kIC5leGUgYnV0IG5vIGljb25zIGluIGl0ICovCgllbHNlCgkgICAgKmxwaUljb24gPSA2OyAgIC8qIGdlbmVyaWMgaWNvbiAtIGZvdW5kIG5vdGhpbmcgKi8KCglHZXRNb2R1bGVGaWxlTmFtZTE2KGhJbnN0LCBscEljb25QYXRoLCAweDgwKTsKCWhJY29uID0gTG9hZEljb24xNiggaEluc3QsIE1BS0VJTlRSRVNPVVJDRTE2KCpscGlJY29uKSk7CiAgICB9CgogICAgcmV0dXJuIGhJY29uOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQlGaW5kRW52aXJvbm1lbnRTdHJpbmcJW1NIRUxMLjM4XQogKgogKiBSZXR1cm5zIGEgcG9pbnRlciBpbnRvIHRoZSBET1MgZW52aXJvbm1lbnQuLi4gVWdoLgogKi8KTFBTVFIgU0hFTExfRmluZFN0cmluZyhMUFNUUiBscEVudiwgTFBDU1RSIGVudHJ5KQp7CiAgICBVSU5UMTYgCWwgPSBzdHJsZW4oZW50cnkpOyAKICAgIGZvciggOyAqbHBFbnYgOyBscEVudis9c3RybGVuKGxwRW52KSsxICkKICAgIHsKCWlmKCBsc3RybmNtcGkzMkEobHBFbnYsIGVudHJ5LCBsKSApIGNvbnRpbnVlOwoKCWlmKCAhKihscEVuditsKSApCgkgICAgcmV0dXJuIChscEVudiArIGwpOyAJCS8qIGVtcHR5IGVudHJ5ICovCgllbHNlIGlmICggKihscEVuditsKT09ICc9JyApCgkgICAgcmV0dXJuIChscEVudiArIGwgKyAxKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgpTRUdQVFIgV0lOQVBJIEZpbmRFbnZpcm9ubWVudFN0cmluZyhMUFNUUiBzdHIpCnsKICAgIFNFR1BUUiAgc3BFbnYgPSBHZXRET1NFbnZpcm9ubWVudCgpOwogICAgTFBTVFIgIGxwRW52ID0gKExQU1RSKVBUUl9TRUdfVE9fTElOKHNwRW52KTsKCiAgICBMUFNUUiAgbHBTdHJpbmcgPSAoc3BFbnYpP1NIRUxMX0ZpbmRTdHJpbmcobHBFbnYsIHN0cik6TlVMTDsgCgogICAgaWYoIGxwU3RyaW5nICkJCS8qICBvZmZzZXQgc2hvdWxkIGJlIHNtYWxsIGVub3VnaCAqLwoJcmV0dXJuIHNwRW52ICsgKGxwU3RyaW5nIC0gbHBFbnYpOwoKICAgIHJldHVybiAoU0VHUFRSKU5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICAJCURvRW52aXJvbm1lbnRTdWJzdCAgICAgIFtTSEVMTC4zN10KICoKICogUmVwbGFjZSAlS0VZV09SRCUgaW4gdGhlIHN0ciB3aXRoIHRoZSB2YWx1ZSBvZiB2YXJpYWJsZSBLRVlXT1JECiAqIGZyb20gIkRPUyIgZW52aXJvbm1lbnQuCiAqLwpEV09SRCBXSU5BUEkgRG9FbnZpcm9ubWVudFN1YnN0KExQU1RSIHN0cixXT1JEIGxlbmd0aCkKewogIExQU1RSICAgbHBFbnYgPSAoTFBTVFIpUFRSX1NFR19UT19MSU4oR2V0RE9TRW52aXJvbm1lbnQoKSk7CiAgTFBTVFIgICBscEJ1ZmZlciA9IChMUFNUUilIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbmd0aCk7CiAgTFBTVFIgICBscHN0ciA9IHN0cjsKICBMUFNUUiAgIGxwYnN0ciA9IGxwQnVmZmVyOwoKICBDaGFyVG9PZW0zMkEoc3RyLHN0cik7CgogIFRSQUNFKHJlZywiYWNjZXB0ICVzXG4iLCBzdHIpOwoKICB3aGlsZSggKmxwc3RyICYmIGxwYnN0ciAtIGxwQnVmZmVyIDwgbGVuZ3RoICkKICAgewogICAgIExQU1RSIGxwZW5kID0gbHBzdHI7CgogICAgIGlmKCAqbHBzdHIgPT0gJyUnICkKICAgICAgIHsKCSAgZG8geyBscGVuZCsrOyB9IHdoaWxlKCAqbHBlbmQgJiYgKmxwZW5kICE9ICclJyApOwoJICBpZiggKmxwZW5kID09ICclJyAmJiBscGVuZCAtIGxwc3RyID4gMSApCS8qIGZvdW5kIGtleSAqLwoJICAgIHsKCSAgICAgICBMUFNUUiBscEtleTsKCSAgICAgICpscGVuZCA9ICdcMCc7ICAKCSAgICAgICBscEtleSA9IFNIRUxMX0ZpbmRTdHJpbmcobHBFbnYsIGxwc3RyKzEpOwoJICAgICAgIGlmKCBscEtleSApCQkJCS8qIGZvdW5kIGtleSB2YWx1ZSAqLwoJCSB7CgkJICAgaW50IGwgPSBzdHJsZW4obHBLZXkpOwoKCQkgICBpZiggbCA+IGxlbmd0aCAtIChscGJzdHIgLSBscEJ1ZmZlcikgLSAxICkKCQkgICAgIHsKCQkgICAgICAgV0FSTihyZWcsIkVudiBzdWJzdCBhYm9ydGVkIC0gc3RyaW5nIHRvbyBzaG9ydFxuIik7CgkJICAgICAgKmxwZW5kID0gJyUnOwoJCSAgICAgICBicmVhazsKCQkgICAgIH0KCQkgICBzdHJjcHkobHBic3RyLCBscEtleSk7CgkJICAgbHBic3RyICs9IGw7CgkJIH0KCSAgICAgICBlbHNlIGJyZWFrOwoJICAgICAgKmxwZW5kID0gJyUnOwoJICAgICAgIGxwc3RyID0gbHBlbmQgKyAxOwoJICAgIH0KCSAgZWxzZSBicmVhazsJCQkJCS8qIGJhY2sgb2ZmIGFuZCB3aGluZSAqLwoKCSAgY29udGludWU7CiAgICAgICB9IAoKICAgICAqbHBic3RyKysgPSAqbHBzdHIrKzsKICAgfQoKICpscGJzdHIgPSAnXDAnOwogIGlmKCBscHN0ciAtIHN0ciA9PSBzdHJsZW4oc3RyKSApCiAgICB7CiAgICAgIHN0cm5jcHkoc3RyLCBscEJ1ZmZlciwgbGVuZ3RoKTsKICAgICAgbGVuZ3RoID0gMTsKICAgIH0KICBlbHNlCiAgICAgIGxlbmd0aCA9IDA7CgogIFRSQUNFKHJlZywiICAgIHJldHVybiAlc1xuIiwgc3RyKTsKCiAgT2VtVG9DaGFyMzJBKHN0cixzdHIpOwogIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscEJ1ZmZlcik7CgogIC8qICBSZXR1cm4gc3RyIGxlbmd0aCBpbiB0aGUgTE9XT1JECiAgICogIGFuZCAxIGluIEhJV09SRCBpZiBzdWJzdCB3YXMgc3VjY2Vzc2Z1bC4KICAgKi8KIHJldHVybiAoRFdPUkQpTUFLRUxPTkcoc3RybGVuKHN0ciksIGxlbmd0aCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCVNoZWxsSG9va1Byb2MJCVtTSEVMTC4xMDNdCiAqIFN5c3RlbS13aWRlIFdIX1NIRUxMIGhvb2suCiAqLwpMUkVTVUxUIFdJTkFQSSBTaGVsbEhvb2tQcm9jKElOVDE2IGNvZGUsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKewogICAgVFJBQ0UocmVnLCIlaSwgJTA0eCwgJTA4eFxuIiwgY29kZSwgd1BhcmFtLCAKCQkJCQkJICAgICAgKHVuc2lnbmVkKWxQYXJhbSApOwogICAgaWYoIFNIRUxMX2hIb29rICYmIFNIRUxMX2hXbmQgKQogICAgewoJVUlOVDE2CXVNc2cgPSAwOwogICAgICAgIHN3aXRjaCggY29kZSApCiAgICAgICAgewoJICAgIGNhc2UgSFNIRUxMX1dJTkRPV0NSRUFURUQ6CQl1TXNnID0gdU1zZ1duZENyZWF0ZWQ7ICAgYnJlYWs7CgkgICAgY2FzZSBIU0hFTExfV0lORE9XREVTVFJPWUVEOgl1TXNnID0gdU1zZ1duZERlc3Ryb3llZDsgYnJlYWs7CgkgICAgY2FzZSBIU0hFTExfQUNUSVZBVEVTSEVMTFdJTkRPVzogCXVNc2cgPSB1TXNnU2hlbGxBY3RpdmF0ZTsKICAgICAgICB9CglQb3N0TWVzc2FnZTE2KCBTSEVMTF9oV25kLCB1TXNnLCB3UGFyYW0sIDAgKTsKICAgIH0KICAgIHJldHVybiBDYWxsTmV4dEhvb2tFeDE2KCBXSF9TSEVMTCwgY29kZSwgd1BhcmFtLCBsUGFyYW0gKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJUmVnaXN0ZXJTaGVsbEhvb2sJW1NIRUxMLjEwMl0KICovCkJPT0wzMiBXSU5BUEkgUmVnaXN0ZXJTaGVsbEhvb2soSFdORDE2IGhXbmQsIFVJTlQxNiB1QWN0aW9uKQp7CiAgICBUUkFDRShyZWcsIiUwNHggWyV1XVxuIiwgaFduZCwgdUFjdGlvbiApOwoKICAgIHN3aXRjaCggdUFjdGlvbiApCiAgICB7CgljYXNlIDI6CS8qIHJlZ2lzdGVyIGhXbmQgYXMgYSBzaGVsbCB3aW5kb3cgKi8KCgkgICAgIGlmKCAhU0hFTExfaEhvb2sgKQoJICAgICB7CgkJSE1PRFVMRTE2IGhTaGVsbCA9IEdldE1vZHVsZUhhbmRsZTE2KCAiU0hFTEwiICk7CgoJCVNIRUxMX2hIb29rID0gU2V0V2luZG93c0hvb2tFeDE2KCBXSF9TSEVMTCwgU2hlbGxIb29rUHJvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2hlbGwsIDAgKTsKCQlpZiggU0hFTExfaEhvb2sgKQoJCXsKCQkgICAgdU1zZ1duZENyZWF0ZWQgPSBSZWdpc3RlcldpbmRvd01lc3NhZ2UzMkEoIGxwc3RyTXNnV25kQ3JlYXRlZCApOwoJCSAgICB1TXNnV25kRGVzdHJveWVkID0gUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJBKCBscHN0ck1zZ1duZERlc3Ryb3llZCApOwoJCSAgICB1TXNnU2hlbGxBY3RpdmF0ZSA9IFJlZ2lzdGVyV2luZG93TWVzc2FnZTMyQSggbHBzdHJNc2dTaGVsbEFjdGl2YXRlICk7CgkJfSAKCQllbHNlIFdBUk4ocmVnLCAidW5hYmxlIHRvIGluc3RhbGwgU2hlbGxIb29rUHJvYygpIVxuIik7CgkgICAgIH0KCgkgICAgIGlmKCBTSEVMTF9oSG9vayApIHJldHVybiAoKFNIRUxMX2hXbmQgPSBoV25kKSAhPSAwKTsKCSAgICAgYnJlYWs7CgoJZGVmYXVsdDoKCgkgICAgIFdBUk4ocmVnLCAidW5rbm93biBjb2RlICVpXG4iLCB1QWN0aW9uICk7CgoJICAgICAvKiBqdXN0IGluIGNhc2UgKi8KCgkgICAgIFNIRUxMX2hXbmQgPSAwOwogICAgfQogICAgcmV0dXJuIEZBTFNFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJU0hHZXRGaWxlSW5mb0EJCVtTSEVMTDMyLjIxOF0KICovCkRXT1JEIFdJTkFQSSBTSEdldEZpbGVJbmZvMzJBKExQQ1NUUiBwYXRoLERXT1JEIGR3RmlsZUF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIRklMRUlORk8zMkEgKnBzZmksIFVJTlQzMiBzaXplb2Zwc2ZpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgZmxhZ3MgKQp7CglGSVhNRShzaGVsbCwiKCVzLDB4JTA4bHgsJXAsJWQsMHglMDh4KTogc3R1YlxuIiwKCSAgICAgIHBhdGgsZHdGaWxlQXR0cmlidXRlcyxwc2ZpLHNpemVvZnBzZmksZmxhZ3MpOwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCVNIQXBwQmFyTWVzc2FnZTMyCVtTSEVMTDMyLjIwN10KICovClVJTlQzMiBXSU5BUEkgU0hBcHBCYXJNZXNzYWdlMzIoRFdPUkQgbXNnLCBQQVBQQkFSREFUQSBkYXRhKQp7CiAgICBGSVhNRShzaGVsbCwiKDB4JTA4bHgsJXApOiBzdHViXG4iLCBtc2csIGRhdGEpOwojaWYgMAogICAgc3dpdGNoIChtc2cpIHsKICAgICAgICBjYXNlIEFCTV9BQ1RJVkFURToKICAgICAgICBjYXNlIEFCTV9HRVRBVVRPSElERUJBUjoKICAgICAgICBjYXNlIEFCTV9HRVRTVEFURToKICAgICAgICBjYXNlIEFCTV9HRVRUQVNLQkFSUE9TOgogICAgICAgIGNhc2UgQUJNX05FVzoKICAgICAgICBjYXNlIEFCTV9RVUVSWVBPUzoKICAgICAgICBjYXNlIEFCTV9SRU1PVkU6CiAgICAgICAgY2FzZSBBQk1fU0VUQVVUT0hJREVCQVI6CiAgICAgICAgY2FzZSBBQk1fU0VUUE9TOgogICAgICAgIGNhc2UgQUJNX1dJTkRPV1BPU0NIQU5HRUQ6CgkgICAgOwogICAgfQojZW5kaWYKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQlDb21tYW5kTGluZVRvQXJndlcJW1NIRUxMMzIuN10KICovCkxQV1NUUiogV0lOQVBJIENvbW1hbmRMaW5lVG9Bcmd2VyhMUFdTVFIgY21kbGluZSxMUERXT1JEIG51bWFyZ3MpCnsKCUxQV1NUUgkqYXJndixzLHQ7CglpbnQJaTsKCiAgICAgICAgLyogdG8gZ2V0IHdyaXRlYWJsZSBjb3B5ICovCgljbWRsaW5lID0gSEVBUF9zdHJkdXBXKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBjbWRsaW5lKTsKCXM9Y21kbGluZTtpPTA7Cgl3aGlsZSAoKnMpIHsKCQkvKiBzcGFjZSAqLwoJCWlmICgqcz09MHgwMDIwKSB7CgkJCWkrKzsKCQkJcysrOwoJCQl3aGlsZSAoKnMgJiYgKnM9PTB4MDAyMCkKCQkJCXMrKzsKCQkJY29udGludWU7CgkJfQoJCXMrKzsKCX0KCWFyZ3Y9KExQV1NUUiopSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoTFBXU1RSKSooaSsxKSApOwoJcz10PWNtZGxpbmU7CglpPTA7Cgl3aGlsZSAoKnMpIHsKCQlpZiAoKnM9PTB4MDAyMCkgewoJCQkqcz0wOwoJCQlhcmd2W2krK109SEVBUF9zdHJkdXBXKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB0ICk7CgkJCSpzPTB4MDAyMDsKCQkJd2hpbGUgKCpzICYmICpzPT0weDAwMjApCgkJCQlzKys7CgkJCWlmICgqcykKCQkJCXQ9cysxOwoJCQllbHNlCgkJCQl0PXM7CgkJCWNvbnRpbnVlOwoJCX0KCQlzKys7Cgl9CglpZiAoKnQpCgkJYXJndltpKytdPShMUFdTVFIpSEVBUF9zdHJkdXBXKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB0ICk7CglIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY21kbGluZSApOwoJYXJndltpXT1OVUxMOwoJKm51bWFyZ3M9aTsKCXJldHVybiBhcmd2Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQlDb250cm9sX1J1bkRMTAkJW1NIRUxMMzIuMTJdCiAqCiAqIFdpbGQgc3BlY3VsYXRpb24gaW4gdGhlIGZvbGxvd2luZyEKICoKICogaHR0cDovL3ByZW1pdW0ubWljcm9zb2Z0LmNvbS9tc2RuL2xpYnJhcnkvdGVjaGFydC9tc2RuMTkzLmh0bQogKi8KCnZvaWQgV0lOQVBJIENvbnRyb2xfUnVuRExMIChIV05EMzIgaHduZCwgTFBDVk9JRCBjb2RlLCBMUENTVFIgY21kLCBEV09SRCBhcmc0KQp7CiAgVFJBQ0UoZXhlYywgIiglMDh4LCAlcCwgXCIlc1wiLCAlMDhseClcbiIsCglod25kLCBjb2RlID8gY29kZSA6ICIobnVsbCkiLCBjbWQgPyBjbWQgOiAiKG51bGwpIiwgYXJnNCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZyZWVJY29uTGlzdAogKi8Kdm9pZCBXSU5BUEkgRnJlZUljb25MaXN0KCBEV09SRCBkdyApCnsKICAgIEZJWE1FKHJlZywgIiglbHgpOiBzdHViXG4iLGR3KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hFTEwzMl9EbGxHZXRDbGFzc09iamVjdCAgIFtTSEVMTDMyLjEyOF0KICoKICogW1N0YW5kYXJ0IE9MRS9DT00gSW50ZXJmYWNlIE1ldGhvZF0KICogVGhpcyBGdW5jdGlvbiByZXRyaXZlcyB0aGUgcG9pbnRlciB0byBhIHNwZWNpZmllZCBpbnRlcmZhY2UgKGlpZCkgb2YKICogYSBnaXZlbiBjbGFzcyAocmNsc2lkKS4KICogV2l0aCB0aGlzIHBvaW50ZXIgaXQncyBwb3NzaWJsZSB0byBjYWxsIHRoZSBJQ2xhc3NGYWN0b3J5X0NyZWF0ZUluc3RhbmNlCiAqIG1ldGhvZCB0byBnZXQgYSBpbnN0YW5jZSBvZiB0aGUgcmVxdWVzdGVkIENsYXNzLgogKiBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIGluc3RhbnRpYXRlIHRoZSBDbGFzcyEhIQogKiAKICogUkVUVVJOUwogKiAgIEhSRVNVTFQKICoKICovCkRXT1JEIFdJTkFQSSBTSEVMTDMyX0RsbEdldENsYXNzT2JqZWN0KFJFRkNMU0lEIHJjbHNpZCxSRUZJSUQgaWlkLExQVk9JRCAqcHB2KQp7IEhSRVNVTFQJaHJlcyA9IEVfT1VUT0ZNRU1PUlk7CiAgTFBDTEFTU0ZBQ1RPUlkgbHBjbGY7CgogIGNoYXIJeGNsc2lkWzUwXSx4aWlkWzUwXTsKICBXSU5FX1N0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyY2xzaWQseGNsc2lkKTsKICBXSU5FX1N0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClpaWQseGlpZCk7CiAgVFJBQ0Uoc2hlbGwsIlxuXHRDTFNJRDpcdCVzLFxuXHRJSUQ6XHQlc1xuIix4Y2xzaWQseGlpZCk7CgkKICAqcHB2ID0gTlVMTDsKCWlmKElzRXF1YWxDTFNJRChyY2xzaWQsICZDTFNJRF9TaGVsbERlc2t0b3ApfHwgCgkgICBJc0VxdWFsQ0xTSUQocmNsc2lkLCAmQ0xTSURfU2hlbGxMaW5rKSkKCXsgaWYoSXNFcXVhbENMU0lEKHJjbHNpZCwgJkNMU0lEX1NoZWxsRGVza3RvcCkpICAgICAgLypkZWJ1ZyovCgkgICAgVFJBQ0Uoc2hlbGwsInJlcXVlc3RlZCBDTFNJRF9TaGVsbERlc2t0b3BcbiIpOwoJICBpZihJc0VxdWFsQ0xTSUQocmNsc2lkLCAmQ0xTSURfU2hlbGxMaW5rKSkgICAgICAgICAvKmRlYnVnKi8KCSAgICBUUkFDRShzaGVsbCwicmVxdWVzdGVkIENMU0lEX1NoZWxsTGlua1xuIik7CgogICAgLyogZml4bWU6IHRoZSBJQ2xhc3NGYWN0b3J5X0NvbnN0cnVjdG9yIGF0IHRoZSBtb21lbnQgb25seSAKCQkgZm9yIHJjbHNpZD1DTFNJRF9TaGVsbERlc2t0b3AsIHNvIHdlIGdldCB0aGUgcmlnaHQgSW50ZXJmYWNlIChqc2NoKSovCgkgIGxwY2xmID0gSUNsYXNzRmFjdG9yeV9Db25zdHJ1Y3RvcigpOwogICAgaWYobHBjbGYpCiAgICB7IGhyZXMgPSBscGNsZi0+bHB2dGJsLT5mblF1ZXJ5SW50ZXJmYWNlKGxwY2xmLGlpZCwgcHB2KTsKCQkgIGxwY2xmLT5scHZ0YmwtPmZuUmVsZWFzZShscGNsZik7CgkJfQoJfQoJZWxzZQogIHsgV0FSTihzaGVsbCwgImNsc2lkKCVzKSBub3QgaW4gYnVpbGRpbiBTSEVMTDMyXG4iLHhjbHNpZCk7CiAgICBocmVzID0gQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRTsKCX0KICBUUkFDRShzaGVsbCwiUkVUVVJOIHBvaW50ZXIgdG8gaW50ZXJmYWNlOiAlcFxuIixwcHYpOwogIHJldHVybiBocmVzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgU0hHZXREZXNrdG9wRm9sZGVyCQlbU0hFTEwzMi4yMTZdCiAqIAogKiAgU0RLIGhlYWRlciB3aW45NS9zaGxvYmouaDogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGwgQ29DcmVhdGVJbnN0YW5jZSB3aXRoCiAqICBDTFNJRF9TaGVsbERlc2t0b3AKICogIENvQ3JlYXRlSW5zdGFuY2UoQ0xTSURfRGVza3RvcCwgTlVMTCwgQ0xTQ1RYX0lOUFJPQywgSUlEX0lTaGVsbEZvbGRlciwgJnBzaGYpOwogKgogKiBSRVRVUk5TCiAqICAgdGhlIGludGVyZmFjZSB0byB0aGUgc2hlbGwgZGVza3RvcCBmb2xkZXIuCiAqCiAqLwpMUFNIRUxMRk9MREVSIHBkZXNrdG9wZm9sZGVyPU5VTEw7CgpEV09SRCBXSU5BUEkgU0hHZXREZXNrdG9wRm9sZGVyKExQU0hFTExGT0xERVIgKnNoZWxsZm9sZGVyKQp7IEhSRVNVTFQJaHJlcyA9IEVfT1VUT0ZNRU1PUlk7CiAgTFBDTEFTU0ZBQ1RPUlkgbHBjbGY7CglUUkFDRShzaGVsbCwiJXAtPiglcClcbiIsc2hlbGxmb2xkZXIsKnNoZWxsZm9sZGVyKTsKCQogIGlmIChwZGVza3RvcGZvbGRlcikKCXsgKnNoZWxsZm9sZGVyID0gcGRlc2t0b3Bmb2xkZXI7CgkgIGhyZXMgPSBOT0VSUk9SOwoJfQogIGVsc2UKCXsgbHBjbGYgPSBJQ2xhc3NGYWN0b3J5X0NvbnN0cnVjdG9yKCk7CiAgICAvKiBmaXhtZTogdGhlIGJ1aWxkaW4gSUNsYXNzRmFjdG9yeV9Db25zdHJ1Y3RvciBpcyBhdCB0aGUgbW9tZW50IG9ubHkgCiAJCWZvciByY2xzaWQ9Q0xTSURfU2hlbGxEZXNrdG9wLCBzbyB3ZSBnZXQgdGhlIHJpZ2h0IEludGVyZmFjZSAoanNjaCkqLwogICAgaWYobHBjbGYpCiAgICB7IGhyZXMgPSBscGNsZi0+bHB2dGJsLT5mbkNyZWF0ZUluc3RhbmNlKGxwY2xmLE5VTEwsKFJFRklJRCkmSUlEX0lTaGVsbEZvbGRlciwgKHZvaWQqKSZwZGVza3RvcGZvbGRlcik7CgkgCSAgbHBjbGYtPmxwdnRibC0+Zm5SZWxlYXNlKGxwY2xmKTsKCSAgfSAgCgl9CQoJaWYgKHBkZXNrdG9wZm9sZGVyKQoJeyAqc2hlbGxmb2xkZXIgPSBwZGVza3RvcGZvbGRlcjsJCgl9CiAgVFJBQ0Uoc2hlbGwsIi0tICVwLT4oJXApXG4iLHNoZWxsZm9sZGVyLCAqc2hlbGxmb2xkZXIpOwoJcmV0dXJuIGhyZXM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJIFNIR2V0TWFsbG9jCQkJW1NIRUxMMzIuMjIwXQogKiByZXR1cm5zIHRoZSBpbnRlcmZhY2UgdG8gc2hlbGwgbWFsbG9jLgogKgogKiBbU0RLIGhlYWRlciB3aW45NS9zaGxvYmouaDoKICogZXF1aXZhbGVudCB0bzogICNkZWZpbmUgU0hHZXRNYWxsb2MocHBtZW0pICAgQ29HZXRNYWxsb2MoTUVNQ1RYX1RBU0ssIHBwbWVtKQogKiBdCiAqIFdoYXQgd2UgYXJlIGN1cnJlbnRseSBkb2luZyBpcyBub3QgdmVyeSB3cm9uZywgc2luY2Ugd2UgYWx3YXlzIHVzZSB0aGUgc2FtZQogKiBoZWFwIChQcm9jZXNzSGVhcCkuCiAqLwpEV09SRCBXSU5BUEkgU0hHZXRNYWxsb2MoTFBNQUxMT0MzMiAqbHBtYWwpIAp7CVRSQUNFKHNoZWxsLCIoJXApXG4iLCBscG1hbCk7CglyZXR1cm4gQ29HZXRNYWxsb2MzMigwLGxwbWFsKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkgU0hHZXRTcGVjaWFsRm9sZGVyTG9jYXRpb24JW1NIRUxMMzIuMjIzXQogKiAgbkZvbGRlciBpcyBhIENTSURMX3h4eHh4LgogKgogKiBSRVRVUk5TCiAqICAgIHJldHVybnMgdGhlIFBJREwgb2YgYSBzcGVjaWFsIGZvbGRlcgogKgogKiBGSVhNRQogKiAgIHRoZSBwYXRoIGlzIGV2ZXJ5IHRpbWUgeDpcXHdpbmRvd3NcXGRlc2t0b3AKICogICB3ZSBzaG91bGQgZ2V0IHRoZSBwYXRoJ3MgZnJvbSB0aGUgcmVnaXN0cnkKICovCkhSRVNVTFQgV0lOQVBJIFNIR2V0U3BlY2lhbEZvbGRlckxvY2F0aW9uKAogICAgSFdORDMyIGh3bmRPd25lciwKCQlJTlQzMiBuRm9sZGVyLAogICAgTFBJVEVNSURMSVNUICogcHBpZGwpCnsJTFBTSEVMTEZPTERFUiBzaGVsbGZvbGRlcjsKICBEV09SRCAgcGNoRWF0ZW47CglDSEFSICAgcHN6VGVtcFsyNTZdOwoJTFBXU1RSIGxwc3pEaXNwbGF5TmFtZSA9IChMUFdTVFIpJnBzelRlbXBbMF07CgkKICBGSVhNRShzaGVsbCwiKCUwNHgsJWQsJXApLHN0dWIhXG4iLCBod25kT3duZXIsbkZvbGRlcixwcGlkbCk7CgogIExvY2FsVG9XaWRlQ2hhcjMyKGxwc3pEaXNwbGF5TmFtZSwgIng6XFx3aW5kb3dzXFxkZXNrdG9wXFwiLCAyNTYpOwogIAoJaWYgKFNIR2V0RGVza3RvcEZvbGRlcigmc2hlbGxmb2xkZXIpPT1TX09LKQoJeyBzaGVsbGZvbGRlci0+bHB2dGJsLT5mblBhcnNlRGlzcGxheU5hbWUoc2hlbGxmb2xkZXIsaHduZE93bmVyLAoJTlVMTCxscHN6RGlzcGxheU5hbWUsJnBjaEVhdGVuLHBwaWRsLE5VTEwpOwoJfQoKCXN3aXRjaCAobkZvbGRlcikKCXsJY2FzZSBDU0lETF9CSVRCVUNLRVQ6CiAgICAgIFRSQUNFIChzaGVsbCwibG9va2luZyBmb3IgUmVjeWNlbGVyXG4iKTsKICAgICAgYnJlYWs7CgkJY2FzZSBDU0lETF9DT05UUk9MUzoKICAgICAgVFJBQ0UgKHNoZWxsLCJsb29raW5nIGZvciBDb250cm9sXG4iKTsKICAgICAgYnJlYWs7CgkJY2FzZSBDU0lETF9ERVNLVE9QOgoJCSAgVFJBQ0UgKHNoZWxsLCJsb29raW5nIGZvciBEZXNrdG9wXG4iKTsKICAgICAgYnJlYWs7CgkJY2FzZSBDU0lETF9ERVNLVE9QRElSRUNUT1JZOgogICAgICBUUkFDRSAoc2hlbGwsImxvb2tpbmcgZm9yIERlc2tEaXJcbiIpOwogICAgICBicmVhazsKCQljYXNlIENTSURMX0RSSVZFUzoKICAgICAgVFJBQ0UgKHNoZWxsLCJsb29raW5nIGZvciBEcml2ZXNcbiIpOwogICAgICBicmVhazsKCQljYXNlIENTSURMX0ZPTlRTOgogICAgICBUUkFDRSAoc2hlbGwsImxvb2tpbmcgZm9yIEZvbnRzXG4iKTsKICAgICAgYnJlYWs7CgkJY2FzZSBDU0lETF9ORVRIT09EOgogICAgICBUUkFDRSAoc2hlbGwsImxvb2tpbmcgZm9yIE5ldGhvb2RcbiIpOwogICAgICBicmVhazsKCQljYXNlIENTSURMX05FVFdPUks6CgkJICBUUkFDRSAoc2hlbGwsImxvb2tpbmcgZm9yIE5ldHdvcmtcbiIpOwogICAgICBicmVhazsKCQljYXNlIENTSURMX1BFUlNPTkFMOgoJCSAgVFJBQ0UgKHNoZWxsLCJsb29raW5nIGZvciBQZXJzb25hbFxuIik7CiAgICAgIGJyZWFrOwoJCWNhc2UgQ1NJRExfUFJJTlRFUlM6CiAgICAgIFRSQUNFIChzaGVsbCwibG9va2luZyBmb3IgUHJpbnRlcnNcbiIpOwogICAgICBicmVhazsKCQljYXNlIENTSURMX1BST0dSQU1TOgogICAgICBUUkFDRSAoc2hlbGwsImxvb2tpbmcgZm9yIFByb2dyYW1tc1xuIik7CiAgICAgIGJyZWFrOwoJCWNhc2UgQ1NJRExfUkVDRU5UOgogICAgICBUUkFDRSAoc2hlbGwsImxvb2tpbmcgZm9yIFJlY2VudFxuIik7CiAgICAgIGJyZWFrOwoJCWNhc2UgQ1NJRExfU0VORFRPOgogICAgICBUUkFDRSAoc2hlbGwsImxvb2tpbmcgZm9yIFNlbmR0b1xuIik7CiAgICAgIGJyZWFrOwoJCWNhc2UgQ1NJRExfU1RBUlRNRU5VOgogICAgICBUUkFDRSAoc2hlbGwsImxvb2tpbmcgZm9yIFN0YXJ0bWVudVxuIik7CiAgICAgIGJyZWFrOwoJCWNhc2UgQ1NJRExfU1RBUlRVUDoKCQkgIFRSQUNFIChzaGVsbCwibG9va2luZyBmb3IgU3RhcnR1cFxuIik7CiAgICAgIGJyZWFrOwoJCWNhc2UgQ1NJRExfVEVNUExBVEVTOgoJCSAgVFJBQ0UgKHNoZWxsLCJsb29raW5nIGZvciBUZW1wbGF0ZXNcbiIpOwogICAgICBicmVhazsKCQlkZWZhdWx0OgogICAgICBFUlIgKHNoZWxsLCJ1bmtub3duIENTSURMXG4iKTsKICAgICAgYnJlYWs7Cgl9CgoJVFJBQ0Uoc2hlbGwsICItLSAobmV3IHBpZGwgJXApXG4iLCpwcGlkbCk7CgoJcmV0dXJuIE5PRVJST1I7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJIFNIR2V0UGF0aEZyb21JRExpc3QJCVtTSEVMTDMyLjIyMV0KICogcmV0dXJucyB0aGUgcGF0aCBmcm9tIGEgcGFzc2VkIFBJREwuCiAqLwpCT09MMzIgV0lOQVBJIFNIR2V0UGF0aEZyb21JRExpc3QoTFBDSVRFTUlETElTVCBwaWRsLExQU1RSIHBzelBhdGgpIAp7IFNUUlJFVCBscE5hbWU7CglMUFNIRUxMRk9MREVSIHNoZWxsZm9sZGVyOwoJVFJBQ0Uoc2hlbGwsIihwaWRsPSVwLCVwKVxuIixwaWRsLHBzelBhdGgpOwoKCWlmIChTSEdldERlc2t0b3BGb2xkZXIoJnNoZWxsZm9sZGVyKT09U19PSykKCXsgc2hlbGxmb2xkZXItPmxwdnRibC0+Zm5HZXREaXNwbGF5TmFtZU9mKHNoZWxsZm9sZGVyLHBpZGwsU0hHRE5fRk9SUEFSU0lORywmbHBOYW1lKTsKCX0KICBXaWRlQ2hhclRvTG9jYWwzMihwc3pQYXRoLCBscE5hbWUudS5wT2xlU3RyLCBNQVhfUEFUSCk7CgkvKiBmaXhtZSBmcmVlIHRoZSBvbGVzdHJpbmcqLwoJVFJBQ0Uoc2hlbGwsIi0tICglcylcbiIscHN6UGF0aCk7CglyZXR1cm4gTk9FUlJPUjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hIZWxwU2hvcnRjdXRzX1J1bkRMTCBbU0hFTEwzMi4yMjRdCiAqCiAqLwoKRFdPUkQgV0lOQVBJClNISGVscFNob3J0Y3V0c19SdW5ETEwgKERXT1JEIGR3QXJnMSwgRFdPUkQgZHdBcmcyLCBEV09SRCBkd0FyZzMsIERXT1JEIGR3QXJnNCkKeyBGSVhNRSAoZXhlYywgIiglbHgsICVseCwgJWx4LCAlbHgpIGVtcHR5IHN0dWIhXG4iLAoJZHdBcmcxLCBkd0FyZzIsIGR3QXJnMywgZHdBcmc0KTsKCiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNITG9hZEluUHJvYyBbU0hFTEwzMi4yMjVdCiAqCiAqLwoKRFdPUkQgV0lOQVBJClNITG9hZEluUHJvYyAoRFdPUkQgZHdBcmcxKQp7CiAgICBGSVhNRSAoc2hlbGwsICIoJWx4KSBlbXB0eSBzdHViIVxuIiwgZHdBcmcxKTsKCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hCcm93c2VGb3JGb2xkZXJBIFtTSEVMTDMyLjIwOV0KICoKICovCgpMUElURU1JRExJU1QgV0lOQVBJClNIQnJvd3NlRm9yRm9sZGVyMzJBIChMUEJST1dTRUlORk8zMkEgbHBiaSkKeyBGSVhNRSAoc2hlbGwsICIoJWx4KSBlbXB0eSBzdHViIVxuIiwgKERXT1JEKWxwYmkpOwogIEZJWE1FIChzaGVsbCwgIiglcykgZW1wdHkgc3R1YiFcbiIsIGxwYmktPmxwc3pUaXRsZSk7CiAgcmV0dXJuIE5VTEw7Cn0KCg==