LyogY29ubmVjdGlvbi5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBjb25uZWN0aW9uIHR5cGUKICoKICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogKgogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICoKICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwogKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgogKgogKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CiAqCiAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgogKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQogKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCiAqLwoKI2lmbmRlZiBQWVNRTElURV9DT05ORUNUSU9OX0gKI2RlZmluZSBQWVNRTElURV9DT05ORUNUSU9OX0gKI2luY2x1ZGUgIlB5dGhvbi5oIgojaW5jbHVkZSAicHl0aHJlYWQuaCIKI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgoKI2luY2x1ZGUgImNhY2hlLmgiCiNpbmNsdWRlICJtb2R1bGUuaCIKCiNpbmNsdWRlICJzcWxpdGUzLmgiCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBQeU9iamVjdF9IRUFECiAgICBzcWxpdGUzKiBkYjsKCiAgICAvKiAxIGlmIHdlIGFyZSBjdXJyZW50bHkgd2l0aGluIGEgdHJhbnNhY3Rpb24sIGkuIGUuIGlmIGEgQkVHSU4gaGFzIGJlZW4KICAgICAqIGlzc3VlZCAqLwogICAgaW50IGluVHJhbnNhY3Rpb247CgogICAgLyogdGhlIHR5cGUgZGV0ZWN0aW9uIG1vZGUuIE9ubHkgMCwgUEFSU0VfREVDTFRZUEVTLCBQQVJTRV9DT0xOQU1FUyBvciBhCiAgICAgKiBiaXR3aXNlIGNvbWJpbmF0aW9uIHRoZXJlb2YgbWFrZXMgc2Vuc2UgKi8KICAgIGludCBkZXRlY3RfdHlwZXM7CgogICAgLyogdGhlIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcyBmb3IgZGF0YWJhc2UgbG9ja3MgKi8KICAgIGRvdWJsZSB0aW1lb3V0OwoKICAgIC8qIGZvciBpbnRlcm5hbCB1c2UgaW4gdGhlIHRpbWVvdXQgaGFuZGxlcjogd2hlbiBkaWQgdGhlIHRpbWVvdXQgaGFuZGxlcgogICAgICogZmlyc3QgZ2V0IGNhbGxlZCB3aXRoIGNvdW50PTA/ICovCiAgICBkb3VibGUgdGltZW91dF9zdGFydGVkOwoKICAgIC8qIE5vbmUgZm9yIGF1dG9jb21taXQsIG90aGVyd2lzZSBhIFB5U3RyaW5nIHdpdGggdGhlIGlzb2xhdGlvbiBsZXZlbCAqLwogICAgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbDsKCiAgICAvKiBOVUxMIGZvciBhdXRvY29tbWl0LCBvdGhlcndpc2UgYSBzdHJpbmcgd2l0aCB0aGUgQkVHSU4gc3RhdGVtZW50OyB3aWxsIGJlCiAgICAgKiBmcmVlZCBpbiBjb25uZWN0aW9uIGRlc3RydWN0b3IgKi8KICAgIGNoYXIqIGJlZ2luX3N0YXRlbWVudDsKCiAgICAvKiAxIGlmIGEgY2hlY2sgc2hvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZWFjaCBBUEkgY2FsbCBpZiB0aGUgY29ubmVjdGlvbiBpcwogICAgICogdXNlZCBmcm9tIHRoZSBzYW1lIHRocmVhZCBpdCB3YXMgY3JlYXRlZCBpbiAqLwogICAgaW50IGNoZWNrX3NhbWVfdGhyZWFkOwoKICAgIGludCBpbml0aWFsaXplZDsKCiAgICAvKiB0aHJlYWQgaWRlbnRpZmljYXRpb24gb2YgdGhlIHRocmVhZCB0aGUgY29ubmVjdGlvbiB3YXMgY3JlYXRlZCBpbiAqLwogICAgbG9uZyB0aHJlYWRfaWRlbnQ7CgogICAgcHlzcWxpdGVfQ2FjaGUqIHN0YXRlbWVudF9jYWNoZTsKCiAgICAvKiBMaXN0cyBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gc3RhdGVtZW50cyBhbmQgY3Vyc29ycyB1c2VkIHdpdGhpbiB0aGlzIGNvbm5lY3Rpb24gKi8KICAgIFB5T2JqZWN0KiBzdGF0ZW1lbnRzOwogICAgUHlPYmplY3QqIGN1cnNvcnM7CgogICAgLyogQ291bnRlcnMgZm9yIGhvdyBtYW55IHN0YXRlbWVudHMvY3Vyc29ycyB3ZXJlIGNyZWF0ZWQgaW4gdGhlIGNvbm5lY3Rpb24uIE1heSBiZQogICAgICogcmVzZXQgdG8gMCBhdCBjZXJ0YWluIGludGVydmFscyAqLwogICAgaW50IGNyZWF0ZWRfc3RhdGVtZW50czsKICAgIGludCBjcmVhdGVkX2N1cnNvcnM7CgogICAgUHlPYmplY3QqIHJvd19mYWN0b3J5OwoKICAgIC8qIERldGVybWluZXMgaG93IGJ5dGVzdHJpbmdzIGZyb20gU1FMaXRlIGFyZSBjb252ZXJ0ZWQgdG8gUHl0aG9uIG9iamVjdHM6CiAgICAgKiAtIFB5VW5pY29kZV9UeXBlOiAgICAgICAgUHl0aG9uIFVuaWNvZGUgb2JqZWN0cyBhcmUgY29uc3RydWN0ZWQgZnJvbSBVVEYtOCBieXRlc3RyaW5ncwogICAgICogLSBPcHRpbWl6ZWRVbmljb2RlOiAgICAgIExpa2UgYmVmb3JlLCBidXQgZm9yIEFTQ0lJIGRhdGEsIG9ubHkgUHlTdHJpbmdzIGFyZSBjcmVhdGVkLgogICAgICogLSBQeVN0cmluZ19UeXBlOiAgICAgICAgIFB5U3RyaW5ncyBhcmUgY3JlYXRlZCBhcy1pcy4KICAgICAqIC0gQW55IGN1c3RvbSBjYWxsYWJsZTogICBBbnkgb2JqZWN0IHJldHVybmVkIGZyb20gdGhlIGNhbGxhYmxlIGNhbGxlZCB3aXRoIHRoZSBieXRlc3RyaW5nCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgc2luZ2xlIHBhcmFtZXRlci4KICAgICAqLwogICAgUHlPYmplY3QqIHRleHRfZmFjdG9yeTsKCiAgICAvKiByZW1lbWJlciByZWZlcmVuY2VzIHRvIGZ1bmN0aW9ucy9jbGFzc2VzIHVzZWQgaW4KICAgICAqIGNyZWF0ZV9mdW5jdGlvbi9jcmVhdGUvYWdncmVnYXRlLCB1c2UgdGhlc2UgYXMgZGljdGlvbmFyeSBrZXlzLCBzbyB3ZQogICAgICogY2FuIGtlZXAgdGhlIHRvdGFsIHN5c3RlbSByZWZjb3VudCBjb25zdGFudCBieSBjbGVhcmluZyB0aGF0IGRpY3Rpb25hcnkKICAgICAqIGluIGNvbm5lY3Rpb25fZGVhbGxvYyAqLwogICAgUHlPYmplY3QqIGZ1bmN0aW9uX3BpbmJvYXJkOwoKICAgIC8qIGEgZGljdGlvbmFyeSBvZiByZWdpc3RlcmVkIGNvbGxhdGlvbiBuYW1lID0+IGNvbGxhdGlvbiBjYWxsYWJsZSBtYXBwaW5ncyAqLwogICAgUHlPYmplY3QqIGNvbGxhdGlvbnM7CgogICAgLyogaWYgb3VyIGNvbm5lY3Rpb24gd2FzIGNyZWF0ZWQgZnJvbSBhbiBBUFNXIGNvbm5lY3Rpb24sIHdlIGtlZXAgYQogICAgICogcmVmZXJlbmNlIHRvIHRoZSBBUFNXIGNvbm5lY3Rpb24gYXJvdW5kIGFuZCBnZXQgcmlkIG9mIGl0IGluIG91cgogICAgICogZGVzdHJ1Y3RvciAqLwogICAgUHlPYmplY3QqIGFwc3dfY29ubmVjdGlvbjsKCiAgICAvKiBFeGNlcHRpb24gb2JqZWN0cyAqLwogICAgUHlPYmplY3QqIFdhcm5pbmc7CiAgICBQeU9iamVjdCogRXJyb3I7CiAgICBQeU9iamVjdCogSW50ZXJmYWNlRXJyb3I7CiAgICBQeU9iamVjdCogRGF0YWJhc2VFcnJvcjsKICAgIFB5T2JqZWN0KiBEYXRhRXJyb3I7CiAgICBQeU9iamVjdCogT3BlcmF0aW9uYWxFcnJvcjsKICAgIFB5T2JqZWN0KiBJbnRlZ3JpdHlFcnJvcjsKICAgIFB5T2JqZWN0KiBJbnRlcm5hbEVycm9yOwogICAgUHlPYmplY3QqIFByb2dyYW1taW5nRXJyb3I7CiAgICBQeU9iamVjdCogTm90U3VwcG9ydGVkRXJyb3I7Cn0gcHlzcWxpdGVfQ29ubmVjdGlvbjsKCmV4dGVybiBQeVR5cGVPYmplY3QgcHlzcWxpdGVfQ29ubmVjdGlvblR5cGU7CgpQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9hbGxvYyhQeVR5cGVPYmplY3QqIHR5cGUsIGludCBhd2FyZSk7CnZvaWQgcHlzcWxpdGVfY29ubmVjdGlvbl9kZWFsbG9jKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYpOwpQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9jdXJzb3IocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpOwpQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9jbG9zZShweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncyk7ClB5T2JqZWN0KiBfcHlzcWxpdGVfY29ubmVjdGlvbl9iZWdpbihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmKTsKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fY29tbWl0KHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fcm9sbGJhY2socHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwpQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9uZXcoUHlUeXBlT2JqZWN0KiB0eXBlLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3KTsKaW50IHB5c3FsaXRlX2Nvbm5lY3Rpb25faW5pdChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7CgppbnQgcHlzcWxpdGVfY29ubmVjdGlvbl9yZWdpc3Rlcl9jdXJzb3IocHlzcWxpdGVfQ29ubmVjdGlvbiogY29ubmVjdGlvbiwgUHlPYmplY3QqIGN1cnNvcik7CmludCBweXNxbGl0ZV9jaGVja190aHJlYWQocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZik7CmludCBweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIGNvbik7CgppbnQgcHlzcWxpdGVfY29ubmVjdGlvbl9zZXR1cF90eXBlcyh2b2lkKTsKCiNlbmRpZgo=