LyoKICogUi9PIChWKUZBVCAxMi8xNi8zMiBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9uIGJ5IE1hcmN1cyBTdW5kYmVyZwogKgogKiAyMDAyLTA3LTI4IC0gcmpvbmVzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHBwY2Jvb3QgdjEuMS42CiAqIDIwMDMtMDMtMTAgLSBraGFycmlzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHUtYm9vdAogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKgogKi8KCiNpZm5kZWYgX0ZBVF9IXwojZGVmaW5lIF9GQVRfSF8KCiNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CgojZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKCiNkZWZpbmUgU0VDVE9SX1NJWkUgRlNfQkxPQ0tfU0laRQoKI2RlZmluZSBGU19CTE9DS19TSVpFIDUxMgoKI2lmIEZTX0JMT0NLX1NJWkUgIT0gU0VDVE9SX1NJWkUKI2Vycm9yIEZTX0JMT0NLX1NJWkUgIT0gU0VDVE9SX1NJWkUgLSBUaGlzIGNvZGUgbmVlZHMgdG8gYmUgZml4ZWQhCiNlbmRpZgoKI2RlZmluZSBNQVhfQ0xVU1RTSVpFCTY1NTM2CiNkZWZpbmUgRElSRU5UU1BFUkJMT0NLCShGU19CTE9DS19TSVpFL3NpemVvZihkaXJfZW50cnkpKQojZGVmaW5lIERJUkVOVFNQRVJDTFVTVAkoKG15ZGF0YS0+Y2x1c3Rfc2l6ZSpTRUNUT1JfU0laRSkvc2l6ZW9mKGRpcl9lbnRyeSkpCgojZGVmaW5lIEZBVEJVRkJMT0NLUwk2CiNkZWZpbmUgRkFUQlVGU0laRQkoRlNfQkxPQ0tfU0laRSpGQVRCVUZCTE9DS1MpCiNkZWZpbmUgRkFUMTJCVUZTSVpFCSgoRkFUQlVGU0laRSoyKS8zKQojZGVmaW5lIEZBVDE2QlVGU0laRQkoRkFUQlVGU0laRS8yKQojZGVmaW5lIEZBVDMyQlVGU0laRQkoRkFUQlVGU0laRS80KQoKCi8qIEZpbGVzeXN0ZW0gaWRlbnRpZmllcnMgKi8KI2RlZmluZSBGQVQxMl9TSUdOCSJGQVQxMiAgICIKI2RlZmluZSBGQVQxNl9TSUdOCSJGQVQxNiAgICIKI2RlZmluZSBGQVQzMl9TSUdOCSJGQVQzMiAgICIKI2RlZmluZSBTSUdOTEVOCQk4CgovKiBGaWxlIGF0dHJpYnV0ZXMgKi8KI2RlZmluZSBBVFRSX1JPICAgICAgMQojZGVmaW5lIEFUVFJfSElEREVOICAyCiNkZWZpbmUgQVRUUl9TWVMgICAgIDQKI2RlZmluZSBBVFRSX1ZPTFVNRSAgOAojZGVmaW5lIEFUVFJfRElSICAgICAxNgojZGVmaW5lIEFUVFJfQVJDSCAgICAzMgoKI2RlZmluZSBBVFRSX1ZGQVQgICAgIChBVFRSX1JPIHwgQVRUUl9ISURERU4gfCBBVFRSX1NZUyB8IEFUVFJfVk9MVU1FKQoKI2RlZmluZSBERUxFVEVEX0ZMQUcJKChjaGFyKTB4ZTUpIC8qIE1hcmtzIGRlbGV0ZWQgZmlsZXMgd2hlbiBpbiBuYW1lWzBdICovCiNkZWZpbmUgYVJJTkcJCTB4MDUJICAgICAvKiBVc2VkIHRvIHJlcHJlc2VudCAn5ScgaW4gbmFtZVswXSAqLwoKLyogSW5kaWNhdGVzIHRoYXQgdGhlIGVudHJ5IGlzIHRoZSBsYXN0IGxvbmcgZW50cnkgaW4gYSBzZXQgb2YgbG9uZwogKiBkaXIgZW50cmllcwogKi8KI2RlZmluZSBMQVNUX0xPTkdfRU5UUllfTUFTSwkweDQwCgovKiBGbGFncyB0ZWxsaW5nIHdoZXRoZXIgd2Ugc2hvdWxkIHJlYWQgYSBmaWxlIG9yIGxpc3QgYSBkaXJlY3RvcnkgKi8KI2RlZmluZSBMU19OTwkwCiNkZWZpbmUgTFNfWUVTCTEKI2RlZmluZSBMU19ESVIJMQojZGVmaW5lIExTX1JPT1QJMgoKI2lmZGVmIERFQlVHCiNkZWZpbmUgRkFUX0RQUklOVChhcmdzLi4uKQlwcmludGYoYXJncykKI2Vsc2UKI2RlZmluZSBGQVRfRFBSSU5UKGFyZ3MuLi4pCiNlbmRpZgojZGVmaW5lIEZBVF9FUlJPUihhcmcpCQlwcmludGYoYXJnKQoKI2RlZmluZSBJU0RJUkRFTElNKGMpICAgKChjKSA9PSAnLycgfHwgKGMpID09ICdcXCcpCgojZGVmaW5lIEZTVFlQRV9OT05FCSgtMSkKCiNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQojZGVmaW5lIEZBVDJDUFUxNglsZTE2X3RvX2NwdQojZGVmaW5lIEZBVDJDUFUzMglsZTMyX3RvX2NwdQojZWxzZQojaWYgX19MSVRUTEVfRU5ESUFOCiNkZWZpbmUgRkFUMkNQVTE2KHgpCSh4KQojZGVmaW5lIEZBVDJDUFUzMih4KQkoeCkKI2Vsc2UKI2RlZmluZSBGQVQyQ1BVMTYoeCkJKCgoKHgpICYgMHgwMGZmKSA8PCA4KSB8ICgoKHgpICYgMHhmZjAwKSA+PiA4KSkKI2RlZmluZSBGQVQyQ1BVMzIoeCkJKCgoKHgpICYgMHgwMDAwMDBmZikgPDwgMjQpICB8CVwKCSAJCSAoKCh4KSAmIDB4MDAwMGZmMDApIDw8IDgpICB8CVwKCQkJICgoKHgpICYgMHgwMGZmMDAwMCkgPj4gOCkgIHwJXAoJCQkgKCgoeCkgJiAweGZmMDAwMDAwKSA+PiAyNCkpCiNlbmRpZgojZW5kaWYKCiNkZWZpbmUgVE9MT1dFUihjKQlpZigoYykgPj0gJ0EnICYmIChjKSA8PSAnWicpeyhjKSs9KCdhJyAtICdBJyk7fQojZGVmaW5lIFNUQVJUKGRlbnQpCShGQVQyQ1BVMTYoKGRlbnQpLT5zdGFydCkgXAoJCQkrIChteWRhdGEtPmZhdHNpemUgIT0gMzIgPyAwIDogXAoJCQkgIChGQVQyQ1BVMTYoKGRlbnQpLT5zdGFydGhpKSA8PCAxNikpKQoKCnR5cGVkZWYgc3RydWN0IGJvb3Rfc2VjdG9yIHsKCV9fdTgJaWdub3JlZFszXTsJLyogQm9vdHN0cmFwIGNvZGUgKi8KCWNoYXIJc3lzdGVtX2lkWzhdOwkvKiBOYW1lIG9mIGZzICovCglfX3U4CXNlY3Rvcl9zaXplWzJdOwkvKiBCeXRlcy9zZWN0b3IgKi8KCV9fdTgJY2x1c3Rlcl9zaXplOwkvKiBTZWN0b3JzL2NsdXN0ZXIgKi8KCV9fdTE2CXJlc2VydmVkOwkvKiBOdW1iZXIgb2YgcmVzZXJ2ZWQgc2VjdG9ycyAqLwoJX191OAlmYXRzOwkJLyogTnVtYmVyIG9mIEZBVHMgKi8KCV9fdTgJZGlyX2VudHJpZXNbMl07CS8qIE51bWJlciBvZiByb290IGRpcmVjdG9yeSBlbnRyaWVzICovCglfX3U4CXNlY3RvcnNbMl07CS8qIE51bWJlciBvZiBzZWN0b3JzICovCglfX3U4CW1lZGlhOwkJLyogTWVkaWEgY29kZSAqLwoJX191MTYJZmF0X2xlbmd0aDsJLyogU2VjdG9ycy9GQVQgKi8KCV9fdTE2CXNlY3NfdHJhY2s7CS8qIFNlY3RvcnMvdHJhY2sgKi8KCV9fdTE2CWhlYWRzOwkJLyogTnVtYmVyIG9mIGhlYWRzICovCglfX3UzMgloaWRkZW47CQkvKiBOdW1iZXIgb2YgaGlkZGVuIHNlY3RvcnMgKi8KCV9fdTMyCXRvdGFsX3NlY3Q7CS8qIE51bWJlciBvZiBzZWN0b3JzIChpZiBzZWN0b3JzID09IDApICovCgoJLyogRkFUMzIgb25seSAqLwoJX191MzIJZmF0MzJfbGVuZ3RoOwkvKiBTZWN0b3JzL0ZBVCAqLwoJX191MTYJZmxhZ3M7CQkvKiBCaXQgODogZmF0IG1pcnJvcmluZywgbG93IDQ6IGFjdGl2ZSBmYXQgKi8KCV9fdTgJdmVyc2lvblsyXTsJLyogRmlsZXN5c3RlbSB2ZXJzaW9uICovCglfX3UzMglyb290X2NsdXN0ZXI7CS8qIEZpcnN0IGNsdXN0ZXIgaW4gcm9vdCBkaXJlY3RvcnkgKi8KCV9fdTE2CWluZm9fc2VjdG9yOwkvKiBGaWxlc3lzdGVtIGluZm8gc2VjdG9yICovCglfX3UxNgliYWNrdXBfYm9vdDsJLyogQmFja3VwIGJvb3Qgc2VjdG9yICovCglfX3UxNglyZXNlcnZlZDJbNl07CS8qIFVudXNlZCAqLwp9IGJvb3Rfc2VjdG9yOwoKdHlwZWRlZiBzdHJ1Y3Qgdm9sdW1lX2luZm8KewoJX191OCBkcml2ZV9udW1iZXI7CS8qIEJJT1MgZHJpdmUgbnVtYmVyICovCglfX3U4IHJlc2VydmVkOwkJLyogVW51c2VkICovCglfX3U4IGV4dF9ib290X3NpZ247CS8qIDB4MjkgaWYgZmllbGRzIGJlbG93IGV4aXN0IChET1MgMy4zKykgKi8KCV9fdTggdm9sdW1lX2lkWzRdOwkvKiBWb2x1bWUgSUQgbnVtYmVyICovCgljaGFyIHZvbHVtZV9sYWJlbFsxMV07CS8qIFZvbHVtZSBsYWJlbCAqLwoJY2hhciBmc190eXBlWzhdOwkvKiBUeXBpY2FsbHkgRkFUMTIsIEZBVDE2LCBvciBGQVQzMiAqLwoJLyogQm9vdCBjb2RlIGNvbWVzIG5leHQsIGFsbCBidXQgMiBieXRlcyB0byBmaWxsIHVwIHNlY3RvciAqLwoJLyogQm9vdCBzaWduIGNvbWVzIGxhc3QsIDIgYnl0ZXMgKi8KfSB2b2x1bWVfaW5mbzsKCnR5cGVkZWYgc3RydWN0IGRpcl9lbnRyeSB7CgljaGFyCW5hbWVbOF0sZXh0WzNdOwkvKiBOYW1lIGFuZCBleHRlbnNpb24gKi8KCV9fdTgJYXR0cjsJCS8qIEF0dHJpYnV0ZSBiaXRzICovCglfX3U4CWxjYXNlOwkJLyogQ2FzZSBmb3IgYmFzZSBhbmQgZXh0ZW5zaW9uICovCglfX3U4CWN0aW1lX21zOwkvKiBDcmVhdGlvbiB0aW1lLCBtaWxsaXNlY29uZHMgKi8KCV9fdTE2CWN0aW1lOwkJLyogQ3JlYXRpb24gdGltZSAqLwoJX191MTYJY2RhdGU7CQkvKiBDcmVhdGlvbiBkYXRlICovCglfX3UxNglhZGF0ZTsJCS8qIExhc3QgYWNjZXNzIGRhdGUgKi8KCV9fdTE2CXN0YXJ0aGk7CS8qIEhpZ2ggMTYgYml0cyBvZiBjbHVzdGVyIGluIEZBVDMyICovCglfX3UxNgl0aW1lLGRhdGUsc3RhcnQ7LyogVGltZSwgZGF0ZSBhbmQgZmlyc3QgY2x1c3RlciAqLwoJX191MzIJc2l6ZTsJCS8qIEZpbGUgc2l6ZSBpbiBieXRlcyAqLwp9IGRpcl9lbnRyeTsKCnR5cGVkZWYgc3RydWN0IGRpcl9zbG90IHsKCV9fdTggICAgaWQ7CQkvKiBTZXF1ZW5jZSBudW1iZXIgZm9yIHNsb3QgKi8KCV9fdTggICAgbmFtZTBfNFsxMF07CS8qIEZpcnN0IDUgY2hhcmFjdGVycyBpbiBuYW1lICovCglfX3U4ICAgIGF0dHI7CQkvKiBBdHRyaWJ1dGUgYnl0ZSAqLwoJX191OCAgICByZXNlcnZlZDsJLyogVW51c2VkICovCglfX3U4ICAgIGFsaWFzX2NoZWNrc3VtOy8qIENoZWNrc3VtIGZvciA4LjMgYWxpYXMgKi8KCV9fdTggICAgbmFtZTVfMTBbMTJdOwkvKiA2IG1vcmUgY2hhcmFjdGVycyBpbiBuYW1lICovCglfX3UxNiAgIHN0YXJ0OwkJLyogVW51c2VkICovCglfX3U4ICAgIG5hbWUxMV8xMls0XTsJLyogTGFzdCAyIGNoYXJhY3RlcnMgaW4gbmFtZSAqLwp9IGRpcl9zbG90OwoKLyogUHJpdmF0ZSBmaWxlc3lzdGVtIHBhcmFtZXRlcnMgKi8KdHlwZWRlZiBzdHJ1Y3QgewoJaW50CWZhdHNpemU7CS8qIFNpemUgb2YgRkFUIGluIGJpdHMgKi8KCV9fdTE2CWZhdGxlbmd0aDsJLyogTGVuZ3RoIG9mIEZBVCBpbiBzZWN0b3JzICovCglfX3UxNglmYXRfc2VjdDsJLyogU3RhcnRpbmcgc2VjdG9yIG9mIHRoZSBGQVQgKi8KCV9fdTE2CXJvb3RkaXJfc2VjdDsJLyogU3RhcnQgc2VjdG9yIG9mIHJvb3QgZGlyZWN0b3J5ICovCglfX3UxNgljbHVzdF9zaXplOwkvKiBTaXplIG9mIGNsdXN0ZXJzIGluIHNlY3RvcnMgKi8KCXNob3J0CWRhdGFfYmVnaW47CS8qIFRoZSBzZWN0b3Igb2YgdGhlIGZpcnN0IGNsdXN0ZXIsIGNhbiBiZSBuZWdhdGl2ZSAqLwoJX191OAlmYXRidWZbRkFUQlVGU0laRV07IC8qIEN1cnJlbnQgRkFUIGJ1ZmZlciAqLwoJaW50CWZhdGJ1Zm51bTsJLyogVXNlZCBieSBnZXRfZmF0ZW50LCBpbml0IHRvIC0xICovCn0gZnNkYXRhOwoKdHlwZWRlZiBpbnQJKGZpbGVfZGV0ZWN0ZnNfZnVuYykodm9pZCk7CnR5cGVkZWYgaW50CShmaWxlX2xzX2Z1bmMpKGNvbnN0IGNoYXIgKmRpcik7CnR5cGVkZWYgbG9uZwkoZmlsZV9yZWFkX2Z1bmMpKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpidWZmZXIsCgkJCQkgdW5zaWduZWQgbG9uZyBtYXhzaXplKTsKCnN0cnVjdCBmaWxlc3lzdGVtIHsKCWZpbGVfZGV0ZWN0ZnNfZnVuYyAqZGV0ZWN0OwoJZmlsZV9sc19mdW5jCSAgICpsczsKCWZpbGVfcmVhZF9mdW5jCSAgICpyZWFkOwoJY29uc3QgY2hhcgkgICAgbmFtZVsxMl07Cn07CgovKiBGQVQgdGFibGVzICovCmZpbGVfZGV0ZWN0ZnNfZnVuYwlmaWxlX2ZhdF9kZXRlY3RmczsKZmlsZV9sc19mdW5jCQlmaWxlX2ZhdF9sczsKZmlsZV9yZWFkX2Z1bmMJCWZpbGVfZmF0X3JlYWQ7CgovKiBDdXJyZW50bHkgdGhpcyBkb2Vzbid0IGNoZWNrIGlmIHRoZSBkaXIgZXhpc3RzIG9yIGlzIHZhbGlkLi4uICovCmludCBmaWxlX2NkKGNvbnN0IGNoYXIgKnBhdGgpOwppbnQgZmlsZV9mYXRfZGV0ZWN0ZnModm9pZCk7CmludCBmaWxlX2ZhdF9scyhjb25zdCBjaGFyICpkaXIpOwpsb25nIGZpbGVfZmF0X3JlYWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBtYXhzaXplKTsKY29uc3QgY2hhciAqZmlsZV9nZXRmc25hbWUoaW50IGlkeCk7CmludCBmYXRfcmVnaXN0ZXJfZGV2aWNlKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjLCBpbnQgcGFydF9ubyk7CgojZW5kaWYgLyogX0ZBVF9IXyAqLwo=