LyogIAogKiAgQ29weXJpZ2h0IKkgMjAwOSBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCiAqCiAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiAqCiAqCiAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgIE1NVS5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqICAgICAgIFRoaXMgZmlsZSBNTVUgZGVzY3JpcHRvciBkZWZpbmVzIGFuZCBNTVUgaW50ZXJmYWNlIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbiAgICAgICAgKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCgojaWZuZGVmIE1NVV9ICiNkZWZpbmUgTU1VX0gKCiNpbmNsdWRlICJ0eXBlcy5oIgoKI2lmCSFkZWZpbmVkKEdlbk1NVVRhYikKZXh0ZXJuIHZvaWQgbWVtc2V0KHZvaWQgKmRzdCwgaW50IHZhbCwgdW5zaWduZWQgbG9uZyBsZW5ndGgpOwojZW5kaWYKCgovKgogKiBGaXJzdCBMZXZlbCBEZXNjcmlwdG9yIEF0dHJpYnV0ZXMKICovCiNkZWZpbmUgUEdFX1RZUEVfRkFVTFQJCQkweDAwMDAwMDAwCiNkZWZpbmUgUEdFX1RZUEVfQ09BUlNFCQkJMHgwMDAwMDAwMQojZGVmaW5lIFBHRV9UWVBFX1NFQ1RJT04JCTB4MDAwMDAwMDIKI2RlZmluZSBQR0VfVFlQRV9TVVBFUlNFQ1RJT04JMHgwMDA0MDAwMiAgLyogQVJNMTEgb25seSAqLwojZGVmaW5lIFBHRV9UWVBFX1JFU0VSVkVECQkweDAwMDAwMDAzCS8qIEFSTTExIG9ubHkgKi8KI2RlZmluZSBQR0VfVFlQRV9NQVNLCQkJMHgwMDA0MDAwMwojZGVmaW5lIFBHRV9ET01BSU5fTUFTSwkJCTB4MDAwMDAxRTAKI2RlZmluZSBQR0VfRE9NQUlOX1NISUZUCQk1CiNkZWZpbmUgUEdFX0RPTUFJTih4KSAgICAgICAgICAgKCgoeCkgPDwgNSkgJiBQR0VfRE9NQUlOX01BU0spCiNkZWZpbmUgUEdFX0FQX01BU0sJCQkJMHgwMDAwMEMwMAojZGVmaW5lIFBHRV9BUF9TSElGVAkJCTEwCiNkZWZpbmUgUEdFX0NBQ0hFX01BU0sJCQkweDAwMDAwMDBDCiNkZWZpbmUgUEdFX0NBQ0hFX1NISUZUCQkJMgoKI2RlZmluZSBQR0VfU0VDVElPTl9CQVNFX01BU0sJMHhGRkYwMDAwMAojZGVmaW5lIFBHRV9TRUNUSU9OX01BU0sJCTB4MDAwRkZGRkYKI2RlZmluZSBQR0VfU1VQRVJfQkFTRV9NQVNLCQkweEZGMDAwMDAwCiNkZWZpbmUgUEdFX1NVUEVSX01BU0sJCQkweDAwRkZGRkZGCiNkZWZpbmUgUEdFX0NPQVJTRV9CQVNFX01BU0sJMHhGRkZGRkMwMAojZGVmaW5lIFBHRV9DT0FSU0VfTUFTSwkJCTB4MDAwMDAzRkYKI2RlZmluZSBQR0VfQ09BUlNFX01BU0tfTEFSR0UJCTB4MDAwMEZGRkYKCiNkZWZpbmUgUEdFX1RZUEUocGdlKSAoKCgocGdlKSAmIDB4MDMpICE9IFBHRV9UWVBFX1NFQ1RJT04pID8gKHBnZSkgJiAweDAzIDogKHBnZSkgJiBQR0VfVFlQRV9NQVNLKQovKgogKiBGaXJzdCBMZXZlbCBEZXNjcmlwdG9yIEJhc2UgQWRkcmVzcwogKi8KI2RlZmluZSBQR0VfQkFTRV9NQVNLKHR5cGUpIAlcCgkofigxIDw8IFBHX0JBU0VfU0hJRlQodHlwZSkpICsgMSkKCiNkZWZpbmUgUEdFX0JBU0VfU0hJRlQodHlwZSkJXAoJKCgodHlwZSkgJiBQR19UWVBFX01BU0spID09IFBHX1RZUEVfU0VDVElPTikgPyAyMCA6ICBcCgkoKCh0eXBlKSAmIFBHX1RZUEVfTUFTSykgPT0gUEdfVFlQRV9DT0FSU0UpICA/IDEwIDogIFwKCSgoKHR5cGUpICYgUEdfVFlQRV9NQVNLKSA9PSBQR19UWVBFX0ZJTkUpICAgID8gMTIgOiAgXAoJKCgodHlwZSkgJiBQR19UWVBFX01BU0spID09IFBHX1RZUEVfU1VQRVJTRUNUSU9OKSA/IDI0IDogMzEKCi8qCiAqIE51bWJlciBvZiBlbnRyaWVzIGluIEZpcnN0IExldmVsIFRhYmxlCiAqLwojZGVmaW5lIFBHRV9FTlRSSUVTCQkJCTQwOTYKI2RlZmluZSBQR0VfUEFHRV9TSVpFCQkJKDQqUEdFX0VOVFJJRVMpCiNkZWZpbmUgUEdFX0VOVFJZX1NISUZUCQkJMjAKI2RlZmluZSBQR0VfRU5UUllfU0laRQkJCSgxIDw8IFBHRV9FTlRSWV9TSElGVCkKCi8qCiAqIFNlY29uZCBMZXZlbCBEZXNjcmlwdG9yIEF0dHJpYnV0ZXMKICovCiNkZWZpbmUgUFRFX1RZUEVfRkFVTFQJCQkweDAwMDAwMDAwCiNkZWZpbmUgUFRFX1RZUEVfTEFSR0VfUEFHRQkJMHgwMDAwMDAwMQojZGVmaW5lIFBURV9UWVBFX1NNQUxMX1BBR0UJCTB4MDAwMDAwMDIJLy8gCiNkZWZpbmUgUFRFX1RZUEVfVElOWV9QQUdFCQkweDAwMDAwMDAzCS8vIEFSTTkyMFQKI2RlZmluZSBQVEVfVFlQRV9NQVNLCQkJMHgwMDAwMDAwMwojZGVmaW5lIFBURV9DQUNIRV9TSElGVAkJCTIKI2RlZmluZSBQVEVfQVAwX1NISUZUCQkJNAojZGVmaW5lIFBURV9BUDFfU0hJRlQJCQk2CiNkZWZpbmUgUFRFX0FQMl9TSElGVAkJCTgKI2RlZmluZSBQVEVfQVAzX1NISUZUCQkJMTAKCi8qCiAqIFNlY29uZCBMZXZlbCBEZXNjcmlwdG9yIEJhc2UgQWRkcmVzcwogKi8KI2RlZmluZSBQVEVfQkFTRV9NQVNLKHR5cGUpCVwKCSh+KDEgPDwgUEdfQkFTRV9TSElGVCh0eXBlKSkgKyAxKQoKI2RlZmluZSBQVEVfQkFTRV9TSElGVCh0eXBlKQlcCgkoKCh0eXBlKSAmIFBHX1RZUEVfTUFTSykgPT0gUFRFX1RZUEVfTEFSR0VfUEFHRSkgPyAxNiA6ICBcCgkoKCh0eXBlKSAmIFBHX1RZUEVfTUFTSykgPT0gUFRFX1RZUEVfU01BTExfUEFHRSkgPyAxMiA6ICBcCgkoKCh0eXBlKSAmIFBHX1RZUEVfTUFTSykgPT0gUFRFX1RZUEVfVElOWV9QQUdFKSAgPyAxMCA6IDMxCgovKgogKiBOdW1iZXIgb2YgZW50cmllcyBpbiBTZWNvbmQgTGV2ZWwgVGFibGUKICovCiNkZWZpbmUgUFRFX0VOVFJJRVMJCQkJMjU2CiNkZWZpbmUgUFRFX0VOVFJZX1NISUZUCQkJMTIKI2RlZmluZSBQVEVfRU5UUllfU0laRQkJCSgxIDw8IFBURV9FTlRSWV9TSElGVCkKI2RlZmluZSBQVEVfUEFHRV9TSVpFCQkJKDQqUFRFX0VOVFJJRVMpCgovKgogKiBNaW5pbWFsIE1NVSB1bml0IHNpemUgKGJhc2VkIG9uIHNtYWxsIHBhZ2UpCiAqLwojZGVmaW5lIFBBR0VfU0laRQkJCQk0MDk2CiNkZWZpbmUgUEFHRV9TSElGVAkJCQkxMgojZGVmaW5lIFBBR0VfTUFTSwkJCQkweEZGRgoKI2RlZmluZSBQQUdFX01BU0tfTEFSR0UJCQkJMHhGRkZGCgovKiBNTVVfTWFwIGFjY2Vzc190eXBlIHZhbHVlcyAqLwojZGVmaW5lCU1NVV9OT19BQ0NFU1MJCQkweDAwCiNkZWZpbmUJTU1VX1NWQ19SVwkJCQkweDAxCiNkZWZpbmUgTU1VX1VTUl9STwkJCQkweDAyCiNkZWZpbmUJTU1VX0FMTF9BQ0NFU1MJCQkweDAzCgovKiBNTVVfTWFwIGNhY2hlX21vZGUgdmFsdWVzICovCiNkZWZpbmUJTU1VX0NBQ0hFX09GRgkJCTB4MDAKI2RlZmluZQlNTVVfQ0FDSEVfQgkJCQkweDAxCiNkZWZpbmUJTU1VX0NBQ0hFX0MJCQkJMHgwMgojZGVmaW5lCU1NVV9DQUNIRV9DQgkJCTB4MDMKCi8qIE1NVV9Mb2NrRG93blRMQiB0bGIgdmFsdWVzICovCiNkZWZpbmUgTU1VX0RUTEIJCQkJMHgwMQojZGVmaW5lIE1NVV9JVExCCQkJCTB4MDIKCi8qCiAqIE1NVSBJbnRlcmZhY2UgZnVuY3Rpb25zCiAqLwppbnQgIE1NVV9Jbml0KHZvaWQpOwp2b2lkIE1NVV9Mb2NrRG93blRMQihVMzIgYWRkciwgVTMyIHRsYiwgVTMyIHZpY3RpbSk7CmludCAgTU1VX01hcChVNjQgc3RhcnRfYWRkciwgVTY0IHNpemUsIFUzMiBhY2Nlc3NfdHlwZSwgVTMyIGNhY2hlX21vZGUpOwoKI2VuZGlmIC8qIE1NVV9IICovCgo=