LyoKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIDEwLzEwMC8xMDAwIEJhc2UtVCBFdGhlcm5ldCBEcml2ZXIgZm9yIHRoZSBFVDEzMDEgYW5kIEVUMTMxeCBzZXJpZXMgTUFDcwogKgogKiBDb3B5cmlnaHQgqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIGV0MTMxMF9yeC5oIC0gRGVmaW5lcywgc3RydWN0cywgZW51bXMsIHByb3RvdHlwZXMsIGV0Yy4gcGVydGFpbmluZyB0byBkYXRhCiAqICAgICAgICAgICAgICAgcmVjZXB0aW9uLgogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBTT0ZUV0FSRSBMSUNFTlNFCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAogKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCiAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgogKgogKiBDb3B5cmlnaHQgqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCiAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCiAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIERpc2NsYWltZXIKICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCiAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQogKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgogKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAogKiBEQU1BR0UuCiAqCiAqLwoKI2lmbmRlZiBfX0VUMTMxMF9SWF9IX18KI2RlZmluZSBfX0VUMTMxMF9SWF9IX18KCiNpbmNsdWRlICJldDEzMTBfYWRkcmVzc19tYXAuaCIKCiNkZWZpbmUgVVNFX0ZCUjAgdHJ1ZQoKI2lmZGVmIFVTRV9GQlIwCi8vI2RlZmluZSBGQlIwX0JVRkZFUl9TSVpFIDI1NgojZW5kaWYKCi8vI2RlZmluZSBGQlIxX0JVRkZFUl9TSVpFIDIwNDgKCiNkZWZpbmUgRkJSX0NIVU5LUyAzMgoKI2RlZmluZSBNQVhfREVTQ19QRVJfUklOR19SWCAgICAgICAgIDEwMjQKCi8qIG51bWJlciBvZiBSRkRzIC0gZGVmYXVsdCBhbmQgbWluICovCiNpZmRlZiBVU0VfRkJSMAojZGVmaW5lIFJGRF9MT1dfV0FURVJfTUFSSwk0MAojZGVmaW5lIE5JQ19NSU5fTlVNX1JGRAkJNjQKI2RlZmluZSBOSUNfREVGQVVMVF9OVU1fUkZECTEwMjQKI2Vsc2UKI2RlZmluZSBSRkRfTE9XX1dBVEVSX01BUksJMjAKI2RlZmluZSBOSUNfTUlOX05VTV9SRkQJCTY0CiNkZWZpbmUgTklDX0RFRkFVTFRfTlVNX1JGRAkyNTYKI2VuZGlmCgojZGVmaW5lIE5VTV9QQUNLRVRTX0hBTkRMRUQJMjU2CgojZGVmaW5lIEFMQ0FURUxfQkFEX1NUQVRVUwkweGU0N2YwMDAwCiNkZWZpbmUgQUxDQVRFTF9NVUxUSUNBU1RfUEtUCTB4MDEwMDAwMDAKI2RlZmluZSBBTENBVEVMX0JST0FEQ0FTVF9QS1QJMHgwMjAwMDAwMAoKLyogdHlwZWRlZnMgZm9yIEZyZWUgQnVmZmVyIERlc2NyaXB0b3JzICovCnR5cGVkZWYgdW5pb24gX0ZCUl9XT1JEMl90IHsKCXUzMiB2YWx1ZTsKCXN0cnVjdCB7CiNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCgkJdTMyIHJlc2VydmVkOjIyOwkvLyBiaXRzIDEwLTMxCgkJdTMyIGJpOjEwOwkJLy8gYml0cyAwLTkoQnVmZmVyIEluZGV4KQojZWxzZQoJCXUzMiBiaToxMDsJCS8vIGJpdHMgMC05KEJ1ZmZlciBJbmRleCkKCQl1MzIgcmVzZXJ2ZWQ6MjI7CS8vIGJpdCAxMC0zMQojZW5kaWYKCX0gYml0czsKfSBGQlJfV09SRDJfdCwgKlBGQlJfV09SRDJfdDsKCnR5cGVkZWYgc3RydWN0IF9GQlJfREVTQ190IHsKCXUzMiBhZGRyX2xvOwoJdTMyIGFkZHJfaGk7CglGQlJfV09SRDJfdCB3b3JkMjsKfSBGQlJfREVTQ190LCAqUEZCUl9ERVNDX3Q7CgovKiBUeXBlZGVmcyBmb3IgUGFja2V0IFN0YXR1cyBSaW5nIERlc2NyaXB0b3JzICovCnR5cGVkZWYgdW5pb24gX1BLVF9TVEFUX0RFU0NfV09SRDBfdCB7Cgl1MzIgdmFsdWU7CglzdHJ1Y3QgewojaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAoJCS8vIHRvcCAxNiBiaXRzIGFyZSBmcm9tIHRoZSBBbGNhdGVsIFN0YXR1cyBXb3JkIGFzIGVudW1lcmF0ZWQgaW4KCQkvLyBQRS1NQ1hNQUMgRGF0YSBTaGVldCBJUEQgRFM1NCAwMjEwLTEgKGFsc28gSVBELURTODAgMDIwNS0yKQojaWYgMAoJCXUzMiBhc3dfdHJ1bmM6MTsJCS8vIGJpdCAzMShSeCBmcmFtZSB0cnVuY2F0ZWQpCiNlbmRpZgoJCXUzMiBhc3dfbG9uZ19ldnQ6MTsJLy8gYml0IDMxKFJ4IGxvbmcgZXZlbnQpCgkJdTMyIGFzd19WTEFOX3RhZzoxOwkvLyBiaXQgMzAoVkxBTiB0YWcgZGV0ZWN0ZWQpCgkJdTMyIGFzd191bnN1cHBvcnRlZF9vcDoxOwkvLyBiaXQgMjkodW5zdXBwb3J0ZWQgT1AgY29kZSkKCQl1MzIgYXN3X3BhdXNlX2ZyYW1lOjE7CS8vIGJpdCAyOChpcyBhIHBhdXNlIGZyYW1lKQoJCXUzMiBhc3dfY29udHJvbF9mcmFtZToxOwkvLyBiaXQgMjcoaXMgYSBjb250cm9sIGZyYW1lKQoJCXUzMiBhc3dfZHJpYmJsZV9uaWJibGU6MTsJLy8gYml0IDI2KHNwdXJpb3VzIGJpdHMgYWZ0ZXIgRU9QKQoJCXUzMiBhc3dfYnJvYWRjYXN0OjE7CS8vIGJpdCAyNShoYXMgYSBicm9hZGNhc3QgYWRkcmVzcykKCQl1MzIgYXN3X211bHRpY2FzdDoxOwkvLyBiaXQgMjQoaGFzIGEgbXVsdGljYXN0IGFkZHJlc3MpCgkJdTMyIGFzd19PSzoxOwkJLy8gYml0IDIzKHZhbGlkIENSQyArIG5vIGNvZGUgZXJyb3IpCgkJdTMyIGFzd190b29fbG9uZzoxOwkvLyBiaXQgMjIoZnJhbWUgbGVuZ3RoID4gMTUxOCBieXRlcykKCQl1MzIgYXN3X2xlbl9jaGtfZXJyOjE7CS8vIGJpdCAyMShmcmFtZSBsZW5ndGggZmllbGQgaW5jb3JyZWN0KQoJCXUzMiBhc3dfQ1JDX2VycjoxOwkJLy8gYml0IDIwKENSQyBlcnJvcikKCQl1MzIgYXN3X2NvZGVfZXJyOjE7CS8vIGJpdCAxOShvbmUgb3IgbW9yZSBuaWJibGVzIHNpZ25hbGxlZCBhcyBlcnJvcnMpCgkJdTMyIGFzd19mYWxzZV9jYXJyaWVyX2V2ZW50OjE7CS8vIGJpdCAxOChiYWQgY2FycmllciBzaW5jZSBsYXN0IGdvb2QgcGFja2V0KQoJCXUzMiBhc3dfUlhfRFZfZXZlbnQ6MTsJLy8gYml0IDE3KHNob3J0IHJlY2VpdmUgZXZlbnQgZGV0ZWN0ZWQpCgkJdTMyIGFzd19wcmV2X3BrdF9kcm9wcGVkOjE7Ly8gYml0IDE2KGUuZy4gSUZHIHRvbyBzbWFsbCBvbiBwcmV2aW91cykKCQl1MzIgdW51c2VkOjU7CQkvLyBiaXRzIDExLTE1CgkJdTMyIHZwOjE7CQkJLy8gYml0IDEwKFZMQU4gUGFja2V0KQoJCXUzMiBqcDoxOwkJCS8vIGJpdCA5KEp1bWJvIFBhY2tldCkKCQl1MzIgZnQ6MTsJCQkvLyBiaXQgOChGcmFtZSBUcnVuY2F0ZWQpCgkJdTMyIGRyb3A6MTsJCS8vIGJpdCA3KERyb3AgcGFja2V0KQoJCXUzMiByeG1hY19lcnJvcjoxOwkJLy8gYml0IDYoUlhNQUMgRXJyb3IgSW5kaWNhdG9yKQoJCXUzMiB3b2w6MTsJCQkvLyBiaXQgNShXT0wgRXZlbnQpCgkJdTMyIHRjcHA6MTsJCS8vIGJpdCA0KFRDUCBjaGVja3N1bSBwYXNzKQoJCXUzMiB0Y3BhOjE7CQkvLyBiaXQgMyhUQ1AgY2hlY2tzdW0gYXNzaXN0KQoJCXUzMiBpcHA6MTsJCQkvLyBiaXQgMihJUCBjaGVja3N1bSBwYXNzKQoJCXUzMiBpcGE6MTsJCQkvLyBiaXQgMShJUCBjaGVja3N1bSBhc3Npc3QpCgkJdTMyIGhwOjE7CQkJLy8gYml0IDAoaGFzaCBwYXNzKQojZWxzZQoJCXUzMiBocDoxOwkJCS8vIGJpdCAwKGhhc2ggcGFzcykKCQl1MzIgaXBhOjE7CQkJLy8gYml0IDEoSVAgY2hlY2tzdW0gYXNzaXN0KQoJCXUzMiBpcHA6MTsJCQkvLyBiaXQgMihJUCBjaGVja3N1bSBwYXNzKQoJCXUzMiB0Y3BhOjE7CQkvLyBiaXQgMyhUQ1AgY2hlY2tzdW0gYXNzaXN0KQoJCXUzMiB0Y3BwOjE7CQkvLyBiaXQgNChUQ1AgY2hlY2tzdW0gcGFzcykKCQl1MzIgd29sOjE7CQkJLy8gYml0IDUoV09MIEV2ZW50KQoJCXUzMiByeG1hY19lcnJvcjoxOwkJLy8gYml0IDYoUlhNQUMgRXJyb3IgSW5kaWNhdG9yKQoJCXUzMiBkcm9wOjE7CQkvLyBiaXQgNyhEcm9wIHBhY2tldCkKCQl1MzIgZnQ6MTsJCQkvLyBiaXQgOChGcmFtZSBUcnVuY2F0ZWQpCgkJdTMyIGpwOjE7CQkJLy8gYml0IDkoSnVtYm8gUGFja2V0KQoJCXUzMiB2cDoxOwkJCS8vIGJpdCAxMChWTEFOIFBhY2tldCkKCQl1MzIgdW51c2VkOjU7CQkvLyBiaXRzIDExLTE1CgkJdTMyIGFzd19wcmV2X3BrdF9kcm9wcGVkOjE7Ly8gYml0IDE2KGUuZy4gSUZHIHRvbyBzbWFsbCBvbiBwcmV2aW91cykKCQl1MzIgYXN3X1JYX0RWX2V2ZW50OjE7CS8vIGJpdCAxNyhzaG9ydCByZWNlaXZlIGV2ZW50IGRldGVjdGVkKQoJCXUzMiBhc3dfZmFsc2VfY2Fycmllcl9ldmVudDoxOwkvLyBiaXQgMTgoYmFkIGNhcnJpZXIgc2luY2UgbGFzdCBnb29kIHBhY2tldCkKCQl1MzIgYXN3X2NvZGVfZXJyOjE7CS8vIGJpdCAxOShvbmUgb3IgbW9yZSBuaWJibGVzIHNpZ25hbGxlZCBhcyBlcnJvcnMpCgkJdTMyIGFzd19DUkNfZXJyOjE7CQkvLyBiaXQgMjAoQ1JDIGVycm9yKQoJCXUzMiBhc3dfbGVuX2Noa19lcnI6MTsJLy8gYml0IDIxKGZyYW1lIGxlbmd0aCBmaWVsZCBpbmNvcnJlY3QpCgkJdTMyIGFzd190b29fbG9uZzoxOwkvLyBiaXQgMjIoZnJhbWUgbGVuZ3RoID4gMTUxOCBieXRlcykKCQl1MzIgYXN3X09LOjE7CQkvLyBiaXQgMjModmFsaWQgQ1JDICsgbm8gY29kZSBlcnJvcikKCQl1MzIgYXN3X211bHRpY2FzdDoxOwkvLyBiaXQgMjQoaGFzIGEgbXVsdGljYXN0IGFkZHJlc3MpCgkJdTMyIGFzd19icm9hZGNhc3Q6MTsJLy8gYml0IDI1KGhhcyBhIGJyb2FkY2FzdCBhZGRyZXNzKQoJCXUzMiBhc3dfZHJpYmJsZV9uaWJibGU6MTsJLy8gYml0IDI2KHNwdXJpb3VzIGJpdHMgYWZ0ZXIgRU9QKQoJCXUzMiBhc3dfY29udHJvbF9mcmFtZToxOwkvLyBiaXQgMjcoaXMgYSBjb250cm9sIGZyYW1lKQoJCXUzMiBhc3dfcGF1c2VfZnJhbWU6MTsJLy8gYml0IDI4KGlzIGEgcGF1c2UgZnJhbWUpCgkJdTMyIGFzd191bnN1cHBvcnRlZF9vcDoxOwkvLyBiaXQgMjkodW5zdXBwb3J0ZWQgT1AgY29kZSkKCQl1MzIgYXN3X1ZMQU5fdGFnOjE7CS8vIGJpdCAzMChWTEFOIHRhZyBkZXRlY3RlZCkKCQl1MzIgYXN3X2xvbmdfZXZ0OjE7CS8vIGJpdCAzMShSeCBsb25nIGV2ZW50KQojaWYgMAoJCXUzMiBhc3dfdHJ1bmM6MTsJCS8vIGJpdCAzMShSeCBmcmFtZSB0cnVuY2F0ZWQpCiNlbmRpZgojZW5kaWYKCX0gYml0czsKfSBQS1RfU1RBVF9ERVNDX1dPUkQwX3QsICpQUEtUX1NUQVRfV09SRDBfdDsKCnR5cGVkZWYgdW5pb24gX1BLVF9TVEFUX0RFU0NfV09SRDFfdCB7Cgl1MzIgdmFsdWU7CglzdHJ1Y3QgewojaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAoJCXUzMiB1bnVzZWQ6NDsJLy8gYml0cyAyOC0zMQoJCXUzMiByaToyOwkJLy8gYml0cyAyNi0yNyhSaW5nIEluZGV4KQoJCXUzMiBiaToxMDsJCS8vIGJpdHMgMTYtMjUoQnVmZmVyIEluZGV4KQoJCXUzMiBsZW5ndGg6MTY7CS8vIGJpdCAwLTE1KGxlbmd0aCBpbiBieXRlcykKI2Vsc2UKCQl1MzIgbGVuZ3RoOjE2OwkvLyBiaXQgMC0xNShsZW5ndGggaW4gYnl0ZXMpCgkJdTMyIGJpOjEwOwkJLy8gYml0cyAxNi0yNShCdWZmZXIgSW5kZXgpCgkJdTMyIHJpOjI7CQkvLyBiaXRzIDI2LTI3KFJpbmcgSW5kZXgpCgkJdTMyIHVudXNlZDo0OwkvLyBiaXRzIDI4LTMxCiNlbmRpZgoJfSBiaXRzOwp9IFBLVF9TVEFUX0RFU0NfV09SRDFfdCwgKlBQS1RfU1RBVF9XT1JEMV90OwoKdHlwZWRlZiBzdHJ1Y3QgX1BLVF9TVEFUX0RFU0NfdCB7CglQS1RfU1RBVF9ERVNDX1dPUkQwX3Qgd29yZDA7CglQS1RfU1RBVF9ERVNDX1dPUkQxX3Qgd29yZDE7Cn0gUEtUX1NUQVRfREVTQ190LCAqUFBLVF9TVEFUX0RFU0NfdDsKCi8qIFR5cGVkZWZzIGZvciB0aGUgUlggRE1BIHN0YXR1cyB3b3JkICovCgovKgogKiBSWFNUQVRfV09SRDBfdCBzdHJ1Y3R1cmUgaG9sZHMgcGFydCBvZiB0aGUgc3RhdHVzIGJpdHMgb2YgdGhlIFJ4IERNQSBlbmdpbmUKICogdGhhdCBnZXQgY29waWVkIG91dCB0byBtZW1vcnkgYnkgdGhlIEVULTEzMTAuICBXb3JkIDAgaXMgYSAzMiBiaXQgd29yZAogKiB3aGljaGNvbnRhaW5zIEZyZWUgQnVmZmVyIHJpbmcgMCBhbmQgMSBhdmFpbGFibGUgb2Zmc2V0LgogKi8KdHlwZWRlZiB1bmlvbiBfcnhzdGF0X3dvcmQwX3QgewoJdTMyIHZhbHVlOwoJc3RydWN0IHsKI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKCQl1MzIgRkJSMXVudXNlZDo1OwkvLyBiaXRzIDI3LTMxCgkJdTMyIEZCUjF3cmFwOjE7CS8vIGJpdCAyNgoJCXUzMiBGQlIxb2Zmc2V0OjEwOwkvLyBiaXRzIDE2LTI1CgkJdTMyIEZCUjB1bnVzZWQ6NTsJLy8gYml0cyAxMS0xNQoJCXUzMiBGQlIwd3JhcDoxOwkvLyBiaXQgMTAKCQl1MzIgRkJSMG9mZnNldDoxMDsJLy8gYml0cyAwLTkKI2Vsc2UKCQl1MzIgRkJSMG9mZnNldDoxMDsJLy8gYml0cyAwLTkKCQl1MzIgRkJSMHdyYXA6MTsJLy8gYml0IDEwCgkJdTMyIEZCUjB1bnVzZWQ6NTsJLy8gYml0cyAxMS0xNQoJCXUzMiBGQlIxb2Zmc2V0OjEwOwkvLyBiaXRzIDE2LTI1CgkJdTMyIEZCUjF3cmFwOjE7CS8vIGJpdCAyNgoJCXUzMiBGQlIxdW51c2VkOjU7CS8vIGJpdHMgMjctMzEKI2VuZGlmCgl9IGJpdHM7Cn0gUlhTVEFUX1dPUkQwX3QsICpQUlhTVEFUX1dPUkQwX3Q7CgovKgogKiBSWFNUQVRfV09SRDFfdCBzdHJ1Y3R1cmUgaG9sZHMgcGFydCBvZiB0aGUgc3RhdHVzIGJpdHMgb2YgdGhlIFJ4IERNQSBlbmdpbmUKICogdGhhdCBnZXQgY29waWVkIG91dCB0byBtZW1vcnkgYnkgdGhlIEVULTEzMTAuICBXb3JkIDMgaXMgYSAzMiBiaXQgd29yZAogKiB3aGljaCBjb250YWlucyB0aGUgUGFja2V0IFN0YXR1cyBSaW5nIGF2YWlsYWJsZSBvZmZzZXQuCiAqLwp0eXBlZGVmIHVuaW9uIF9yeHN0YXRfd29yZDFfdCB7Cgl1MzIgdmFsdWU7CglzdHJ1Y3QgewojaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAoJCXUzMiBQU1J1bnVzZWQ6MzsJLy8gYml0cyAyOS0zMQoJCXUzMiBQU1J3cmFwOjE7CS8vIGJpdCAyOAoJCXUzMiBQU1JvZmZzZXQ6MTI7CS8vIGJpdHMgMTYtMjcKCQl1MzIgcmVzZXJ2ZWQ6MTY7CS8vIGJpdHMgMC0xNQojZWxzZQoJCXUzMiByZXNlcnZlZDoxNjsJLy8gYml0cyAwLTE1CgkJdTMyIFBTUm9mZnNldDoxMjsJLy8gYml0cyAxNi0yNwoJCXUzMiBQU1J3cmFwOjE7CS8vIGJpdCAyOAoJCXUzMiBQU1J1bnVzZWQ6MzsJLy8gYml0cyAyOS0zMQojZW5kaWYKCX0gYml0czsKfSBSWFNUQVRfV09SRDFfdCwgKlBSWFNUQVRfV09SRDFfdDsKCi8qCiAqIFJYX1NUQVRVU19CTE9DS190IGlzIHNydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgc3RhdHVzIG9mIHRoZSBSeCBETUEgZW5naW5lCiAqIGl0IHNpdHMgaW4gZnJlZSBtZW1vcnksIGFuZCBpcyBwb2ludGVkIHRvIGJ5IDB4MTAxYyAvIDB4MTAyMAogKi8KdHlwZWRlZiBzdHJ1Y3QgX3J4X3N0YXR1c19ibG9ja190IHsKCVJYU1RBVF9XT1JEMF90IFdvcmQwOwoJUlhTVEFUX1dPUkQxX3QgV29yZDE7Cn0gUlhfU1RBVFVTX0JMT0NLX3QsICpQUlhfU1RBVFVTX0JMT0NLX3Q7CgovKgogKiBTdHJ1Y3R1cmUgZm9yIGxvb2stdXAgdGFibGUgaG9sZGluZyBmcmVlIGJ1ZmZlciByaW5nIHBvaW50ZXJzCiAqLwp0eXBlZGVmIHN0cnVjdCBfRmJyTG9va3VwVGFibGUgewoJdm9pZCAqVmFbTUFYX0RFU0NfUEVSX1JJTkdfUlhdOwoJdm9pZCAqQnVmZmVyMVtNQVhfREVTQ19QRVJfUklOR19SWF07Cgl2b2lkICpCdWZmZXIyW01BWF9ERVNDX1BFUl9SSU5HX1JYXTsKCXUzMiBQQUhpZ2hbTUFYX0RFU0NfUEVSX1JJTkdfUlhdOwoJdTMyIFBBTG93W01BWF9ERVNDX1BFUl9SSU5HX1JYXTsKfSBGQlJMT09LVVBUQUJMRSwgKlBGQlJMT09LVVBUQUJMRTsKCnR5cGVkZWYgZW51bSB7CglPTkVfUEFDS0VUX0lOVEVSUlVQVCwKCUZPVVJfUEFDS0VUX0lOVEVSUlVQVAp9IGVSWF9JTlRFUlJVUFRfU1RBVEVfdCwgKlBlUlhfSU5URVJSVVBUX1NUQVRFX3Q7CgovKgogKiBTdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgc2tiJ3MgaW4gYSBsaXN0CiAqLwp0eXBlZGVmIHN0cnVjdCByeF9za2JfbGlzdF9lbGVtIHsKCXN0cnVjdCBsaXN0X2hlYWQgc2tiX2xpc3RfZWxlbTsKCWRtYV9hZGRyX3QgZG1hX2FkZHI7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwp9IFJYX1NLQl9MSVNUX0VMRU0sICpQUlhfU0tCX0xJU1RfRUxFTTsKCi8qCiAqIFJYX1JJTkdfdCBpcyBzcnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGFkYXB0b3IncyBsb2NhbCByZWZlcmVuY2UocykgdG8gdGhlCiAqIHJpbmdzCiAqLwp0eXBlZGVmIHN0cnVjdCBfcnhfcmluZ190IHsKI2lmZGVmIFVTRV9GQlIwCgl2b2lkICpwRmJyMFJpbmdWYTsKCWRtYV9hZGRyX3QgcEZicjBSaW5nUGE7Cgl2b2lkICpGYnIwTWVtVmFbTUFYX0RFU0NfUEVSX1JJTkdfUlggLyBGQlJfQ0hVTktTXTsKCWRtYV9hZGRyX3QgRmJyME1lbVBhW01BWF9ERVNDX1BFUl9SSU5HX1JYIC8gRkJSX0NIVU5LU107Cgl1aW50NjRfdCBGYnIwUmVhbHBhOwoJdWludDY0X3QgRmJyMG9mZnNldDsKCURNQTEwV190IGxvY2FsX0ZicjBfZnVsbDsKCXUzMiBGYnIwTnVtRW50cmllczsKCXUzMiBGYnIwQnVmZmVyU2l6ZTsKI2VuZGlmCgl2b2lkICpwRmJyMVJpbmdWYTsKCWRtYV9hZGRyX3QgcEZicjFSaW5nUGE7Cgl2b2lkICpGYnIxTWVtVmFbTUFYX0RFU0NfUEVSX1JJTkdfUlggLyBGQlJfQ0hVTktTXTsKCWRtYV9hZGRyX3QgRmJyMU1lbVBhW01BWF9ERVNDX1BFUl9SSU5HX1JYIC8gRkJSX0NIVU5LU107Cgl1aW50NjRfdCBGYnIxUmVhbHBhOwoJdWludDY0X3QgRmJyMW9mZnNldDsKCUZCUkxPT0tVUFRBQkxFICpGYnJbMl07CglETUExMFdfdCBsb2NhbF9GYnIxX2Z1bGw7Cgl1MzIgRmJyMU51bUVudHJpZXM7Cgl1MzIgRmJyMUJ1ZmZlclNpemU7CgoJdm9pZCAqcFBTUmluZ1ZhOwoJZG1hX2FkZHJfdCBwUFNSaW5nUGE7Cgl1aW50NjRfdCBwUFNSaW5nUmVhbFBhOwoJdWludDY0X3QgcFBTUmluZ09mZnNldDsKCVJYRE1BX1BTUl9GVUxMX09GRlNFVF90IGxvY2FsX3Bzcl9mdWxsOwoJdTMyIFBzck51bUVudHJpZXM7CgoJdm9pZCAqcFJ4U3RhdHVzVmE7CglkbWFfYWRkcl90IHBSeFN0YXR1c1BhOwoJdWludDY0X3QgUnhTdGF0dXNSZWFsUEE7Cgl1aW50NjRfdCBSeFN0YXR1c09mZnNldDsKCglzdHJ1Y3QgbGlzdF9oZWFkIFJlY3ZCdWZmZXJQb29sOwoKCS8qIFJFQ1YgKi8KCXN0cnVjdCBsaXN0X2hlYWQgUmVjdkxpc3Q7CglzdHJ1Y3QgbGlzdF9oZWFkIFJlY3ZQZW5kaW5nTGlzdDsKCXUzMiBuUmVhZHlSZWN2OwoKCXUzMiBOdW1SZmQ7CgoJYm9vbCBVbmZpbmlzaGVkUmVjZWl2ZXM7CgoJc3RydWN0IGxpc3RfaGVhZCBSZWN2UGFja2V0UG9vbDsKCgkvKiBsb29rYXNpZGUgbGlzdHMgKi8KCXN0cnVjdCBrbWVtX2NhY2hlICpSZWN2TG9va2FzaWRlOwp9IFJYX1JJTkdfdCwgKlBSWF9SSU5HX3Q7CgovKiBGb3J3YXJkIHJlZmVyZW5jZSBvZiBSRkQgKi8Kc3RydWN0IF9NUF9SRkQ7CgovKiBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlICovCnN0cnVjdCBldDEzMXhfYWRhcHRlcjsKCi8qIFBST1RPVFlQRVMgZm9yIEluaXRpYWxpemF0aW9uICovCmludCBldDEzMXhfcnhfZG1hX21lbW9yeV9hbGxvYyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwp2b2lkIGV0MTMxeF9yeF9kbWFfbWVtb3J5X2ZyZWUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKaW50IGV0MTMxeF9yZmRfcmVzb3VyY2VzX2FsbG9jKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwKCQkJICAgICAgIHN0cnVjdCBfTVBfUkZEICpwTXBSZmQpOwp2b2lkIGV0MTMxeF9yZmRfcmVzb3VyY2VzX2ZyZWUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLAoJCQkgICAgICAgc3RydWN0IF9NUF9SRkQgKnBNcFJmZCk7CmludCBldDEzMXhfaW5pdF9yZWN2KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Cgp2b2lkIENvbmZpZ1J4RG1hUmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwp2b2lkIFNldFJ4RG1hVGltZXIoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKdm9pZCBldDEzMXhfcnhfZG1hX2Rpc2FibGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKdm9pZCBldDEzMXhfcnhfZG1hX2VuYWJsZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwoKdm9pZCBldDEzMXhfcmVzZXRfcmVjdihzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwoKdm9pZCBldDEzMXhfaGFuZGxlX3JlY3ZfaW50ZXJydXB0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CgojZW5kaWYgLyogX19FVDEzMTBfUlhfSF9fICovCg==