LyoKICogUlBDIGJpbmRpbmcgQVBJCiAqCiAqIENvcHlyaWdodCAyMDAxIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX1JQQ19CSU5ESU5HX0gKI2RlZmluZSBfX1dJTkVfUlBDX0JJTkRJTkdfSAoKI2luY2x1ZGUgIndpbmUvcnBjc3Nfc2hhcmVkLmgiCgp0eXBlZGVmIHN0cnVjdCBfUnBjQ29ubmVjdGlvbgp7CiAgc3RydWN0IF9ScGNDb25uZWN0aW9uKiBOZXh0OwogIHN0cnVjdCBfUnBjQmluZGluZyogVXNlZDsKICBCT09MIHNlcnZlcjsKICBMUFNUUiBQcm90c2VxOwogIExQU1RSIE5ldHdvcmtBZGRyOwogIExQU1RSIEVuZHBvaW50OwogIEhBTkRMRSBjb25uLCB0aHJlYWQ7CiAgT1ZFUkxBUFBFRCBvdmw7CiAgVVNIT1JUIE1heFRyYW5zbWlzc2lvblNpemU7CiAgLyogVGhlIGFjdGl2ZSBpbnRlcmZhY2UgYm91bmQgdG8gc2VydmVyLiAqLwogIFJQQ19TWU5UQVhfSURFTlRJRklFUiBBY3RpdmVJbnRlcmZhY2U7Cn0gUnBjQ29ubmVjdGlvbjsKCi8qIGRvbid0IGtub3cgd2hhdCBNUydzIHN0cnVjdHVyZSBsb29rcyBsaWtlICovCnR5cGVkZWYgc3RydWN0IF9ScGNCaW5kaW5nCnsKICBMT05HIHJlZnM7CiAgc3RydWN0IF9ScGNCaW5kaW5nKiBOZXh0OwogIEJPT0wgc2VydmVyOwogIFVVSUQgT2JqZWN0VXVpZDsKICBMUFNUUiBQcm90c2VxOwogIExQU1RSIE5ldHdvcmtBZGRyOwogIExQU1RSIEVuZHBvaW50OwogIFJQQ19CTE9DS0lOR19GTiBCbG9ja2luZ0ZuOwogIFVMT05HIFNlcnZlclRpZDsKICBScGNDb25uZWN0aW9uKiBGcm9tQ29ubjsKfSBScGNCaW5kaW5nOwoKTFBTVFIgUlBDUlQ0X3N0cm5kdXBBKExQQ1NUUiBzcmMsIElOVCBsZW4pOwpMUFdTVFIgUlBDUlQ0X3N0cm5kdXBXKExQV1NUUiBzcmMsIElOVCBsZW4pOwpMUFNUUiBSUENSVDRfc3RyZHVwV3RvQShMUFdTVFIgc3JjKTsKTFBXU1RSIFJQQ1JUNF9zdHJkdXBBdG9XKExQU1RSIHNyYyk7CnZvaWQgUlBDUlQ0X3N0cmZyZWUoTFBTVFIgc3JjKTsKCiNkZWZpbmUgUlBDUlQ0X3N0cmR1cEEoeCkgUlBDUlQ0X3N0cm5kdXBBKCh4KSwtMSkKI2RlZmluZSBSUENSVDRfc3RyZHVwVyh4KSBSUENSVDRfc3RybmR1cFcoKHgpLC0xKQoKUlBDX1NUQVRVUyBSUENSVDRfQ3JlYXRlQ29ubmVjdGlvbihScGNDb25uZWN0aW9uKiogQ29ubmVjdGlvbiwgQk9PTCBzZXJ2ZXIsIExQU1RSIFByb3RzZXEsIExQU1RSIE5ldHdvcmtBZGRyLCBMUFNUUiBFbmRwb2ludCwgTFBTVFIgTmV0d29ya09wdGlvbnMsIFJwY0JpbmRpbmcqIEJpbmRpbmcpOwpSUENfU1RBVFVTIFJQQ1JUNF9EZXN0cm95Q29ubmVjdGlvbihScGNDb25uZWN0aW9uKiBDb25uZWN0aW9uKTsKUlBDX1NUQVRVUyBSUENSVDRfT3BlbkNvbm5lY3Rpb24oUnBjQ29ubmVjdGlvbiogQ29ubmVjdGlvbik7ClJQQ19TVEFUVVMgUlBDUlQ0X0Nsb3NlQ29ubmVjdGlvbihScGNDb25uZWN0aW9uKiBDb25uZWN0aW9uKTsKUlBDX1NUQVRVUyBSUENSVDRfU3Bhd25Db25uZWN0aW9uKFJwY0Nvbm5lY3Rpb24qKiBDb25uZWN0aW9uLCBScGNDb25uZWN0aW9uKiBPbGRDb25uZWN0aW9uKTsKClJQQ19TVEFUVVMgUlBDUlQ0X0NyZWF0ZUJpbmRpbmdBKFJwY0JpbmRpbmcqKiBCaW5kaW5nLCBCT09MIHNlcnZlciwgTFBTVFIgUHJvdHNlcSk7ClJQQ19TVEFUVVMgUlBDUlQ0X0NyZWF0ZUJpbmRpbmdXKFJwY0JpbmRpbmcqKiBCaW5kaW5nLCBCT09MIHNlcnZlciwgTFBXU1RSIFByb3RzZXEpOwpSUENfU1RBVFVTIFJQQ1JUNF9Db21wbGV0ZUJpbmRpbmdBKFJwY0JpbmRpbmcqIEJpbmRpbmcsIExQU1RSIE5ldHdvcmtBZGRyLCAgTFBTVFIgRW5kcG9pbnQsICBMUFNUUiBOZXR3b3JrT3B0aW9ucyk7ClJQQ19TVEFUVVMgUlBDUlQ0X0NvbXBsZXRlQmluZGluZ1coUnBjQmluZGluZyogQmluZGluZywgTFBXU1RSIE5ldHdvcmtBZGRyLCBMUFdTVFIgRW5kcG9pbnQsIExQV1NUUiBOZXR3b3JrT3B0aW9ucyk7ClJQQ19TVEFUVVMgUlBDUlQ0X1Jlc29sdmVCaW5kaW5nKFJwY0JpbmRpbmcqIEJpbmRpbmcsIExQU1RSIEVuZHBvaW50KTsKUlBDX1NUQVRVUyBSUENSVDRfU2V0QmluZGluZ09iamVjdChScGNCaW5kaW5nKiBCaW5kaW5nLCBVVUlEKiBPYmplY3RVdWlkKTsKUlBDX1NUQVRVUyBSUENSVDRfTWFrZUJpbmRpbmcoUnBjQmluZGluZyoqIEJpbmRpbmcsIFJwY0Nvbm5lY3Rpb24qIENvbm5lY3Rpb24pOwpSUENfU1RBVFVTIFJQQ1JUNF9FeHBvcnRCaW5kaW5nKFJwY0JpbmRpbmcqKiBCaW5kaW5nLCBScGNCaW5kaW5nKiBPbGRCaW5kaW5nKTsKUlBDX1NUQVRVUyBSUENSVDRfRGVzdHJveUJpbmRpbmcoUnBjQmluZGluZyogQmluZGluZyk7ClJQQ19TVEFUVVMgUlBDUlQ0X09wZW5CaW5kaW5nKFJwY0JpbmRpbmcqIEJpbmRpbmcsIFJwY0Nvbm5lY3Rpb24qKiBDb25uZWN0aW9uLCBQUlBDX1NZTlRBWF9JREVOVElGSUVSIFRyYW5zZmVyU3ludGF4LCBQUlBDX1NZTlRBWF9JREVOVElGSUVSIEludGVyZmFjZUlkKTsKUlBDX1NUQVRVUyBSUENSVDRfQ2xvc2VCaW5kaW5nKFJwY0JpbmRpbmcqIEJpbmRpbmcsIFJwY0Nvbm5lY3Rpb24qIENvbm5lY3Rpb24pOwpCT09MIFJQQ1JUNF9SUENTU09uRGVtYW5kQ2FsbChQUlBDU1NfTlBfTUVTU0FHRSBtc2csIGNoYXIgKnZhcmRhdGFfcGF5bG9hZCwgUFJQQ1NTX05QX1JFUExZIHJlcGx5KTsKSEFORExFIFJQQ1JUNF9HZXRNYXN0ZXJNdXRleCh2b2lkKTsKSEFORExFIFJQQ1JUNF9ScGNzc05QQ29ubmVjdCh2b2lkKTsKCiNlbmRpZgo=