LyoKICogUi9PIChWKUZBVCAxMi8xNi8zMiBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9uIGJ5IE1hcmN1cyBTdW5kYmVyZwogKgogKiAyMDAyLTA3LTI4IC0gcmpvbmVzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHBwY2Jvb3QgdjEuMS42CiAqIDIwMDMtMDMtMTAgLSBraGFycmlzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHUtYm9vdAogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKgogKi8KCiNpZm5kZWYgX0ZBVF9IXwojZGVmaW5lIF9GQVRfSF8KCiNkZWZpbmUgQ09ORklHX1NVUFBPUlRfVkZBVAoKI2RlZmluZSBTRUNUT1JfU0laRSBGU19CTE9DS19TSVpFCgojZGVmaW5lIEZTX0JMT0NLX1NJWkUgNTEyCgojaWYgRlNfQkxPQ0tfU0laRSAhPSBTRUNUT1JfU0laRQojZXJyb3IgRlNfQkxPQ0tfU0laRSAhPSBTRUNUT1JfU0laRSAtIFRoaXMgY29kZSBuZWVkcyB0byBiZSBmaXhlZCEKI2VuZGlmCgojZGVmaW5lIE1BWF9DTFVTVFNJWkUJNjU1MzYKI2RlZmluZSBESVJFTlRTUEVSQkxPQ0sJKEZTX0JMT0NLX1NJWkUvc2l6ZW9mKGRpcl9lbnRyeSkpCiNkZWZpbmUgRElSRU5UU1BFUkNMVVNUCSgobXlkYXRhLT5jbHVzdF9zaXplKlNFQ1RPUl9TSVpFKS9zaXplb2YoZGlyX2VudHJ5KSkKCiNkZWZpbmUgRkFUQlVGQkxPQ0tTCTYKI2RlZmluZSBGQVRCVUZTSVpFCShGU19CTE9DS19TSVpFKkZBVEJVRkJMT0NLUykKI2RlZmluZSBGQVQxMkJVRlNJWkUJKChGQVRCVUZTSVpFKjIpLzMpCiNkZWZpbmUgRkFUMTZCVUZTSVpFCShGQVRCVUZTSVpFLzIpCiNkZWZpbmUgRkFUMzJCVUZTSVpFCShGQVRCVUZTSVpFLzQpCgoKLyogRmlsZXN5c3RlbSBpZGVudGlmaWVycyAqLwojZGVmaW5lIEZBVDEyX1NJR04JIkZBVDEyICAgIgojZGVmaW5lIEZBVDE2X1NJR04JIkZBVDE2ICAgIgojZGVmaW5lIEZBVDMyX1NJR04JIkZBVDMyICAgIgojZGVmaW5lIFNJR05MRU4JCTgKCi8qIEZpbGUgYXR0cmlidXRlcyAqLwojZGVmaW5lIEFUVFJfUk8gICAgICAxCiNkZWZpbmUgQVRUUl9ISURERU4gIDIKI2RlZmluZSBBVFRSX1NZUyAgICAgNAojZGVmaW5lIEFUVFJfVk9MVU1FICA4CiNkZWZpbmUgQVRUUl9ESVIgICAgIDE2CiNkZWZpbmUgQVRUUl9BUkNIICAgIDMyCgojZGVmaW5lIEFUVFJfVkZBVCAgICAgKEFUVFJfUk8gfCBBVFRSX0hJRERFTiB8IEFUVFJfU1lTIHwgQVRUUl9WT0xVTUUpCgojZGVmaW5lIERFTEVURURfRkxBRwkoKGNoYXIpMHhlNSkgLyogTWFya3MgZGVsZXRlZCBmaWxlcyB3aGVuIGluIG5hbWVbMF0gKi8KI2RlZmluZSBhUklORwkJMHgwNQkgICAgIC8qIFVzZWQgdG8gcmVwcmVzZW50ICflJyBpbiBuYW1lWzBdICovCgovKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZW50cnkgaXMgdGhlIGxhc3QgbG9uZyBlbnRyeSBpbiBhIHNldCBvZiBsb25nCiAqIGRpciBlbnRyaWVzCiAqLwojZGVmaW5lIExBU1RfTE9OR19FTlRSWV9NQVNLCTB4NDAKCi8qIEZsYWdzIHRlbGxpbmcgd2hldGhlciB3ZSBzaG91bGQgcmVhZCBhIGZpbGUgb3IgbGlzdCBhIGRpcmVjdG9yeSAqLwojZGVmaW5lIExTX05PCTAKI2RlZmluZSBMU19ZRVMJMQojZGVmaW5lIExTX0RJUgkxCiNkZWZpbmUgTFNfUk9PVAkyCgojaWZkZWYgREVCVUcKI2RlZmluZSBGQVRfRFBSSU5UKGFyZ3MuLi4pCXByaW50ZihhcmdzKQojZWxzZQojZGVmaW5lIEZBVF9EUFJJTlQoYXJncy4uLikKI2VuZGlmCiNkZWZpbmUgRkFUX0VSUk9SKGFyZykJCXByaW50ZihhcmcpCgojZGVmaW5lIElTRElSREVMSU0oYykgICAoKGMpID09ICcvJyB8fCAoYykgPT0gJ1xcJykKCiNkZWZpbmUgRlNUWVBFX05PTkUJKC0xKQoKI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCiNkZWZpbmUgRkFUMkNQVTE2CWxlMTZfdG9fY3B1CiNkZWZpbmUgRkFUMkNQVTMyCWxlMzJfdG9fY3B1CiNlbHNlCiNpZiBfX0xJVFRMRV9FTkRJQU4KI2RlZmluZSBGQVQyQ1BVMTYoeCkJKHgpCiNkZWZpbmUgRkFUMkNQVTMyKHgpCSh4KQojZWxzZQojZGVmaW5lIEZBVDJDUFUxNih4KQkoKCgoeCkgJiAweDAwZmYpIDw8IDgpIHwgKCgoeCkgJiAweGZmMDApID4+IDgpKQojZGVmaW5lIEZBVDJDUFUzMih4KQkoKCgoeCkgJiAweDAwMDAwMGZmKSA8PCAyNCkgIHwJXAoJIAkJICgoKHgpICYgMHgwMDAwZmYwMCkgPDwgOCkgIHwJXAoJCQkgKCgoeCkgJiAweDAwZmYwMDAwKSA+PiA4KSAgfAlcCgkJCSAoKCh4KSAmIDB4ZmYwMDAwMDApID4+IDI0KSkKI2VuZGlmCiNlbmRpZgoKI2RlZmluZSBUT0xPV0VSKGMpCWlmKChjKSA+PSAnQScgJiYgKGMpIDw9ICdaJyl7KGMpKz0oJ2EnIC0gJ0EnKTt9CiNkZWZpbmUgU1RBUlQoZGVudCkJKEZBVDJDUFUxNigoZGVudCktPnN0YXJ0KSBcCgkJCSsgKG15ZGF0YS0+ZmF0c2l6ZSAhPSAzMiA/IDAgOiBcCgkJCSAgKEZBVDJDUFUxNigoZGVudCktPnN0YXJ0aGkpIDw8IDE2KSkpCgoKdHlwZWRlZiBzdHJ1Y3QgYm9vdF9zZWN0b3IgewoJX191OAlpZ25vcmVkWzNdOwkvKiBCb290c3RyYXAgY29kZSAqLwoJY2hhcglzeXN0ZW1faWRbOF07CS8qIE5hbWUgb2YgZnMgKi8KCV9fdTgJc2VjdG9yX3NpemVbMl07CS8qIEJ5dGVzL3NlY3RvciAqLwoJX191OAljbHVzdGVyX3NpemU7CS8qIFNlY3RvcnMvY2x1c3RlciAqLwoJX191MTYJcmVzZXJ2ZWQ7CS8qIE51bWJlciBvZiByZXNlcnZlZCBzZWN0b3JzICovCglfX3U4CWZhdHM7CQkvKiBOdW1iZXIgb2YgRkFUcyAqLwoJX191OAlkaXJfZW50cmllc1syXTsJLyogTnVtYmVyIG9mIHJvb3QgZGlyZWN0b3J5IGVudHJpZXMgKi8KCV9fdTgJc2VjdG9yc1syXTsJLyogTnVtYmVyIG9mIHNlY3RvcnMgKi8KCV9fdTgJbWVkaWE7CQkvKiBNZWRpYSBjb2RlICovCglfX3UxNglmYXRfbGVuZ3RoOwkvKiBTZWN0b3JzL0ZBVCAqLwoJX191MTYJc2Vjc190cmFjazsJLyogU2VjdG9ycy90cmFjayAqLwoJX191MTYJaGVhZHM7CQkvKiBOdW1iZXIgb2YgaGVhZHMgKi8KCV9fdTMyCWhpZGRlbjsJCS8qIE51bWJlciBvZiBoaWRkZW4gc2VjdG9ycyAqLwoJX191MzIJdG90YWxfc2VjdDsJLyogTnVtYmVyIG9mIHNlY3RvcnMgKGlmIHNlY3RvcnMgPT0gMCkgKi8KCgkvKiBGQVQzMiBvbmx5ICovCglfX3UzMglmYXQzMl9sZW5ndGg7CS8qIFNlY3RvcnMvRkFUICovCglfX3UxNglmbGFnczsJCS8qIEJpdCA4OiBmYXQgbWlycm9yaW5nLCBsb3cgNDogYWN0aXZlIGZhdCAqLwoJX191OAl2ZXJzaW9uWzJdOwkvKiBGaWxlc3lzdGVtIHZlcnNpb24gKi8KCV9fdTMyCXJvb3RfY2x1c3RlcjsJLyogRmlyc3QgY2x1c3RlciBpbiByb290IGRpcmVjdG9yeSAqLwoJX191MTYJaW5mb19zZWN0b3I7CS8qIEZpbGVzeXN0ZW0gaW5mbyBzZWN0b3IgKi8KCV9fdTE2CWJhY2t1cF9ib290OwkvKiBCYWNrdXAgYm9vdCBzZWN0b3IgKi8KCV9fdTE2CXJlc2VydmVkMls2XTsJLyogVW51c2VkICovCn0gYm9vdF9zZWN0b3I7Cgp0eXBlZGVmIHN0cnVjdCB2b2x1bWVfaW5mbwp7CglfX3U4IGRyaXZlX251bWJlcjsJLyogQklPUyBkcml2ZSBudW1iZXIgKi8KCV9fdTggcmVzZXJ2ZWQ7CQkvKiBVbnVzZWQgKi8KCV9fdTggZXh0X2Jvb3Rfc2lnbjsJLyogMHgyOSBpZiBmaWVsZHMgYmVsb3cgZXhpc3QgKERPUyAzLjMrKSAqLwoJX191OCB2b2x1bWVfaWRbNF07CS8qIFZvbHVtZSBJRCBudW1iZXIgKi8KCWNoYXIgdm9sdW1lX2xhYmVsWzExXTsJLyogVm9sdW1lIGxhYmVsICovCgljaGFyIGZzX3R5cGVbOF07CS8qIFR5cGljYWxseSBGQVQxMiwgRkFUMTYsIG9yIEZBVDMyICovCgkvKiBCb290IGNvZGUgY29tZXMgbmV4dCwgYWxsIGJ1dCAyIGJ5dGVzIHRvIGZpbGwgdXAgc2VjdG9yICovCgkvKiBCb290IHNpZ24gY29tZXMgbGFzdCwgMiBieXRlcyAqLwp9IHZvbHVtZV9pbmZvOwoKdHlwZWRlZiBzdHJ1Y3QgZGlyX2VudHJ5IHsKCWNoYXIJbmFtZVs4XSxleHRbM107CS8qIE5hbWUgYW5kIGV4dGVuc2lvbiAqLwoJX191OAlhdHRyOwkJLyogQXR0cmlidXRlIGJpdHMgKi8KCV9fdTgJbGNhc2U7CQkvKiBDYXNlIGZvciBiYXNlIGFuZCBleHRlbnNpb24gKi8KCV9fdTgJY3RpbWVfbXM7CS8qIENyZWF0aW9uIHRpbWUsIG1pbGxpc2Vjb25kcyAqLwoJX191MTYJY3RpbWU7CQkvKiBDcmVhdGlvbiB0aW1lICovCglfX3UxNgljZGF0ZTsJCS8qIENyZWF0aW9uIGRhdGUgKi8KCV9fdTE2CWFkYXRlOwkJLyogTGFzdCBhY2Nlc3MgZGF0ZSAqLwoJX191MTYJc3RhcnRoaTsJLyogSGlnaCAxNiBiaXRzIG9mIGNsdXN0ZXIgaW4gRkFUMzIgKi8KCV9fdTE2CXRpbWUsZGF0ZSxzdGFydDsvKiBUaW1lLCBkYXRlIGFuZCBmaXJzdCBjbHVzdGVyICovCglfX3UzMglzaXplOwkJLyogRmlsZSBzaXplIGluIGJ5dGVzICovCn0gZGlyX2VudHJ5OwoKdHlwZWRlZiBzdHJ1Y3QgZGlyX3Nsb3QgewoJX191OCAgICBpZDsJCS8qIFNlcXVlbmNlIG51bWJlciBmb3Igc2xvdCAqLwoJX191OCAgICBuYW1lMF80WzEwXTsJLyogRmlyc3QgNSBjaGFyYWN0ZXJzIGluIG5hbWUgKi8KCV9fdTggICAgYXR0cjsJCS8qIEF0dHJpYnV0ZSBieXRlICovCglfX3U4ICAgIHJlc2VydmVkOwkvKiBVbnVzZWQgKi8KCV9fdTggICAgYWxpYXNfY2hlY2tzdW07LyogQ2hlY2tzdW0gZm9yIDguMyBhbGlhcyAqLwoJX191OCAgICBuYW1lNV8xMFsxMl07CS8qIDYgbW9yZSBjaGFyYWN0ZXJzIGluIG5hbWUgKi8KCV9fdTE2ICAgc3RhcnQ7CQkvKiBVbnVzZWQgKi8KCV9fdTggICAgbmFtZTExXzEyWzRdOwkvKiBMYXN0IDIgY2hhcmFjdGVycyBpbiBuYW1lICovCn0gZGlyX3Nsb3Q7CgovKiBQcml2YXRlIGZpbGVzeXN0ZW0gcGFyYW1ldGVycyAqLwp0eXBlZGVmIHN0cnVjdCB7CglpbnQJZmF0c2l6ZTsJLyogU2l6ZSBvZiBGQVQgaW4gYml0cyAqLwoJX191MTYJZmF0bGVuZ3RoOwkvKiBMZW5ndGggb2YgRkFUIGluIHNlY3RvcnMgKi8KCV9fdTE2CWZhdF9zZWN0OwkvKiBTdGFydGluZyBzZWN0b3Igb2YgdGhlIEZBVCAqLwoJX191MTYJcm9vdGRpcl9zZWN0OwkvKiBTdGFydCBzZWN0b3Igb2Ygcm9vdCBkaXJlY3RvcnkgKi8KCV9fdTE2CWNsdXN0X3NpemU7CS8qIFNpemUgb2YgY2x1c3RlcnMgaW4gc2VjdG9ycyAqLwoJc2hvcnQJZGF0YV9iZWdpbjsJLyogVGhlIHNlY3RvciBvZiB0aGUgZmlyc3QgY2x1c3RlciwgY2FuIGJlIG5lZ2F0aXZlICovCglfX3U4CWZhdGJ1ZltGQVRCVUZTSVpFXTsgLyogQ3VycmVudCBGQVQgYnVmZmVyICovCglpbnQJZmF0YnVmbnVtOwkvKiBVc2VkIGJ5IGdldF9mYXRlbnQsIGluaXQgdG8gLTEgKi8KfSBmc2RhdGE7Cgp0eXBlZGVmIGludAkoZmlsZV9kZXRlY3Rmc19mdW5jKSh2b2lkKTsKdHlwZWRlZiBpbnQJKGZpbGVfbHNfZnVuYykoY29uc3QgY2hhciAqZGlyKTsKdHlwZWRlZiBsb25nCShmaWxlX3JlYWRfZnVuYykoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZmZlciwKCQkJCSB1bnNpZ25lZCBsb25nIG1heHNpemUpOwoKc3RydWN0IGZpbGVzeXN0ZW0gewoJZmlsZV9kZXRlY3Rmc19mdW5jICpkZXRlY3Q7CglmaWxlX2xzX2Z1bmMJICAgKmxzOwoJZmlsZV9yZWFkX2Z1bmMJICAgKnJlYWQ7Cgljb25zdCBjaGFyCSAgICBuYW1lWzEyXTsKfTsKCi8qIEZBVCB0YWJsZXMgKi8KZmlsZV9kZXRlY3Rmc19mdW5jCWZpbGVfZmF0X2RldGVjdGZzOwpmaWxlX2xzX2Z1bmMJCWZpbGVfZmF0X2xzOwpmaWxlX3JlYWRfZnVuYwkJZmlsZV9mYXRfcmVhZDsKCi8qIEN1cnJlbnRseSB0aGlzIGRvZXNuJ3QgY2hlY2sgaWYgdGhlIGRpciBleGlzdHMgb3IgaXMgdmFsaWQuLi4gKi8KaW50IGZpbGVfY2QoY29uc3QgY2hhciAqcGF0aCk7CmludCBmaWxlX2ZhdF9kZXRlY3Rmcyh2b2lkKTsKaW50IGZpbGVfZmF0X2xzKGNvbnN0IGNoYXIgKmRpcik7CmxvbmcgZmlsZV9mYXRfcmVhZChjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIG1heHNpemUpOwpjb25zdCBjaGFyICpmaWxlX2dldGZzbmFtZShpbnQgaWR4KTsKaW50IGZhdF9yZWdpc3Rlcl9kZXZpY2UoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MsIGludCBwYXJ0X25vKTsKCiNpZmRlZiBDT05GSUdfUFhBMjUwCiN1bmRlZiBGQVQyQ1BVMTYKI2RlZmluZSBGQVQyQ1BVMTYoeCkgeAojdW5kZWYgRkFUMkNQVTMyCiNkZWZpbmUgRkFUMkNQVTMyKHgpIHgKI2VuZGlmCgojZW5kaWYgLyogX0ZBVF9IXyAqLwo=