LyogSW1wbGVtZW50YXRpb24gb2YgdGhlIFRSQU5TUE9TRSBpbnRyaW5zaWMKICAgQ29weXJpZ2h0IDIwMDMsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIENvbnRyaWJ1dGVkIGJ5IFRvYmlhcyBTY2hs/HRlcgoKVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBGb3J0cmFuIDk1IHJ1bnRpbWUgbGlicmFyeSAobGliZ2ZvcnRyYW4pLgoKTGliZ2ZvcnRyYW4gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKTGliZ2ZvcnRyYW4gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCnBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAphIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOwpzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KCiNpbmNsdWRlICJsaWJnZm9ydHJhbi5oIgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgoKI2lmIGRlZmluZWQgKEhBVkVfR0ZDX0lOVEVHRVJfNCkKCmV4dGVybiB2b2lkIHRyYW5zcG9zZV9pNCAoZ2ZjX2FycmF5X2k0ICogY29uc3QgcmVzdHJpY3QgcmV0LCAKCWdmY19hcnJheV9pNCAqIGNvbnN0IHJlc3RyaWN0IHNvdXJjZSk7CmV4cG9ydF9wcm90byh0cmFuc3Bvc2VfaTQpOwoKdm9pZAp0cmFuc3Bvc2VfaTQgKGdmY19hcnJheV9pNCAqIGNvbnN0IHJlc3RyaWN0IHJldCwgCglnZmNfYXJyYXlfaTQgKiBjb25zdCByZXN0cmljdCBzb3VyY2UpCnsKICAvKiByLiogaW5kaWNhdGVzIHRoZSByZXR1cm4gYXJyYXkuICAqLwogIGluZGV4X3R5cGUgcnhzdHJpZGUsIHJ5c3RyaWRlOwogIEdGQ19JTlRFR0VSXzQgKiByZXN0cmljdCBycHRyOwogIC8qIHMuKiBpbmRpY2F0ZXMgdGhlIHNvdXJjZSBhcnJheS4gICovCiAgaW5kZXhfdHlwZSBzeHN0cmlkZSwgc3lzdHJpZGU7CiAgY29uc3QgR0ZDX0lOVEVHRVJfNCAqc3B0cjsKCiAgaW5kZXhfdHlwZSB4Y291bnQsIHljb3VudDsKICBpbmRleF90eXBlIHgsIHk7CgogIGFzc2VydCAoR0ZDX0RFU0NSSVBUT1JfUkFOSyAoc291cmNlKSA9PSAyKTsKCiAgaWYgKHJldC0+ZGF0YSA9PSBOVUxMKQogICAgewogICAgICBhc3NlcnQgKEdGQ19ERVNDUklQVE9SX1JBTksgKHJldCkgPT0gMik7CiAgICAgIGFzc2VydCAocmV0LT5kdHlwZSA9PSBzb3VyY2UtPmR0eXBlKTsKCiAgICAgIEdGQ19ESU1FTlNJT05fU0VUKHJldC0+ZGltWzBdLCAwLCBHRkNfREVTQ1JJUFRPUl9FWFRFTlQoc291cmNlLDEpIC0gMSwKCQkJMSk7CgogICAgICBHRkNfRElNRU5TSU9OX1NFVChyZXQtPmRpbVsxXSwgMCwgR0ZDX0RFU0NSSVBUT1JfRVhURU5UKHNvdXJjZSwwKSAtIDEsCgkJCUdGQ19ERVNDUklQVE9SX0VYVEVOVChzb3VyY2UsIDEpKTsKCiAgICAgIHJldC0+ZGF0YSA9IGludGVybmFsX21hbGxvY19zaXplIChzaXplb2YgKEdGQ19JTlRFR0VSXzQpICogc2l6ZTAgKChhcnJheV90ICopIHJldCkpOwogICAgICByZXQtPm9mZnNldCA9IDA7CiAgICB9IGVsc2UgaWYgKHVubGlrZWx5IChjb21waWxlX29wdGlvbnMuYm91bmRzX2NoZWNrKSkKICAgIHsKICAgICAgaW5kZXhfdHlwZSByZXRfZXh0ZW50LCBzcmNfZXh0ZW50OwoKICAgICAgcmV0X2V4dGVudCA9IEdGQ19ERVNDUklQVE9SX0VYVEVOVChyZXQsMCk7CiAgICAgIHNyY19leHRlbnQgPSBHRkNfREVTQ1JJUFRPUl9FWFRFTlQoc291cmNlLDEpOwoKICAgICAgaWYgKHNyY19leHRlbnQgIT0gcmV0X2V4dGVudCkKCXJ1bnRpbWVfZXJyb3IgKCJJbmNvcnJlY3QgZXh0ZW50IGluIHJldHVybiB2YWx1ZSBvZiBUUkFOU1BPU0UiCgkJICAgICAgICIgaW50cmluc2ljIGluIGRpbWVuc2lvbiAxOiBpcyAlbGQsIgoJCSAgICAgICAiIHNob3VsZCBiZSAlbGQiLCAobG9uZyBpbnQpIHNyY19leHRlbnQsCgkJICAgICAgIChsb25nIGludCkgcmV0X2V4dGVudCk7CgogICAgICByZXRfZXh0ZW50ID0gR0ZDX0RFU0NSSVBUT1JfRVhURU5UKHJldCwxKTsKICAgICAgc3JjX2V4dGVudCA9IEdGQ19ERVNDUklQVE9SX0VYVEVOVChzb3VyY2UsMCk7CgogICAgICBpZiAoc3JjX2V4dGVudCAhPSByZXRfZXh0ZW50KQoJcnVudGltZV9lcnJvciAoIkluY29ycmVjdCBleHRlbnQgaW4gcmV0dXJuIHZhbHVlIG9mIFRSQU5TUE9TRSIKCQkgICAgICAgIiBpbnRyaW5zaWMgaW4gZGltZW5zaW9uIDI6IGlzICVsZCwiCgkJICAgICAgICIgc2hvdWxkIGJlICVsZCIsIChsb25nIGludCkgc3JjX2V4dGVudCwKCQkgICAgICAgKGxvbmcgaW50KSByZXRfZXh0ZW50KTsKCiAgICB9CgogIHN4c3RyaWRlID0gR0ZDX0RFU0NSSVBUT1JfU1RSSURFKHNvdXJjZSwwKTsKICBzeXN0cmlkZSA9IEdGQ19ERVNDUklQVE9SX1NUUklERShzb3VyY2UsMSk7CiAgeGNvdW50ID0gR0ZDX0RFU0NSSVBUT1JfRVhURU5UKHNvdXJjZSwwKTsKICB5Y291bnQgPSBHRkNfREVTQ1JJUFRPUl9FWFRFTlQoc291cmNlLDEpOwoKICByeHN0cmlkZSA9IEdGQ19ERVNDUklQVE9SX1NUUklERShyZXQsMCk7CiAgcnlzdHJpZGUgPSBHRkNfREVTQ1JJUFRPUl9TVFJJREUocmV0LDEpOwoKICBycHRyID0gcmV0LT5kYXRhOwogIHNwdHIgPSBzb3VyY2UtPmRhdGE7CgogIGZvciAoeT0wOyB5IDwgeWNvdW50OyB5KyspCiAgICB7CiAgICAgIGZvciAoeD0wOyB4IDwgeGNvdW50OyB4KyspCiAgICAgICAgewogICAgICAgICAgKnJwdHIgPSAqc3B0cjsKCiAgICAgICAgICBzcHRyICs9IHN4c3RyaWRlOwogICAgICAgICAgcnB0ciArPSByeXN0cmlkZTsKICAgICAgICB9CiAgICAgICAgc3B0ciArPSBzeXN0cmlkZSAtIChzeHN0cmlkZSAqIHhjb3VudCk7CiAgICAgICAgcnB0ciArPSByeHN0cmlkZSAtIChyeXN0cmlkZSAqIHhjb3VudCk7CiAgICB9Cn0KCiNlbmRpZgo=