LyogJFhGcmVlODYkICovIC8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogMyAtKi0gKi8KLyoKICogQ29weXJpZ2h0IDIwMDAgR2FyZXRoIEh1Z2hlcwogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIEdBUkVUSCBIVUdIRVMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCiAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCiAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqLwoKLyoKICogQXV0aG9yczoKICoJR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgogKglMZWlmIERlbGdhc3MgPGxkZWxnYXNzQHJldGluYWxidXJuLm5ldD4KICoJSm9z6SBGb25zZWNhIDxqX3JfZm9uc2VjYUB5YWhvby5jby51az4KICovCgojaWZuZGVmIF9fTUFDSDY0X1NDUkVFTl9IX18KI2RlZmluZSBfX01BQ0g2NF9TQ1JFRU5fSF9fCgojaW5jbHVkZSAieG1sY29uZmlnLmgiCgp0eXBlZGVmIHN0cnVjdCB7CiAgIGRybV9oYW5kbGVfdCBoYW5kbGU7CQkJLyogSGFuZGxlIHRvIHRoZSBEUk0gcmVnaW9uICovCiAgIGRybVNpemUgc2l6ZTsJCQkvKiBTaXplIG9mIHRoZSBEUk0gcmVnaW9uICovCiAgIGRybUFkZHJlc3MgKm1hcDsJCQkvKiBNYXBwaW5nIG9mIHRoZSBEUk0gcmVnaW9uICovCn0gbWFjaDY0UmVnaW9uUmVjLCAqbWFjaDY0UmVnaW9uUHRyOwoKdHlwZWRlZiBzdHJ1Y3QgewogICBpbnQgY2hpcHNldDsKICAgaW50IHdpZHRoOwogICBpbnQgaGVpZ2h0OwogICBpbnQgbWVtOwogICBpbnQgY3BwOwoKICAgdW5zaWduZWQgaW50CWZyb250T2Zmc2V0OwogICB1bnNpZ25lZCBpbnQgZnJvbnRQaXRjaDsKICAgdW5zaWduZWQgaW50CWJhY2tPZmZzZXQ7CiAgIHVuc2lnbmVkIGludCBiYWNrUGl0Y2g7CgogICB1bnNpZ25lZCBpbnQJZGVwdGhPZmZzZXQ7CiAgIHVuc2lnbmVkIGludCBkZXB0aFBpdGNoOwoKICAgaW50IElzUENJOwogICBpbnQgQUdQTW9kZTsKICAgdW5zaWduZWQgaW50IGlycTsJCQkvKiBJUlEgbnVtYmVyICgwIG1lYW5zIG5vbmUpICovCgogICAvKiBTaGFyZWQgVGV4dHVyZSBkYXRhICovCiAgIGludCBmaXJzdFRleEhlYXAsIG51bVRleEhlYXBzOwogICBpbnQgdGV4T2Zmc2V0W01BQ0g2NF9OUl9URVhfSEVBUFNdOwogICBpbnQgdGV4U2l6ZVtNQUNINjRfTlJfVEVYX0hFQVBTXTsKICAgaW50IGxvZ1RleEdyYW51bGFyaXR5W01BQ0g2NF9OUl9URVhfSEVBUFNdOwoKICAgbWFjaDY0UmVnaW9uUmVjIG1taW87CiAgIG1hY2g2NFJlZ2lvblJlYyBhZ3BUZXh0dXJlczsKCiAgIGRybUJ1Zk1hcFB0ciBidWZmZXJzOwoKICAgX19EUklzY3JlZW5Qcml2YXRlICpkcmlTY3JlZW47CgogICBkcmlPcHRpb25DYWNoZSBvcHRpb25DYWNoZTsKCiAgIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICpleHRlbnNpb25zWzRdOwp9IG1hY2g2NFNjcmVlblJlYywgKm1hY2g2NFNjcmVlblB0cjsKCiNlbmRpZiAvKiBfX01BQ0g2NF9TQ1JFRU5fSF9fICovCg==