LyoKICogRE9TIEVYRSBsb2FkZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX0RPU0VYRV9ICiNkZWZpbmUgX19XSU5FX0RPU0VYRV9ICgojaW5jbHVkZSA8c3RkYXJnLmg+CgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5lL2xpYnJhcnkuaCIKI2luY2x1ZGUgIndpbmUvd2luZGVmMTYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbm50LmgiICAgICAvKiBmb3IgUENPTlRFWFQgKi8KI2luY2x1ZGUgIndpbmNvbi5oIiAgICAvKiBmb3IgTU9VU0VfRVZFTlRfUkVDT1JEICovCgojZGVmaW5lIE1BWF9ET1NfRFJJVkVTICAyNgoKc3RydWN0IF9ET1NFVkVOVDsKCi8qIGFtb3VudCBvZiBzcGFjZSByZXNlcnZlZCBmb3IgcmVsYXkgc3RhY2sgKi8KI2RlZmluZSBET1NWTV9SRUxBWV9EQVRBX1NJWkUgNDA5NgoKLyogdmFyaW91cyByZWFsLW1vZGUgY29kZSBzdHVicyAqLwpzdHJ1Y3QgRFBNSV9zZWdtZW50cwp7CiAgICBXT1JEIHdyYXBfc2VnOwogICAgV09SRCB4bXNfc2VnOwogICAgV09SRCBkcG1pX3NlZzsKICAgIFdPUkQgZHBtaV9zZWw7CiAgICBXT1JEIGludDQ4X3NlbDsKICAgIFdPUkQgaW50MTZfc2VsOwogICAgV09SRCByZWxheV9jb2RlX3NlbDsKICAgIFdPUkQgcmVsYXlfZGF0YV9zZWw7Cn07CgovKiA0OC1iaXQgc2VnbWVudGVkIHBvaW50ZXJzIGZvciBET1MgRFBNSTMyICovCnR5cGVkZWYgc3RydWN0IHsKICBXT1JEICBzZWxlY3RvcjsKICBEV09SRCBvZmZzZXQ7Cn0gU0VHUFRSNDgsIEZBUlBST0M0ODsKCiNkZWZpbmUgRE9TQ09ORl9NRU1fSElHSCAgICAgICAgMHgwMDAxCiNkZWZpbmUgRE9TQ09ORl9NRU1fVU1CICAgICAgICAgMHgwMDAyCiNkZWZpbmUgRE9TQ09ORl9OVU1MT0NLICAgICAgICAgMHgwMDA0CiNkZWZpbmUgRE9TQ09ORl9LRVlCX0NPTlYgICAgICAgMHgwMDA4Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBjaGFyIGxhc3Rkcml2ZTsKICAgIGludCBicmtfZmxhZzsKICAgIGludCBmaWxlczsKICAgIGludCBzdGFja3NfbnI7CiAgICBpbnQgc3RhY2tzX3N6OwogICAgaW50IGJ1ZjsKICAgIGludCBidWYyOwogICAgaW50IGZjYnM7CiAgICBpbnQgZmxhZ3M7CiAgICBjaGFyICpzaGVsbDsKICAgIGNoYXIgKmNvdW50cnk7Cn0gRE9TQ09ORjsKCnR5cGVkZWYgdm9pZCAoKkRPU1JFTEFZKShDT05URVhUODYqLHZvaWQqKTsKdHlwZWRlZiB2b2lkIChXSU5BUEkgKlJNQ0JQUk9DKShDT05URVhUODYqKTsKdHlwZWRlZiB2b2lkIChXSU5BUEkgKklOVFBST0MpKENPTlRFWFQ4NiopOwoKI2RlZmluZSBET1NfUFJJT1JJVFlfUkVBTFRJTUUgMCAgLyogSVJRMCAqLwojZGVmaW5lIERPU19QUklPUklUWV9LRVlCT0FSRCAxICAvKiBJUlExICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1ZHQSAgICAgIDIgIC8qIElSUTkgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfTU9VU0UgICAgNSAgLyogSVJRMTIgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfU0VSSUFMICAgMTAgLyogSVJRNCAqLwoKZXh0ZXJuIFdPUkQgRE9TVk1fcHNwOyAgICAgLyogcHNwIG9mIGN1cnJlbnQgRE9TIHRhc2sgKi8KZXh0ZXJuIFdPUkQgRE9TVk1fcmV0dmFsOyAgLyogcmV0dXJuIHZhbHVlIG9mIHByZXZpb3VzIERPUyB0YXNrICovCmV4dGVybiBzdHJ1Y3QgRFBNSV9zZWdtZW50cyAqRE9TVk1fZHBtaV9zZWdtZW50czsKCiNpZiBkZWZpbmVkKGxpbnV4KSAmJiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBkZWZpbmVkKEhBVkVfU1lTX1ZNODZfSCkKIyBkZWZpbmUgTVpfU1VQUE9SVEVECiNlbmRpZiAvKiBsaW51eC1pMzg2ICovCgovKgogKiBEZWNsYXJlIHNvbWUgQ09OVEVYVDg2LkVGbGFncyBiaXRzLgogKiBJRl9NQVNLIGlzIG9ubHkgcHVzaGVkIGludG8gcmVhbCBtb2RlIHN0YWNrLgogKi8KI2RlZmluZSBWODZfRkxBRyAweDAwMDIwMDAwCiNkZWZpbmUgSUZfTUFTSyAgMHgwMDAwMDIwMAojZGVmaW5lIFZJRl9NQVNLIDB4MDAwODAwMDAKI2RlZmluZSBWSVBfTUFTSyAweDAwMTAwMDAwCgojZGVmaW5lIEFERF9MT1dPUkQoZHcsdmFsKSAgKChkdykgPSAoKGR3KSAmIDB4ZmZmZjAwMDApIHwgTE9XT1JEKChEV09SRCkoZHcpKyh2YWwpKSkKCiNkZWZpbmUgUFRSX1JFQUxfVE9fTElOKHNlZyxvZmYpICgodm9pZCopKCgodW5zaWduZWQgaW50KShzZWcpIDw8IDQpICsgTE9XT1JEKG9mZikpKQoKLyogTk9URTogSW50ZXJydXB0cyBtaWdodCBnZXQgY2FsbGVkIGZyb20gZm91ciBtb2RlczogcmVhbCBtb2RlLCAxNi1iaXQsCiAqICAgICAgIDMyLWJpdCBzZWdtZW50ZWQgKERQTUkzMikgYW5kIDMyLWJpdCBsaW5lYXIgKHZpYSBEZXZpY2VJb0NvbnRyb2wpLgogKiAgICAgICBGb3IgYXV0b21hdGljIGNvbnZlcnNpb24gb2YgcG9pbnRlcgogKiAgICAgICBwYXJhbWV0ZXJzLCBpbnRlcnJ1cHQgaGFuZGxlcnMgc2hvdWxkIHVzZSBDVFhfU0VHX09GRl9UT19MSU4gd2l0aAogKiAgICAgICB0aGUgY29udGVudHMgb2YgYSBzZWdtZW50IHJlZ2lzdGVyIGFzIHNlY29uZCBhbmQgdGhlIGNvbnRlbnRzIG9mCiAqICAgICAgIGEgKjMyLWJpdCogZ2VuZXJhbCByZWdpc3RlciBhcyB0aGlyZCBwYXJhbWV0ZXIsIGUuZy4KICogICAgICAgICAgQ1RYX1NFR19PRkZfVE9fTElOKCBjb250ZXh0LCBEU19yZWcoY29udGV4dCksIEVEWF9yZWcoY29udGV4dCkgKQogKiAgICAgICBUaGlzIHdpbGwgZ2VuZXJhdGUgYSBsaW5lYXIgcG9pbnRlciBpbiBhbGwgdGhyZWUgY2FzZXM6CiAqICAgICAgICAgUmVhbC1Nb2RlOiAgIFNlZyoxNiArIExPV09SRChPZmZzZXQpCiAqICAgICAgICAgMTYtYml0OiAgICAgIGNvbnZlcnQgKFNlZywgTE9XT1JEKE9mZnNldCkpIHRvIGxpbmVhcgogKiAgICAgICAgIDMyLWJpdCBzZWdtZW50ZWQ6IGNvbnZlcnQgKFNlZywgT2Zmc2V0KSB0byBsaW5lYXIKICogICAgICAgICAzMi1iaXQgbGluZWFyOiAgICB1c2UgT2Zmc2V0IGFzIGxpbmVhciBhZGRyZXNzIChEZXZpY2VJb0NvbnRyb2whKQogKgogKiAgICAgICBSZWFsLW1vZGUgaXMgcmVjb2duaXplZCBieSBjaGVja2luZyB0aGUgVjg2IGJpdCBpbiB0aGUgZmxhZ3MgcmVnaXN0ZXIsCiAqICAgICAgIDMyLWJpdCBsaW5lYXIgbW9kZSBpcyByZWNvZ25pemVkIGJ5IGNoZWNraW5nIHdoZXRoZXIgJ3NlZycgaXMKICogICAgICAgYSBzeXN0ZW0gc2VsZWN0b3IgKDAgY291bnRzIGFsc28gYXMgMzItYml0IHNlZ21lbnQpIGFuZCAzMi1iaXQKICogICAgICAgc2VnbWVudGVkIG1vZGUgaXMgcmVjb2duaXplZCBieSBjaGVja2luZyB3aGV0aGVyICdzZWcnIGlzIDMyLWJpdAogKiAgICAgICBzZWxlY3RvciB3aGljaCBpcyBuZWl0aGVyIHN5c3RlbSBzZWxlY3RvciBub3IgemVyby4KICovCiNkZWZpbmUgQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsc2VnLG9mZikgXAogICAgKElTVjg2KGNvbnRleHQpID8gUFRSX1JFQUxfVE9fTElOKChzZWcpLChvZmYpKSA6IHdpbmVfbGR0X2dldF9wdHIoKHNlZyksKG9mZikpKQoKI2RlZmluZSBJTlRfQkFSRihjb250ZXh0LG51bSkgXAogICAgRVJSKCAiaW50JXg6IHVua25vd24vbm90IGltcGxlbWVudGVkIHBhcmFtZXRlcnM6XG4iIFwKICAgICAgICAgICAgICAgICAgICAgImludCV4OiBBWCAlMDR4LCBCWCAlMDR4LCBDWCAlMDR4LCBEWCAlMDR4LCAiIFwKICAgICAgICAgICAgICAgICAgICAgIlNJICUwNHgsIERJICUwNHgsIERTICUwNHgsIEVTICUwNHhcbiIsIFwKICAgICAgICAgICAgIChudW0pLCAobnVtKSwgTE9XT1JEKChjb250ZXh0KS0+RWF4KSwgTE9XT1JEKChjb250ZXh0KS0+RWJ4KSwgXAogICAgICAgICAgICAgTE9XT1JEKChjb250ZXh0KS0+RWN4KSwgTE9XT1JEKChjb250ZXh0KS0+RWR4KSwgTE9XT1JEKChjb250ZXh0KS0+RXNpKSwgXAogICAgICAgICAgICAgTE9XT1JEKChjb250ZXh0KS0+RWRpKSwgKFdPUkQpKGNvbnRleHQpLT5TZWdEcywgKFdPUkQpKGNvbnRleHQpLT5TZWdFcyApCgovKiBwdXNoaW5nIG9uIHN0YWNrIGluIDE2IGJpdCBuZWVkcyBzZWdtZW50IHdyYXAgYXJvdW5kICovCiNkZWZpbmUgUFVTSF9XT1JEMTYoY29udGV4dCx2YWwpIFwKICAgICooKFdPUkQqKUNUWF9TRUdfT0ZGX1RPX0xJTigoY29udGV4dCksIFwKICAgICAgICAoY29udGV4dCktPlNlZ1NzLCBBRERfTE9XT1JEKCBjb250ZXh0LT5Fc3AsIC0yICkgKSkgPSAodmFsKQoKLyogTWFjcm9zIGZvciBlYXNpZXIgYWNjZXNzIHRvIGkzODYgY29udGV4dCByZWdpc3RlcnMgKi8KCiNkZWZpbmUgQVhfcmVnKGNvbnRleHQpICAgICAgKChXT1JEKShjb250ZXh0KS0+RWF4KQojZGVmaW5lIEJYX3JlZyhjb250ZXh0KSAgICAgICgoV09SRCkoY29udGV4dCktPkVieCkKI2RlZmluZSBDWF9yZWcoY29udGV4dCkgICAgICAoKFdPUkQpKGNvbnRleHQpLT5FY3gpCiNkZWZpbmUgRFhfcmVnKGNvbnRleHQpICAgICAgKChXT1JEKShjb250ZXh0KS0+RWR4KQojZGVmaW5lIFNJX3JlZyhjb250ZXh0KSAgICAgICgoV09SRCkoY29udGV4dCktPkVzaSkKI2RlZmluZSBESV9yZWcoY29udGV4dCkgICAgICAoKFdPUkQpKGNvbnRleHQpLT5FZGkpCgojZGVmaW5lIEFMX3JlZyhjb250ZXh0KSAgICAgICgoQllURSkoY29udGV4dCktPkVheCkKI2RlZmluZSBBSF9yZWcoY29udGV4dCkgICAgICAoKEJZVEUpKChjb250ZXh0KS0+RWF4ID4+IDgpKQojZGVmaW5lIEJMX3JlZyhjb250ZXh0KSAgICAgICgoQllURSkoY29udGV4dCktPkVieCkKI2RlZmluZSBCSF9yZWcoY29udGV4dCkgICAgICAoKEJZVEUpKChjb250ZXh0KS0+RWJ4ID4+IDgpKQojZGVmaW5lIENMX3JlZyhjb250ZXh0KSAgICAgICgoQllURSkoY29udGV4dCktPkVjeCkKI2RlZmluZSBDSF9yZWcoY29udGV4dCkgICAgICAoKEJZVEUpKChjb250ZXh0KS0+RWN4ID4+IDgpKQojZGVmaW5lIERMX3JlZyhjb250ZXh0KSAgICAgICgoQllURSkoY29udGV4dCktPkVkeCkKI2RlZmluZSBESF9yZWcoY29udGV4dCkgICAgICAoKEJZVEUpKChjb250ZXh0KS0+RWR4ID4+IDgpKQoKI2RlZmluZSBTRVRfQ0ZMQUcoY29udGV4dCkgICAoKGNvbnRleHQpLT5FRmxhZ3MgfD0gMHgwMDAxKQojZGVmaW5lIFJFU0VUX0NGTEFHKGNvbnRleHQpICgoY29udGV4dCktPkVGbGFncyAmPSB+MHgwMDAxKQojZGVmaW5lIFNFVF9aRkxBRyhjb250ZXh0KSAgICgoY29udGV4dCktPkVGbGFncyB8PSAweDAwNDApCiNkZWZpbmUgUkVTRVRfWkZMQUcoY29udGV4dCkgKChjb250ZXh0KS0+RUZsYWdzICY9IH4weDAwNDApCiNkZWZpbmUgSVNWODYoY29udGV4dCkgICAgICAgKChjb250ZXh0KS0+RUZsYWdzICYgMHgwMDAyMDAwMCkKCiNkZWZpbmUgU0VUX0FYKGNvbnRleHQsdmFsKSAgKCh2b2lkKSgoY29udGV4dCktPkVheCA9ICgoY29udGV4dCktPkVheCAmIH4weGZmZmYpIHwgKFdPUkQpKHZhbCkpKQojZGVmaW5lIFNFVF9CWChjb250ZXh0LHZhbCkgICgodm9pZCkoKGNvbnRleHQpLT5FYnggPSAoKGNvbnRleHQpLT5FYnggJiB+MHhmZmZmKSB8IChXT1JEKSh2YWwpKSkKI2RlZmluZSBTRVRfQ1goY29udGV4dCx2YWwpICAoKHZvaWQpKChjb250ZXh0KS0+RWN4ID0gKChjb250ZXh0KS0+RWN4ICYgfjB4ZmZmZikgfCAoV09SRCkodmFsKSkpCiNkZWZpbmUgU0VUX0RYKGNvbnRleHQsdmFsKSAgKCh2b2lkKSgoY29udGV4dCktPkVkeCA9ICgoY29udGV4dCktPkVkeCAmIH4weGZmZmYpIHwgKFdPUkQpKHZhbCkpKQojZGVmaW5lIFNFVF9TSShjb250ZXh0LHZhbCkgICgodm9pZCkoKGNvbnRleHQpLT5Fc2kgPSAoKGNvbnRleHQpLT5Fc2kgJiB+MHhmZmZmKSB8IChXT1JEKSh2YWwpKSkKI2RlZmluZSBTRVRfREkoY29udGV4dCx2YWwpICAoKHZvaWQpKChjb250ZXh0KS0+RWRpID0gKChjb250ZXh0KS0+RWRpICYgfjB4ZmZmZikgfCAoV09SRCkodmFsKSkpCgojZGVmaW5lIFNFVF9BTChjb250ZXh0LHZhbCkgICgodm9pZCkoKGNvbnRleHQpLT5FYXggPSAoKGNvbnRleHQpLT5FYXggJiB+MHhmZikgfCAoQllURSkodmFsKSkpCiNkZWZpbmUgU0VUX0JMKGNvbnRleHQsdmFsKSAgKCh2b2lkKSgoY29udGV4dCktPkVieCA9ICgoY29udGV4dCktPkVieCAmIH4weGZmKSB8IChCWVRFKSh2YWwpKSkKI2RlZmluZSBTRVRfQ0woY29udGV4dCx2YWwpICAoKHZvaWQpKChjb250ZXh0KS0+RWN4ID0gKChjb250ZXh0KS0+RWN4ICYgfjB4ZmYpIHwgKEJZVEUpKHZhbCkpKQojZGVmaW5lIFNFVF9ETChjb250ZXh0LHZhbCkgICgodm9pZCkoKGNvbnRleHQpLT5FZHggPSAoKGNvbnRleHQpLT5FZHggJiB+MHhmZikgfCAoQllURSkodmFsKSkpCgojZGVmaW5lIFNFVF9BSChjb250ZXh0LHZhbCkgICgodm9pZCkoKGNvbnRleHQpLT5FYXggPSAoKGNvbnRleHQpLT5FYXggJiB+MHhmZjAwKSB8ICgoKEJZVEUpKHZhbCkpIDw8IDgpKSkKI2RlZmluZSBTRVRfQkgoY29udGV4dCx2YWwpICAoKHZvaWQpKChjb250ZXh0KS0+RWJ4ID0gKChjb250ZXh0KS0+RWJ4ICYgfjB4ZmYwMCkgfCAoKChCWVRFKSh2YWwpKSA8PCA4KSkpCiNkZWZpbmUgU0VUX0NIKGNvbnRleHQsdmFsKSAgKCh2b2lkKSgoY29udGV4dCktPkVjeCA9ICgoY29udGV4dCktPkVjeCAmIH4weGZmMDApIHwgKCgoQllURSkodmFsKSkgPDwgOCkpKQojZGVmaW5lIFNFVF9ESChjb250ZXh0LHZhbCkgICgodm9pZCkoKGNvbnRleHQpLT5FZHggPSAoKGNvbnRleHQpLT5FZHggJiB+MHhmZjAwKSB8ICgoKEJZVEUpKHZhbCkpIDw8IDgpKSkKCiNpbmNsdWRlIDxwc2hwYWNrMS5oPgoKdHlwZWRlZiBzdHJ1Y3QKewogICAgV09SRCAgQ29tMUFkZHI7ICAgICAgICAgICAgICAgICAgLyogMDA6IENPTTEgSS9PIGFkZHJlc3MgKi8KICAgIFdPUkQgIENvbTJBZGRyOyAgICAgICAgICAgICAgICAgIC8qIDAyOiBDT00yIEkvTyBhZGRyZXNzICovCiAgICBXT1JEICBDb20zQWRkcjsgICAgICAgICAgICAgICAgICAvKiAwNDogQ09NMyBJL08gYWRkcmVzcyAqLwogICAgV09SRCAgQ29tNEFkZHI7ICAgICAgICAgICAgICAgICAgLyogMDY6IENPTTQgSS9PIGFkZHJlc3MgKi8KICAgIFdPUkQgIExwdDFBZGRyOyAgICAgICAgICAgICAgICAgIC8qIDA4OiBMUFQxIEkvTyBhZGRyZXNzICovCiAgICBXT1JEICBMcHQyQWRkcjsgICAgICAgICAgICAgICAgICAvKiAwYTogTFBUMiBJL08gYWRkcmVzcyAqLwogICAgV09SRCAgTHB0M0FkZHI7ICAgICAgICAgICAgICAgICAgLyogMGM6IExQVDMgSS9PIGFkZHJlc3MgKi8KICAgIFdPUkQgIExwdDRBZGRyOyAgICAgICAgICAgICAgICAgIC8qIDBlOiBMUFQ0IEkvTyBhZGRyZXNzICovCiAgICBXT1JEICBJbnN0YWxsZWRIYXJkd2FyZTsgICAgICAgICAvKiAxMDogSW5zdGFsbGVkIGhhcmR3YXJlIGZsYWdzICovCiAgICBCWVRFICBQT1NUc3RhdHVzOyAgICAgICAgICAgICAgICAvKiAxMjogUG93ZXItT24gU2VsZiBUZXN0IHN0YXR1cyAqLwogICAgV09SRCAgTWVtU2l6ZTsgICAgICAgICAgICAgICAgICAgLyogMTM6IEJhc2UgbWVtb3J5IHNpemUgaW4gS2IgKi8KICAgIFdPUkQgIHVudXNlZDE7ICAgICAgICAgICAgICAgICAgIC8qIDE1OiBNYW51ZmFjdHVyaW5nIHRlc3Qgc2NyYXRjaCBwYWQgKi8KICAgIEJZVEUgIEtiZEZsYWdzMTsgICAgICAgICAgICAgICAgIC8qIDE3OiBLZXlib2FyZCBmbGFncyAxICovCiAgICBCWVRFICBLYmRGbGFnczI7ICAgICAgICAgICAgICAgICAvKiAxODogS2V5Ym9hcmQgZmxhZ3MgMiAqLwogICAgQllURSAgdW51c2VkMjsgICAgICAgICAgICAgICAgICAgLyogMTk6IEtleWJvYXJkIGRyaXZlciB3b3Jrc3BhY2UgKi8KICAgIFdPUkQgIE5leHRLYmRDaGFyUHRyOyAgICAgICAgICAgIC8qIDFhOiBOZXh0IGNoYXJhY3RlciBpbiBrYmQgYnVmZmVyICovCiAgICBXT1JEICBGaXJzdEtiZENoYXJQdHI7ICAgICAgICAgICAvKiAxYzogRmlyc3QgY2hhcmFjdGVyIGluIGtiZCBidWZmZXIgKi8KICAgIFdPUkQgIEtiZEJ1ZmZlclsxNl07ICAgICAgICAgICAgIC8qIDFlOiBLZXlib2FyZCBidWZmZXIgKi8KICAgIEJZVEUgIERpc2tldHRlU3RhdHVzMTsgICAgICAgICAgIC8qIDNlOiBEaXNrZXR0ZSByZWNhbGlicmF0ZSBzdGF0dXMgKi8KICAgIEJZVEUgIERpc2tldHRlU3RhdHVzMjsgICAgICAgICAgIC8qIDNmOiBEaXNrZXR0ZSBtb3RvciBzdGF0dXMgKi8KICAgIEJZVEUgIERpc2tldHRlU3RhdHVzMzsgICAgICAgICAgIC8qIDQwOiBEaXNrZXR0ZSBtb3RvciB0aW1lb3V0ICovCiAgICBCWVRFICBEaXNrZXR0ZVN0YXR1czQ7ICAgICAgICAgICAvKiA0MTogRGlza2V0dGUgbGFzdCBvcGVyYXRpb24gc3RhdHVzICovCiAgICBCWVRFICBEaXNrU3RhdHVzWzddOyAgICAgICAgICAgICAvKiA0MjogRGlzayBzdGF0dXMvY29tbWFuZCBieXRlcyAqLwogICAgQllURSAgVmlkZW9Nb2RlOyAgICAgICAgICAgICAgICAgLyogNDk6IFZpZGVvIG1vZGUgKi8KICAgIFdPUkQgIFZpZGVvQ29sdW1uczsgICAgICAgICAgICAgIC8qIDRhOiBOdW1iZXIgb2YgY29sdW1ucyAqLwogICAgV09SRCAgVmlkZW9QYWdlU2l6ZTsgICAgICAgICAgICAgLyogNGM6IFZpZGVvIHBhZ2Ugc2l6ZSBpbiBieXRlcyAqLwogICAgV09SRCAgVmlkZW9QYWdlU3RhcnRBZGRyOyAgICAgICAgLyogNGU6IFZpZGVvIHBhZ2Ugc3RhcnQgYWRkcmVzcyAqLwogICAgQllURSAgVmlkZW9DdXJzb3JQb3NbMTZdOyAgICAgICAgLyogNTA6IEN1cnNvciBwb3NpdGlvbiBmb3IgOCBwYWdlcywgY29sdW1uL3JvdyBvcmRlciAqLwogICAgV09SRCAgVmlkZW9DdXJzb3JUeXBlOyAgICAgICAgICAgLyogNjA6IFZpZGVvIGN1cnNvciB0eXBlICovCiAgICBCWVRFICBWaWRlb0N1clBhZ2U7ICAgICAgICAgICAgICAvKiA2MjogVmlkZW8gY3VycmVudCBwYWdlICovCiAgICBXT1JEICBWaWRlb0N0cmxBZGRyOyAgICAgICAgICAgICAvKiA2MzogVmlkZW8gY29udHJvbGxlciBhZGRyZXNzICovCiAgICBCWVRFICBWaWRlb1JlZzE7ICAgICAgICAgICAgICAgICAvKiA2NTogVmlkZW8gbW9kZSBzZWxlY3QgcmVnaXN0ZXIgKi8KICAgIEJZVEUgIFZpZGVvUmVnMjsgICAgICAgICAgICAgICAgIC8qIDY2OiBWaWRlbyBDR0EgcGFsZXR0ZSByZWdpc3RlciAqLwogICAgRFdPUkQgUmVzZXRFbnRyeTsgICAgICAgICAgICAgICAgLyogNjc6IFdhcm0gcmVzZXQgZW50cnkgcG9pbnQgKi8KICAgIEJZVEUgIExhc3RJUlE7ICAgICAgICAgICAgICAgICAgIC8qIDZiOiBMYXN0IHVuZXhwZWN0ZWQgaW50ZXJydXB0ICovCiAgICBEV09SRCBUaWNrczsgICAgICAgICAgICAgICAgICAgICAvKiA2YzogVGlja3Mgc2luY2UgbWlkbmlnaHQgKi8KICAgIEJZVEUgIFRpY2tzT3ZlcmZsb3c7ICAgICAgICAgICAgIC8qIDcwOiBUaW1lciBvdmVyZmxvdyBpZiBwYXN0IG1pZG5pZ2h0ICovCiAgICBCWVRFICBDdHJsQnJlYWtGbGFnOyAgICAgICAgICAgICAvKiA3MTogQ3RybC1CcmVhayBmbGFnICovCiAgICBXT1JEICBSZXNldEZsYWc7ICAgICAgICAgICAgICAgICAvKiA3MjogUE9TVCBSZXNldCBmbGFnICovCiAgICBCWVRFICBEaXNrT3BTdGF0dXM7ICAgICAgICAgICAgICAvKiA3NDogTGFzdCBoYXJkLWRpc2sgb3BlcmF0aW9uIHN0YXR1cyAqLwogICAgQllURSAgTmJIYXJkRGlza3M7ICAgICAgICAgICAgICAgLyogNzU6IE51bWJlciBvZiBoYXJkIGRpc2tzICovCiAgICBCWVRFICBEaXNrQ3RybEJ5dGU7ICAgICAgICAgICAgICAvKiA3NjogRGlzayBjb250cm9sIGJ5dGUgKi8KICAgIEJZVEUgIERpc2tJT1BvcnQ7ICAgICAgICAgICAgICAgIC8qIDc3OiBEaXNrIEkvTyBwb3J0IG9mZnNldCAqLwogICAgQllURSAgTHB0VGltZW91dFs0XTsgICAgICAgICAgICAgLyogNzg6IFRpbWVvdXRzIGZvciBwYXJhbGxlbCBwb3J0cyAqLwogICAgQllURSAgQ29tVGltZW91dFs0XTsgICAgICAgICAgICAgLyogN2M6IFRpbWVvdXRzIGZvciBzZXJpYWwgcG9ydHMgKi8KICAgIFdPUkQgIEtiZEJ1ZmZlclN0YXJ0OyAgICAgICAgICAgIC8qIDgwOiBLZXlib2FyZCBidWZmZXIgc3RhcnQgKi8KICAgIFdPUkQgIEtiZEJ1ZmZlckVuZDsgICAgICAgICAgICAgIC8qIDgyOiBLZXlib2FyZCBidWZmZXIgZW5kICovCiAgICBCWVRFICBSb3dzT25TY3JlZW5NaW51czE7ICAgICAgICAvKiA4NDogRUdBIG9ubHkgKi8KICAgIFdPUkQgIEJ5dGVzUGVyQ2hhcjsgICAgICAgICAgICAgIC8qIDg1OiBFR0Egb25seSAqLwogICAgQllURSAgTW9kZU9wdGlvbnM7ICAgICAgICAgICAgICAgLyogODc6IEVHQSBvbmx5ICovCiAgICBCWVRFICBGZWF0dXJlQml0c1N3aXRjaGVzOyAgICAgICAvKiA4ODogRUdBIG9ubHkgKi8KICAgIEJZVEUgIFZHQVNldHRpbmdzOyAgICAgICAgICAgICAgIC8qIDg5OiBWR0EgbWlzYyBzZXR0aW5ncyAqLwogICAgQllURSAgRGlzcGxheUNvbWJpbmF0aW9uOyAgICAgICAgLyogOEE6IFZHQSBkaXNwbGF5IGNvbWJpbmF0aW9ucyAqLwogICAgQllURSAgRGlza0RhdGFSYXRlOyAgICAgICAgICAgICAgLyogOEI6IExhc3QgZGlzayBkYXRhIHJhdGUgc2VsZWN0ZWQgKi8KfSBCSU9TREFUQTsKCiNpbmNsdWRlIDxwb3BwYWNrLmg+CgovKiBtb2R1bGUuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgTVpfTG9hZEltYWdlKCBMUENTVFIgZmlsZW5hbWUsIEhBTkRMRSBoRmlsZSApOwpleHRlcm4gQk9PTCBXSU5BUEkgTVpfRXhlYyggQ09OVEVYVDg2ICpjb250ZXh0LCBMUENTVFIgZmlsZW5hbWUsIEJZVEUgZnVuYywgTFBWT0lEIHBhcmFtYmxrICk7CmV4dGVybiB2b2lkIFdJTkFQSSBNWl9FeGl0KCBDT05URVhUODYgKmNvbnRleHQsIEJPT0wgY3NfcHNwLCBXT1JEIHJldHZhbCApOwpleHRlcm4gQk9PTCBXSU5BUEkgTVpfQ3VycmVudCggdm9pZCApOwpleHRlcm4gdm9pZCBXSU5BUEkgTVpfQWxsb2NEUE1JVGFzayggdm9pZCApOwpleHRlcm4gdm9pZCBXSU5BUEkgTVpfUnVuSW5UaHJlYWQoIFBBUENGVU5DIHByb2MsIFVMT05HX1BUUiBhcmcgKTsKZXh0ZXJuIEJPT0wgRE9TVk1fSXNXaW4xNih2b2lkKTsKCi8qIGRvc3ZtLmMgKi8KZXh0ZXJuIHZvaWQgRE9TVk1fU2VuZFF1ZXVlZEV2ZW50cyggQ09OVEVYVDg2ICogKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0Fja25vd2xlZGdlSVJRKCBDT05URVhUODYgKiApOwpleHRlcm4gSU5UIFdJTkFQSSBET1NWTV9FbnRlciggQ09OVEVYVDg2ICpjb250ZXh0ICk7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9XYWl0KCBDT05URVhUODYgKiApOwpleHRlcm4gRFdPUkQgV0lOQVBJIERPU1ZNX0xvb3AoIEhBTkRMRSBoVGhyZWFkICk7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9RdWV1ZUV2ZW50KCBJTlQgaXJxLCBJTlQgcHJpb3JpdHksIERPU1JFTEFZIHJlbGF5LCBMUFZPSUQgZGF0YSApOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fUElDX2lvcG9ydF9vdXQoIFdPUkQgcG9ydCwgQllURSB2YWwgKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX1NldFRpbWVyKCBVSU5UIHRpY2tzICk7CmV4dGVybiBVSU5UIFdJTkFQSSBET1NWTV9HZXRUaW1lciggdm9pZCApOwoKLyogZGV2aWNlcy5jICovCmV4dGVybiB2b2lkIERPU0RFVl9JbnN0YWxsRE9TRGV2aWNlcyh2b2lkKTsKZXh0ZXJuIERXT1JEIERPU0RFVl9Db25zb2xlKHZvaWQpOwpleHRlcm4gRFdPUkQgRE9TREVWX0ZpbmRDaGFyRGV2aWNlKGNoYXIqbmFtZSk7CmV4dGVybiBpbnQgRE9TREVWX1BlZWsoRFdPUkQgZGV2LCBCWVRFKmRhdGEpOwpleHRlcm4gaW50IERPU0RFVl9SZWFkKERXT1JEIGRldiwgRFdPUkQgYnVmLCBpbnQgYnVmbGVuKTsKZXh0ZXJuIGludCBET1NERVZfV3JpdGUoRFdPUkQgZGV2LCBEV09SRCBidWYsIGludCBidWZsZW4sIGludCB2ZXJpZnkpOwpleHRlcm4gaW50IERPU0RFVl9Jb2N0bFJlYWQoRFdPUkQgZGV2LCBEV09SRCBidWYsIGludCBidWZsZW4pOwpleHRlcm4gaW50IERPU0RFVl9Jb2N0bFdyaXRlKERXT1JEIGRldiwgRFdPUkQgYnVmLCBpbnQgYnVmbGVuKTsKZXh0ZXJuIHZvaWQgRE9TREVWX1NldFNoYXJpbmdSZXRyeShXT1JEIGRlbGF5LCBXT1JEIGNvdW50KTsKZXh0ZXJuIFNFR1BUUiBET1NERVZfR2V0TE9MKEJPT0wgdjg2KTsKCi8qIGRtYS5jICovCmV4dGVybiBpbnQgRE1BX1RyYW5zZmVyKGludCBjaGFubmVsLGludCByZXFsZW5ndGgsdm9pZCogYnVmZmVyKTsKZXh0ZXJuIHZvaWQgRE1BX2lvcG9ydF9vdXQoIFdPUkQgcG9ydCwgQllURSB2YWwgKTsKZXh0ZXJuIEJZVEUgRE1BX2lvcG9ydF9pbiggV09SRCBwb3J0ICk7CgovKiBkb3Nhc3BpLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0FTUElIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogZG9zY29uZi5jICovCmV4dGVybiBET1NDT05GICpET1NDT05GX0dldENvbmZpZyggdm9pZCApOwoKLyogZG9zbWVtLmMgKi8KZXh0ZXJuIEJPT0wgRE9TTUVNX0luaXREb3NNZW1vcnkodm9pZCk7CmV4dGVybiBCT09MIERPU01FTV9NYXBEb3NMYXlvdXQodm9pZCk7CmV4dGVybiBXT1JEICAgRE9TTUVNX0FsbG9jU2VsZWN0b3IoV09SRCk7IC8qIEZJWE1FOiB0byBiZSByZW1vdmVkICovCmV4dGVybiBMUFZPSUQgRE9TTUVNX0FsbG9jQmxvY2soVUlOVCBzaXplLCBXT1JEKiBwKTsKZXh0ZXJuIEJPT0wgRE9TTUVNX0ZyZWVCbG9jayh2b2lkKiBwdHIpOwpleHRlcm4gVUlOVCBET1NNRU1fUmVzaXplQmxvY2sodm9pZCogcHRyLCBVSU5UIHNpemUsIEJPT0wgZXhhY3QpOwpleHRlcm4gVUlOVCBET1NNRU1fQXZhaWxhYmxlKHZvaWQpOwpleHRlcm4gQklPU0RBVEEgKkRPU1ZNX0Jpb3NEYXRhKCB2b2lkICk7CgovKiBmcHUuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzRIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzVIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzZIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzdIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzhIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzlIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50M2FIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50M2JIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50M2NIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50M2RIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50M2VIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaGltZW0uYyAqLwpleHRlcm4gdm9pZCBET1NWTV9Jbml0U2VnbWVudHModm9pZCk7CmV4dGVybiBMUFZPSUQgRE9TVk1fQWxsb2NVTUIoRFdPUkQpOwpleHRlcm4gTFBWT0lEIERPU1ZNX0FsbG9jQ29kZVVNQihEV09SRCwgV09SRCAqLCBXT1JEICopOwpleHRlcm4gTFBWT0lEIERPU1ZNX0FsbG9jRGF0YVVNQihEV09SRCwgV09SRCAqLCBXT1JEICopOwoKLyogaW50MDkuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MDlIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MDlTZW5kU2NhbihCWVRFIHNjYW4sQllURSBhc2NpaSk7CmV4dGVybiBCWVRFIFdJTkFQSSBET1NWTV9JbnQwOVJlYWRTY2FuKEJZVEUqYXNjaWkpOwoKLyogaW50MTAuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTBIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fUHV0Q2hhcihCWVRFIGFzY2lpKTsKCi8qIGludDExLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDExSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDEyLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDEySGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDEzLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDEzSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDE1LmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDE1SGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDFhLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDFhSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDE2LmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDE2SGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIEJPT0wgV0lOQVBJIERPU1ZNX0ludDE2UmVhZENoYXIoIEJZVEUgKiwgQllURSAqLCBDT05URVhUODYgKiApOwpleHRlcm4gaW50IFdJTkFQSSBET1NWTV9JbnQxNkFkZENoYXIoQllURSBhc2NpaSxCWVRFIHNjYW4pOwoKLyogaW50MTcuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTdIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MTkuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTlIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MjAuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MjBIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MjEuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MjFIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MjUuYyAqLwpCT09MIERPU1ZNX1Jhd1JlYWQoIEJZVEUsIERXT1JELCBEV09SRCwgQllURSAqLCBCT09MICk7CnZvaWQgV0lOQVBJIERPU1ZNX0ludDI1SGFuZGxlciggQ09OVEVYVDg2ICogKTsKCi8qIGludDI2LmMgKi8KQk9PTCBET1NWTV9SYXdXcml0ZSggQllURSwgRFdPUkQsIERXT1JELCBCWVRFICosIEJPT0wgKTsKdm9pZCBXSU5BUEkgRE9TVk1fSW50MjZIYW5kbGVyKCBDT05URVhUODYgKiApOwoKLyogaW50MjkuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MjlIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MmEuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MmFIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MmYuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MmZIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MzEuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzFIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fUmF3TW9kZVN3aXRjaEhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiBCT09MIERPU1ZNX0lzRG9zMzIodm9pZCk7CmV4dGVybiBGQVJQUk9DMTYgV0lOQVBJIERQTUlfQWxsb2NJbnRlcm5hbFJNQ0IoUk1DQlBST0MpOwpleHRlcm4gdm9pZCBXSU5BUEkgRFBNSV9GcmVlSW50ZXJuYWxSTUNCKEZBUlBST0MxNik7CmV4dGVybiBpbnQgRFBNSV9DYWxsUk1Qcm9jKENPTlRFWFQ4NiosTFBXT1JELGludCxpbnQpOwpleHRlcm4gQk9PTCBET1NWTV9DaGVja1dyYXBwZXJzKENPTlRFWFQ4NiopOwoKLyogaW50MzMuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzNIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzNNZXNzYWdlKFVJTlQsV1BBUkFNLExQQVJBTSk7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzM0NvbnNvbGUoTU9VU0VfRVZFTlRfUkVDT1JEKik7CgovKiBpbnQ0MS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQ0MUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQ0Yi5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQ0YkhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQ1Yy5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQ1Y0hhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQ2Ny5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQ2N0hhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBFTVNfSW9jdGxfSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludGVycnVwdHMuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fQ2FsbEJ1aWx0aW5IYW5kbGVyKCBDT05URVhUODYgKiwgQllURSApOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fRW11bGF0ZUludGVycnVwdFBNKCBDT05URVhUODYgKiwgQllURSApOwpleHRlcm4gQk9PTCBXSU5BUEkgRE9TVk1fRW11bGF0ZUludGVycnVwdFJNKCBDT05URVhUODYgKiwgQllURSApOwpleHRlcm4gRkFSUFJPQzE2ICAgRE9TVk1fR2V0UE1IYW5kbGVyMTYoIEJZVEUgKTsKZXh0ZXJuIEZBUlBST0M0OCAgIERPU1ZNX0dldFBNSGFuZGxlcjQ4KCBCWVRFICk7CmV4dGVybiBGQVJQUk9DMTYgICBET1NWTV9HZXRSTUhhbmRsZXIoIEJZVEUgKTsKZXh0ZXJuIHZvaWQgICAgICAgIERPU1ZNX0hhcmR3YXJlSW50ZXJydXB0UE0oIENPTlRFWFQ4NiAqLCBCWVRFICk7CmV4dGVybiB2b2lkICAgICAgICBET1NWTV9IYXJkd2FyZUludGVycnVwdFJNKCBDT05URVhUODYgKiwgQllURSApOwpleHRlcm4gdm9pZCAgICAgICAgRE9TVk1fU2V0UE1IYW5kbGVyMTYoIEJZVEUsIEZBUlBST0MxNiApOwpleHRlcm4gdm9pZCAgICAgICAgRE9TVk1fU2V0UE1IYW5kbGVyNDgoIEJZVEUsIEZBUlBST0M0OCApOwpleHRlcm4gdm9pZCAgICAgICAgRE9TVk1fU2V0Uk1IYW5kbGVyKCBCWVRFLCBGQVJQUk9DMTYgKTsKCi8qIHJlbGF5LmMgKi8Kdm9pZCBET1NWTV9SZWxheUhhbmRsZXIoIENPTlRFWFQ4NiAqICk7CnZvaWQgRE9TVk1fQnVpbGRDYWxsRnJhbWUoIENPTlRFWFQ4NiAqLCBET1NSRUxBWSwgTFBWT0lEICk7CgovKiBzb3VuZGJsYXN0ZXIuYyAqLwpleHRlcm4gdm9pZCBTQl9pb3BvcnRfb3V0KCBXT1JEIHBvcnQsIEJZVEUgdmFsICk7CmV4dGVybiBCWVRFIFNCX2lvcG9ydF9pbiggV09SRCBwb3J0ICk7CgovKiBwcGRldi5jICovCmV4dGVybiBCT09MIElPX3BwX291dHAoaW50IHBvcnQsIERXT1JEKiByZXMpOwpleHRlcm4gaW50IElPX3BwX2lucChpbnQgcG9ydCwgRFdPUkQqIHJlcyk7CmV4dGVybiBjaGFyIElPX3BwX2luaXQodm9pZCk7CgovKiB0aW1lci5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQwOEhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiB4bXMuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgWE1TX0hhbmRsZXIoQ09OVEVYVDg2Kik7CgojZW5kaWYgLyogX19XSU5FX0RPU0VYRV9IICovCg==