LyogJFhGcmVlODYkICovIC8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogMyAtKi0gKi8KLyoKICogQ29weXJpZ2h0IDIwMDAgR2FyZXRoIEh1Z2hlcwogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIEdBUkVUSCBIVUdIRVMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCiAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCiAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqLwoKLyoKICogQXV0aG9yczoKICoJR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgogKglMZWlmIERlbGdhc3MgPGxkZWxnYXNzQHJldGluYWxidXJuLm5ldD4KICoJSm9z6SBGb25zZWNhIDxqX3JfZm9uc2VjYUB5YWhvby5jby51az4KICovCgojaWZuZGVmIF9fTUFDSDY0X1RFWF9IX18KI2RlZmluZSBfX01BQ0g2NF9URVhfSF9fCgpleHRlcm4gdm9pZCBtYWNoNjRVcGRhdGVUZXh0dXJlU3RhdGUoIEdMY29udGV4dCAqY3R4ICk7CgpleHRlcm4gdm9pZCBtYWNoNjRVcGxvYWRUZXhJbWFnZXMoIG1hY2g2NENvbnRleHRQdHIgbWFjaDY0Y3R4LAoJCQkJICAgbWFjaDY0VGV4T2JqUHRyIHQgKTsKCmV4dGVybiB2b2lkIG1hY2g2NFVwbG9hZE11bHRpVGV4SW1hZ2VzKCBtYWNoNjRDb250ZXh0UHRyIG1hY2g2NGN0eCwKCQkJCQltYWNoNjRUZXhPYmpQdHIgdDAsIG1hY2g2NFRleE9ialB0ciB0MSApOwoKZXh0ZXJuIHZvaWQgbWFjaDY0RGVzdHJveVRleE9iaiggbWFjaDY0Q29udGV4dFB0ciBtYWNoNjRjdHgsCgkJCQkgbWFjaDY0VGV4T2JqUHRyIHQgKTsKCmV4dGVybiB2b2lkIG1hY2g2NEVtaXRUZXhTdGF0ZUxvY2tlZCggbWFjaDY0Q29udGV4dFB0ciBtbWVzYSwKCQkJCSAgICAgIG1hY2g2NFRleE9ialB0ciB0MCwKCQkJCSAgICAgIG1hY2g2NFRleE9ialB0ciB0MSApOwoKZXh0ZXJuIHZvaWQgbWFjaDY0SW5pdFRleHR1cmVGdW5jcyggc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jdGlvbnMgKTsKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogQ29sb3IgY29udmVyc2lvbiBtYWNyb3M6CiAqLwoKI2RlZmluZSBNQUNINjRQQUNLQ09MT1IzMzIociwgZywgYikJCQkJCVwKICAgKCgocikgJiAweGUwKSB8ICgoKGcpICYgMHhlMCkgPj4gMykgfCAoKChiKSAmIDB4YzApID4+IDYpKQoKI2RlZmluZSBNQUNINjRQQUNLQ09MT1IxNTU1KHIsIGcsIGIsIGEpCQkJCQlcCiAgICgoKChyKSAmIDB4ZjgpIDw8IDcpIHwgKCgoZykgJiAweGY4KSA8PCAyKSB8ICgoKGIpICYgMHhmOCkgPj4gMykgfAlcCiAgICAoKGEpID8gMHg4MDAwIDogMCkpCgojZGVmaW5lIE1BQ0g2NFBBQ0tDT0xPUjU2NShyLCBnLCBiKQkJCQkJXAogICAoKCgocikgJiAweGY4KSA8PCA4KSB8ICgoKGcpICYgMHhmYykgPDwgMykgfCAoKChiKSAmIDB4ZjgpID4+IDMpKQoKI2RlZmluZSBNQUNINjRQQUNLQ09MT1I4ODgociwgZywgYikJCQkJCVwKICAgKCgocikgPDwgMTYpIHwgKChnKSA8PCA4KSB8IChiKSkKCiNkZWZpbmUgTUFDSDY0UEFDS0NPTE9SODg4OChyLCBnLCBiLCBhKQkJCQkJXAogICAoKChhKSA8PCAyNCkgfCAoKHIpIDw8IDE2KSB8ICgoZykgPDwgOCkgfCAoYikpCgojZGVmaW5lIE1BQ0g2NFBBQ0tDT0xPUjQ0NDQociwgZywgYiwgYSkJCQkJCVwKICAgKCgoKGEpICYgMHhmMCkgPDwgOCkgfCAoKChyKSAmIDB4ZjApIDw8IDQpIHwgKChnKSAmIDB4ZjApIHwgKChiKSA+PiA0KSkKCnN0YXRpYyBJTkxJTkUgR0x1aW50IG1hY2g2NFBhY2tDb2xvciggR0x1aW50IGNwcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVieXRlIHIsIEdMdWJ5dGUgZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVieXRlIGIsIEdMdWJ5dGUgYSApCnsKICAgc3dpdGNoICggY3BwICkgewogICBjYXNlIDI6CiAgICAgIHJldHVybiBNQUNINjRQQUNLQ09MT1I1NjUoIHIsIGcsIGIgKTsKICAgY2FzZSA0OgogICAgICByZXR1cm4gTUFDSDY0UEFDS0NPTE9SODg4OCggciwgZywgYiwgYSApOwogICBkZWZhdWx0OgogICAgICByZXR1cm4gMDsKICAgfQp9CgojZW5kaWYK