LyoJCURpcmVjdERyYXcgLSBJRGlyZWN0UGFsZXR0ZSBiYXNlIGludGVyZmFjZQogKgogKiBDb3B5cmlnaHQgMjAwNiBTdGVmYW4gRPZzaW5nZXIKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCiNkZWZpbmUgQ09CSk1BQ1JPUwoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3UGFsZXR0ZTo6UXVlcnlJbnRlcmZhY2UKICoKICogQSB1c3VhbCBRdWVyeUludGVyZmFjZSBpbXBsZW1lbnRhdGlvbi4gQ2FuIG9ubHkgUXVlcnkgSVVua25vd24gYW5kCiAqIElEaXJlY3REcmF3UGFsZXR0ZQogKgogKiBQYXJhbXM6CiAqICByZWZpaWQ6IFRoZSBpbnRlcmZhY2UgaWQgcXVlcmllZCBmb3IKICogIG9iajogQWRkcmVzcyB0byByZXR1cm4gdGhlIGludGVyZmFjZSBwb2ludGVyIGF0CiAqCiAqIFJldHVybnM6CiAqICBTX09LIG9uIHN1Y2Nlc3MKICogIEVfTk9JTlRFUkZBQ0UgaWYgdGhlIHJlcXVlc3RlZCBpbnRlcmZhY2Ugd2Fzbid0IGZvdW5kCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3UGFsZXR0ZUltcGxfUXVlcnlJbnRlcmZhY2UoSURpcmVjdERyYXdQYWxldHRlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3UGFsZXR0ZUltcGwsIElEaXJlY3REcmF3UGFsZXR0ZSwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcywlcClcbiIsVGhpcyxkZWJ1Z3N0cl9ndWlkKHJlZmlpZCksb2JqKTsKCiAgICBpZiAoSXNFcXVhbEdVSUQocmVmaWlkLCAmSUlEX0lVbmtub3duKQogICAgICAgIHx8IElzRXF1YWxHVUlEKHJlZmlpZCwgJklJRF9JRGlyZWN0RHJhd1BhbGV0dGUpKQogICAgewogICAgICAgICpvYmogPSBpZmFjZTsKICAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGVfQWRkUmVmKGlmYWNlKTsKICAgICAgICByZXR1cm4gU19PSzsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAqb2JqID0gTlVMTDsKICAgICAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3UGFsZXR0ZUltcGw6OkFkZFJlZgogKgogKiBJbmNyZWFzZXMgdGhlIHJlZmNvdW50LgogKgogKiBSZXR1cm5zOgogKiAgVGhlIG5ldyByZWZjb3VudAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBVTE9ORyBXSU5BUEkKSURpcmVjdERyYXdQYWxldHRlSW1wbF9BZGRSZWYoSURpcmVjdERyYXdQYWxldHRlICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdQYWxldHRlSW1wbCwgSURpcmVjdERyYXdQYWxldHRlLCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KCkgaW5jcmVtZW50aW5nIGZyb20gJXUuXG4iLCBUaGlzLCByZWYgLSAxKTsKCiAgICByZXR1cm4gcmVmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdQYWxldHRlSW1wbDo6UmVsZWFzZQogKgogKiBSZWR1Y2VzIHRoZSByZWZjb3VudC4gSWYgdGhlIHJlZmNvdW50IGZhbGxzIHRvIDAsIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkCiAqCiAqIFJldHVybnM6CiAqICBUaGUgbmV3IHJlZmNvdW50CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFVMT05HIFdJTkFQSQpJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX1JlbGVhc2UoSURpcmVjdERyYXdQYWxldHRlICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdQYWxldHRlSW1wbCwgSURpcmVjdERyYXdQYWxldHRlLCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJXUuXG4iLCBUaGlzLCByZWYgKyAxKTsKCiAgICBpZiAocmVmID09IDApCiAgICB7CiAgICAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICBJV2luZUQzRFBhbGV0dGVfUmVsZWFzZShUaGlzLT53aW5lRDNEUGFsZXR0ZSk7CiAgICAgICAgaWYoVGhpcy0+aWZhY2VUb1JlbGVhc2UpCiAgICAgICAgewogICAgICAgICAgICBJVW5rbm93bl9SZWxlYXNlKFRoaXMtPmlmYWNlVG9SZWxlYXNlKTsKICAgICAgICB9CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKICAgIH0KCiAgICByZXR1cm4gcmVmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdQYWxldHRlOjpJbml0aWFsaXplCiAqCiAqIEluaXRpYWxpemVzIHRoZSBwYWxldHRlLiBBcyB3ZSBzdGFydCBpbml0aWFsaXplZCwgcmV0dXJuCiAqIERERVJSX0FMUkVBRFlJTklUSUFMSVpFRAogKgogKiBQYXJhbXM6CiAqICBERDogRGlyZWN0RHJhdyBpbnRlcmZhY2UgdGhpcyBwYWxldHRlIGlzIGFzaWduZWQgdG8KICogIEZsYWdzOiBTb21lIGZsYWdzLCBhcyB1c3VhbAogKiAgQ29sb3JUYWJsZTogVGhlIHN0YXJ0dXAgY29sb3IgdGFibGUKICoKICogUmV0dXJuczoKICogIERERVJSX0FMUkVBRFlJTklUSUFMSVpFRAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX0luaXRpYWxpemUoSURpcmVjdERyYXdQYWxldHRlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3ICpERCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFMRVRURUVOVFJZICpDb2xvclRhYmxlKQp7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCV4LCVwKVxuIiwgaWZhY2UsIERELCBGbGFncywgQ29sb3JUYWJsZSk7CiAgICByZXR1cm4gRERFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdQYWxldHRlOjpHZXRDYXBzCiAqCiAqIFJldHVybnMgdGhlIHBhbGV0dGUgZGVzY3JpcHRpb24KICoKICogUGFyYW1zOgogKiAgQ2FwczogQWRkcmVzcyB0byBzdG9yZSB0aGUgY2FwcyBhdAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgQ2FwcyBpcyBOVUxMCiAqICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgSVdpbmVEM0RQYWxldHRlOjpHZXRDYXBzCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3UGFsZXR0ZUltcGxfR2V0Q2FwcyhJRGlyZWN0RHJhd1BhbGV0dGUgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKkNhcHMpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3UGFsZXR0ZUltcGwsIElEaXJlY3REcmF3UGFsZXR0ZSwgaWZhY2UpOwogICAgSFJFU1VMVCBocjsKICAgIFRSQUNFKCIoJXApLT4oJXApOiBSZWxheVxuIiwgVGhpcywgQ2Fwcyk7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIGhyID0gSVdpbmVEM0RQYWxldHRlX0dldENhcHMoVGhpcy0+d2luZUQzRFBhbGV0dGUsIENhcHMpOwogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3UGFsZXR0ZTo6U2V0RW50cmllcwogKgogKiBTZXRzIHRoZSBwYWxldHRlIGVudHJpZXMgZnJvbSBhIFBBTEVUVEVFTlRSWSBzdHJ1Y3R1cmUuIFdpbmVEM0QgdGFrZXMKICogY2FyZSBmb3IgdXBkYXRpbmcgdGhlIHN1cmZhY2UuCiAqCiAqIFBhcmFtczoKICogIEZsYWdzOiBGbGFncywgYXMgdXN1YWwKICogIFN0YXJ0OiBGaXJzdCBwYWxldHRlIGVudHJ5IHRvIHNldAogKiAgQ291bnQ6IE51bWJlciBvZiBlbnRyaWVzIHRvIHNldAogKiAgUGFsRW50OiBTb3VyY2UgZW50cmllcwogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgUGFsRW50IGlzIE5VTEwKICogIEZvciBkZXRhaWxzLCBzZWUgSVdpbmVEM0REZXZpY2U6OlNldEVudHJpZXMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdQYWxldHRlSW1wbF9TZXRFbnRyaWVzKElEaXJlY3REcmF3UGFsZXR0ZSAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUxFVFRFRU5UUlkgKlBhbEVudCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdQYWxldHRlSW1wbCwgSURpcmVjdERyYXdQYWxldHRlLCBpZmFjZSk7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPigleCwlZCwlZCwlcCk6IFJlbGF5XG4iLCBUaGlzLCBGbGFncywgU3RhcnQsIENvdW50LCBQYWxFbnQpOwoKICAgIGlmKCFQYWxFbnQpCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIGhyID0gSVdpbmVEM0RQYWxldHRlX1NldEVudHJpZXMoVGhpcy0+d2luZUQzRFBhbGV0dGUsIEZsYWdzLCBTdGFydCwgQ291bnQsIFBhbEVudCk7CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdQYWxldHRlOjpHZXRFbnRyaWVzCiAqCiAqIFJldHVybnMgdGhlIGVudHJpZXMgc3RvcmVkIGluIHRoaXMgaW50ZXJmYWNlLgogKgogKiBQYXJhbXM6CiAqICBGbGFnczogRmxhZ3MgOikKICogIFN0YXJ0OiBGaXJzdCBlbnRyeSB0byByZXR1cm4KICogIENvdW50OiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgdG8gcmV0dXJuCiAqICBQYWxFbnQ6IFBBTEVUVEVFTlRSWSBzdHJ1Y3R1cmUgdG8gd3JpdGUgdGhlIGVudHJpZXMgdG8KICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIFBhbEVudCBpcyBOVUxMCiAqICBGb3IgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpTZXRFbnRyaWVzCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3UGFsZXR0ZUltcGxfR2V0RW50cmllcyhJRGlyZWN0RHJhd1BhbGV0dGUgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFMRVRURUVOVFJZICpQYWxFbnQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3UGFsZXR0ZUltcGwsIElEaXJlY3REcmF3UGFsZXR0ZSwgaWZhY2UpOwogICAgSFJFU1VMVCBocjsKICAgIFRSQUNFKCIoJXApLT4oJXgsJWQsJWQsJXApOiBSZWxheVxuIiwgVGhpcywgRmxhZ3MsIFN0YXJ0LCBDb3VudCwgUGFsRW50KTsKCiAgICBpZighUGFsRW50KQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICBociA9IElXaW5lRDNEUGFsZXR0ZV9HZXRFbnRyaWVzKFRoaXMtPndpbmVEM0RQYWxldHRlLCBGbGFncywgU3RhcnQsIENvdW50LCBQYWxFbnQpOwogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIHJldHVybiBocjsKfQoKY29uc3QgSURpcmVjdERyYXdQYWxldHRlVnRibCBJRGlyZWN0RHJhd1BhbGV0dGVfVnRibCA9CnsKICAgIC8qKiogSVVua25vd24gKioqLwogICAgSURpcmVjdERyYXdQYWxldHRlSW1wbF9RdWVyeUludGVyZmFjZSwKICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGxfQWRkUmVmLAogICAgSURpcmVjdERyYXdQYWxldHRlSW1wbF9SZWxlYXNlLAogICAgLyoqKiBJRGlyZWN0RHJhd1BhbGV0dGUgKioqLwogICAgSURpcmVjdERyYXdQYWxldHRlSW1wbF9HZXRDYXBzLAogICAgSURpcmVjdERyYXdQYWxldHRlSW1wbF9HZXRFbnRyaWVzLAogICAgSURpcmVjdERyYXdQYWxldHRlSW1wbF9Jbml0aWFsaXplLAogICAgSURpcmVjdERyYXdQYWxldHRlSW1wbF9TZXRFbnRyaWVzCn07Cg==