ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvc3JjL3dhdGNoZG9nLXNpbXBsZS5jIGIvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy9zcmMvd2F0Y2hkb2ctc2ltcGxlLmMKaW5kZXggODVjZjE3Yy4uNDc4MDFiYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy9zcmMvd2F0Y2hkb2ctc2ltcGxlLmMKKysrIGIvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy9zcmMvd2F0Y2hkb2ctc2ltcGxlLmMKQEAgLTEsNCArMSw2IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxmY250bC5oPgogCiBpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2F0OTFybTkyMDBka19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2F0OTFybTkyMDBka19kZWZjb25maWcKaW5kZXggYzgyZTQ2Ni4uYjQzMDQxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9hdDkxcm05MjAwZGtfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXJtOTIwMGRrX2RlZmNvbmZpZwpAQCAtNTc3LDcgKzU3Nyw3IEBACiAjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCiAjCiAjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKLUNPTkZJR19BVDkxX1dBVENIRE9HPXkKK0NPTkZJR19BVDkxUk05MjAwX1dBVENIRE9HPXkKIAogIwogIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXJtOTIwMGVrX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXJtOTIwMGVrX2RlZmNvbmZpZwppbmRleCBiOTgzZmM1Li5kOTZmYzgzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2F0OTFybTkyMDBla19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9hdDkxcm05MjAwZWtfZGVmY29uZmlnCkBAIC01NTgsNyArNTU4LDcgQEAKICMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKICMKICMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAotQ09ORklHX0FUOTFfV0FUQ0hET0c9eQorQ09ORklHX0FUOTFSTTkyMDBfV0FUQ0hET0c9eQogCiAjCiAjIFVTQi1iYXNlZCBXYXRjaGRvZyBDYXJkcwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9jc2IzMzdfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9jc2IzMzdfZGVmY29uZmlnCmluZGV4IGEyZDZmZDMuLjIwZTY4MjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvY3NiMzM3X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2NzYjMzN19kZWZjb25maWcKQEAgLTYxNSw3ICs2MTUsNyBAQAogIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycwogIwogIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0Ci1DT05GSUdfQVQ5MV9XQVRDSERPRz15CitDT05GSUdfQVQ5MVJNOTIwMF9XQVRDSERPRz15CiAKICMKICMgVVNCLWJhc2VkIFdhdGNoZG9nIENhcmRzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2NzYjYzN19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2NzYjYzN19kZWZjb25maWcKaW5kZXggMmExYWM2Yy4uZGY4NTk1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9jc2I2MzdfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvY3NiNjM3X2RlZmNvbmZpZwpAQCAtNjE1LDcgKzYxNSw3IEBACiAjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCiAjCiAjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKLUNPTkZJR19BVDkxX1dBVENIRE9HPXkKK0NPTkZJR19BVDkxUk05MjAwX1dBVENIRE9HPXkKIAogIwogIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mva2FmYV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2thZmFfZGVmY29uZmlnCmluZGV4IDU0ZmNkNzUuLmE0Y2RhZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mva2FmYV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9rYWZhX2RlZmNvbmZpZwpAQCAtNTYwLDcgKzU2MCw3IEBACiAjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCiAjCiAjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKLUNPTkZJR19BVDkxX1dBVENIRE9HPXkKK0NPTkZJR19BVDkxUk05MjAwX1dBVENIRE9HPXkKICMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9vbmVhcm1fZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9vbmVhcm1fZGVmY29uZmlnCmluZGV4IGNiMWQ5NGYuLjliOWYyMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mvb25lYXJtX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL29uZWFybV9kZWZjb25maWcKQEAgLTYwNyw3ICs2MDcsNyBAQAogIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycwogIwogIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0Ci1DT05GSUdfQVQ5MV9XQVRDSERPRz15CitDT05GSUdfQVQ5MVJNOTIwMF9XQVRDSERPRz15CiAKICMKICMgVVNCLWJhc2VkIFdhdGNoZG9nIENhcmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnCmluZGV4IDg5ZTQ2ZDZkLi4wMTg3YjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvS2NvbmZpZwpAQCAtMTMsNyArMTMsNyBAQAogCSAgc3Vic2VxdWVudGx5IG9wZW5pbmcgdGhlIGZpbGUgYW5kIHRoZW4gZmFpbGluZyB0byB3cml0ZSB0byBpdCBmb3IKIAkgIGxvbmdlciB0aGFuIDEgbWludXRlIHdpbGwgcmVzdWx0IGluIHJlYm9vdGluZyB0aGUgbWFjaGluZS4gVGhpcwogCSAgY291bGQgYmUgdXNlZnVsIGZvciBhIG5ldHdvcmtlZCBtYWNoaW5lIHRoYXQgbmVlZHMgdG8gY29tZSBiYWNrCi0JICBvbmxpbmUgYXMgZmFzdCBhcyBwb3NzaWJsZSBhZnRlciBhIGxvY2stdXAuIFRoZXJlJ3MgYm90aCBhIHdhdGNoZG9nCisJICBvbi1saW5lIGFzIGZhc3QgYXMgcG9zc2libGUgYWZ0ZXIgYSBsb2NrLXVwLiBUaGVyZSdzIGJvdGggYSB3YXRjaGRvZwogCSAgaW1wbGVtZW50YXRpb24gZW50aXJlbHkgaW4gc29mdHdhcmUgKHdoaWNoIGNhbiBzb21ldGltZXMgZmFpbCB0bwogCSAgcmVib290IHRoZSBtYWNoaW5lKSBhbmQgYSBkcml2ZXIgZm9yIGhhcmR3YXJlIHdhdGNoZG9nIGJvYXJkcywgd2hpY2gKIAkgIGFyZSBtb3JlIHJvYnVzdCBhbmQgY2FuIGFsc28ga2VlcCB0cmFjayBvZiB0aGUgdGVtcGVyYXR1cmUgaW5zaWRlCkBAIC02MCw3ICs2MCw3IEBACiAKICMgQVJNIEFyY2hpdGVjdHVyZQogCi1jb25maWcgQVQ5MV9XQVRDSERPRworY29uZmlnIEFUOTFSTTkyMDBfV0FUQ0hET0cKIAl0cmlzdGF0ZSAiQVQ5MVJNOTIwMCB3YXRjaGRvZyIKIAlkZXBlbmRzIG9uIFdBVENIRE9HICYmIEFSQ0hfQVQ5MVJNOTIwMAogCWhlbHAKQEAgLTcxLDcgKzcxLDcgQEAKIAl0cmlzdGF0ZSAiREMyMTI4NSB3YXRjaGRvZyIKIAlkZXBlbmRzIG9uIFdBVENIRE9HICYmIEZPT1RCUklER0UKIAloZWxwCi0JICBUaGUgSW50ZWwgRm9vdGJyaWRnZSBjaGlwIGNvbnRhaW5zIGEgYnVpbHRpbiB3YXRjaGRvZyBjaXJjdWl0LiBTYXkgWQorCSAgVGhlIEludGVsIEZvb3RicmlkZ2UgY2hpcCBjb250YWlucyBhIGJ1aWx0LWluIHdhdGNoZG9nIGNpcmN1aXQuIFNheSBZCiAJICBoZXJlIGlmIHlvdSB3aXNoIHRvIHVzZSB0aGlzLiBBbHRlcm5hdGl2ZWx5IHNheSBNIHRvIGNvbXBpbGUgdGhlCiAJICBkcml2ZXIgYXMgYSBtb2R1bGUsIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdkdDI4NS4KIApAQCAtMjY5LDExICsyNjksMTEgQEAKIAkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCiAKIGNvbmZpZyBJQk1BU1IKLSAgICAgICAgdHJpc3RhdGUgIklCTSBBdXRvbWF0aWMgU2VydmVyIFJlc3RhcnQiCi0gICAgICAgIGRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2Ci0gICAgICAgIGhlbHAKKwl0cmlzdGF0ZSAiSUJNIEF1dG9tYXRpYyBTZXJ2ZXIgUmVzdGFydCIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFg4NgorCWhlbHAKIAkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIElCTSBBdXRvbWF0aWMgU2VydmVyIFJlc3RhcnQgd2F0Y2hkb2cKLQkgIHRpbWVyIGJ1aWx0aW4gaW50byBzb21lIGVTZXJ2ZXIgeFNlcmllcyBtYWNoaW5lcy4KKwkgIHRpbWVyIGJ1aWx0LWluIGludG8gc29tZSBlU2VydmVyIHhTZXJpZXMgbWFjaGluZXMuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlibWFzci4KQEAgLTMxNiwxMyArMzE2LDE2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpOHh4X3Rjby4KIAorCSAgTm90ZTogVGhpcyBkcml2ZXIgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZS4gUGxlYXNlCisJICB1c2UgdGhlIEludGVsIFRDTyBUaW1lci9XYXRjaGRvZyBkcml2ZXIuCisKIGNvbmZpZyBJVENPX1dEVAotCXRyaXN0YXRlICJJbnRlbCBUQ08gVGltZXIvV2F0Y2hkb2cgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBXQVRDSERPRyAmJiAoWDg2IHx8IElBNjQpICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiSW50ZWwgVENPIFRpbWVyL1dhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgKFg4NiB8fCBJQTY0KSAmJiBQQ0kKIAktLS1oZWxwLS0tCiAJICBIYXJkd2FyZSBkcml2ZXIgZm9yIHRoZSBpbnRlbCBUQ08gdGltZXIgYmFzZWQgd2F0Y2hkb2cgZGV2aWNlcy4KIAkgIFRoZXNlIGRyaXZlcnMgYXJlIGluY2x1ZGVkIGluIHRoZSBJbnRlbCA4MjgwMSBJL08gQ29udHJvbGxlcgotCSAgSHViIGZhbWlseSAnZnJvbSBJQ0gwIHVwIHRvIElDSDcpIGFuZCBpbiB0aGUgSW50ZWwgNjMwMEVTQgorCSAgSHViIGZhbWlseSAoZnJvbSBJQ0gwIHVwIHRvIElDSDgpIGFuZCBpbiB0aGUgSW50ZWwgNjMwMEVTQgogCSAgY29udHJvbGxlciBodWIuCiAKIAkgIFRoZSBUQ08gKFRvdGFsIENvc3Qgb2YgT3duZXJzaGlwKSB0aW1lciBpcyBhIHdhdGNoZG9nIHRpbWVyCkBAIC0zOTUsNiArMzk4LDI2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjcHU1d2R0LgogCitjb25maWcgU01TQzM3Qjc4N19XRFQKKwl0cmlzdGF0ZSAiV2luYm9uZCBTTXNDMzdCNzg3IFdhdGNoZG9nIFRpbWVyIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgY29tcG9uZW50IG9uIHRoZQorCSAgV2luYm9uZCBTTXNDMzdCNzg3IGNoaXBzZXQgYXMgdXNlZCBvbiB0aGUgTmV0UnVubmVyIE1haW5ib2FyZAorCSAgZnJvbSBWaXNpb24gU3lzdGVtcyBhbmQgbWF5YmUgb3RoZXJzLgorCisJICBUaGlzIHdhdGNoZG9nIHNpbXBseSB3YXRjaGVzIHlvdXIga2VybmVsIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0CisJICBmcmVlemUsIGFuZCBpZiBpdCBkb2VzLCBpdCByZWJvb3RzIHlvdXIgY29tcHV0ZXIgYWZ0ZXIgYSBjZXJ0YWluCisJICBhbW91bnQgb2YgdGltZS4KKworCSAgVXN1YWxseSBhIHVzZXJzcGFjZSBkYWVtb24gd2lsbCBub3RpZnkgdGhlIGtlcm5lbCBXRFQgZHJpdmVyIHRoYXQKKwkgIHVzZXJzcGFjZSBpcyBzdGlsbCBhbGl2ZSwgYXQgcmVndWxhciBpbnRlcnZhbHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNtc2MzN2I3ODdfd2R0LgorCisJICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgorCiBjb25maWcgVzgzNjI3SEZfV0RUCiAJdHJpc3RhdGUgIlc4MzYyN0hGIFdhdGNoZG9nIFRpbWVyIgogCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CkBAIC00MTAsNiArNDMzLDIxIEBACiAKIAkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCiAKK2NvbmZpZyBXODM2OTdIRl9XRFQKKwl0cmlzdGF0ZSAiVzgzNjk3SEYvVzgzNjk3SEcgV2F0Y2hkb2cgVGltZXIiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBoYXJkd2FyZSB3YXRjaGRvZyBvbiB0aGUgVzgzNjk3SEYvSEcKKwkgIGNoaXBzZXQgYXMgdXNlZCBpbiBEZWRpYm94L1ZJQSBtb3RoZXJib2FyZHMgKGFuZCBsaWtlbHkgb3RoZXJzKS4KKwkgIFRoaXMgd2F0Y2hkb2cgc2ltcGx5IHdhdGNoZXMgeW91ciBrZXJuZWwgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QKKwkgIGZyZWV6ZSwgYW5kIGlmIGl0IGRvZXMsIGl0IHJlYm9vdHMgeW91ciBjb21wdXRlciBhZnRlciBhIGNlcnRhaW4KKwkgIGFtb3VudCBvZiB0aW1lLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3ODM2OTdoZl93ZHQuCisKKwkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCisKIGNvbmZpZyBXODM4NzdGX1dEVAogCXRyaXN0YXRlICJXODM4NzdGIChFTUFDUykgV2F0Y2hkb2cgVGltZXIiCiAJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKQEAgLTQ0Myw3ICs0ODEsNyBAQAogCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CiAJLS0taGVscC0tLQogCSAgSWYgeW91IGFyZSB1c2luZyBhIFpGIE1pY3JvIE1hY2haIHByb2Nlc3Nvciwgc2F5IFkgaGVyZSwgb3RoZXJ3aXNlCi0JICBOLiAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgd2F0Y2hkb2cgdGltZXIgYnVpbHRpbiBvbiB0aGF0CisJICBOLiAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgd2F0Y2hkb2cgdGltZXIgYnVpbHQtaW4gb24gdGhhdAogCSAgcHJvY2Vzc29yIHVzaW5nIFpGLUxvZ2ljIGludGVyZmFjZS4gIFRoaXMgd2F0Y2hkb2cgc2ltcGx5IHdhdGNoZXMKIAkgIHlvdXIga2VybmVsIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGZyZWV6ZSwgYW5kIGlmIGl0IGRvZXMsIGl0CiAJICByZWJvb3RzIHlvdXIgY29tcHV0ZXIgYWZ0ZXIgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lLgpAQCAtNDcyLDcgKzUxMCw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzYmNfZXB4X2MzLgogCi0KICMgUG93ZXJQQyBBcmNoaXRlY3R1cmUKIAogY29uZmlnIDh4eF9XRFQKQEAgLTUwMiw3ICs1MzksNyBAQAogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGFkZHMgd2F0Y2hkb2cgc3VwcG9ydCBmb3IgdGhlIFJUQVMgd2F0Y2hkb2cuCiAKLSAgICAgICAgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGUgbW9kdWxlCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCB3ZHJ0YXMuCiAKICMgTUlQUyBBcmNoaXRlY3R1cmUKQEAgLTU1Niw3ICs1OTMsNyBAQAogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlLCB1c2VyIGFwcGxpY2F0aW9ucyB3aWxsIGJlIGFibGUgdG8gbW1hcCB0aGUKIAkgIFdEVC9DUEcgcmVnaXN0ZXJzLgotIworCiAjIFNQQVJDNjQgQXJjaGl0ZWN0dXJlCiAKIGNvbmZpZyBXQVRDSERPR19DUDFYWFgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9NYWtlZmlsZQppbmRleCA3ZjcwYWJhLi4zNjQ0MDQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL01ha2VmaWxlCkBAIC0yMyw3ICsyMyw3IEBACiBvYmotJChDT05GSUdfVVNCUENXQVRDSERPRykgKz0gcGN3ZF91c2IubwogCiAjIEFSTSBBcmNoaXRlY3R1cmUKLW9iai0kKENPTkZJR19BVDkxX1dBVENIRE9HKSArPSBhdDkxX3dkdC5vCitvYmotJChDT05GSUdfQVQ5MVJNOTIwMF9XQVRDSERPRykgKz0gYXQ5MXJtOTIwMF93ZHQubwogb2JqLSQoQ09ORklHX09NQVBfV0FUQ0hET0cpICs9IG9tYXBfd2R0Lm8KIG9iai0kKENPTkZJR18yMTI4NV9XQVRDSERPRykgKz0gd2R0Mjg1Lm8KIG9iai0kKENPTkZJR185NzdfV0FUQ0hET0cpICs9IHdkdDk3Ny5vCkBAIC01Myw3ICs1Myw5IEBACiBvYmotJChDT05GSUdfNjBYWF9XRFQpICs9IHNiYzYweHh3ZHQubwogb2JqLSQoQ09ORklHX1NCQzgzNjBfV0RUKSArPSBzYmM4MzYwLm8KIG9iai0kKENPTkZJR19DUFU1X1dEVCkgKz0gY3B1NXdkdC5vCitvYmotJChDT05GSUdfU01TQzM3Qjc4N19XRFQpICs9IHNtc2MzN2I3ODdfd2R0Lm8KIG9iai0kKENPTkZJR19XODM2MjdIRl9XRFQpICs9IHc4MzYyN2hmX3dkdC5vCitvYmotJChDT05GSUdfVzgzNjk3SEZfV0RUKSArPSB3ODM2OTdoZl93ZHQubwogb2JqLSQoQ09ORklHX1c4Mzg3N0ZfV0RUKSArPSB3ODM4NzdmX3dkdC5vCiBvYmotJChDT05GSUdfVzgzOTc3Rl9XRFQpICs9IHc4Mzk3N2Zfd2R0Lm8KIG9iai0kKENPTkZJR19NQUNIWl9XRFQpICs9IG1hY2h6d2QubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2F0OTFfd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvYXQ5MXJtOTIwMF93ZHQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9jaGFyL3dhdGNoZG9nL2F0OTFfd2R0LmMKcmVuYW1lIHRvIGRyaXZlcnMvY2hhci93YXRjaGRvZy9hdDkxcm05MjAwX3dkdC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaVRDT193ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pVENPX3dkdC5jCmluZGV4IGFhYWM5NGQuLmI2ZjI5Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pVENPX3dkdC5jCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pVENPX3dkdC5jCkBAIC0zNSw2ICszNSwxMCBAQAogICoJODI4MDFHREggKElDSDdESCkgICAgOiBkb2N1bWVudCBudW1iZXIgMzA3MDEzLTAwMiwgMzA3MDE0LTAwOSwKICAqCTgyODAxR0JNIChJQ0g3LU0pICAgIDogZG9jdW1lbnQgbnVtYmVyIDMwNzAxMy0wMDIsIDMwNzAxNC0wMDksCiAgKgk4MjgwMUdITSAoSUNINy1NIERIKSA6IGRvY3VtZW50IG51bWJlciAzMDcwMTMtMDAyLCAzMDcwMTQtMDA5LAorICoJODI4MDFIQiAgKElDSDgpICAgICAgOiBkb2N1bWVudCBudW1iZXIgMzEzMDU2LTAwMiwgMzEzMDU3LTAwNCwKKyAqCTgyODAxSFIgIChJQ0g4UikgICAgIDogZG9jdW1lbnQgbnVtYmVyIDMxMzA1Ni0wMDIsIDMxMzA1Ny0wMDQsCisgKgk4MjgwMUhIICAoSUNIOERIKSAgICA6IGRvY3VtZW50IG51bWJlciAzMTMwNTYtMDAyLCAzMTMwNTctMDA0LAorICoJODI4MDFITyAgKElDSDhETykgICAgOiBkb2N1bWVudCBudW1iZXIgMzEzMDU2LTAwMiwgMzEzMDU3LTAwNCwKICAqCTYzMDBFU0IgICg2MzAwRVNCKSAgIDogZG9jdW1lbnQgbnVtYmVyIDMwMDY0MS0wMDMKICAqLwogCkBAIC00NSw3ICs0OSw3IEBACiAvKiBNb2R1bGUgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KICNkZWZpbmUgRFJWX05BTUUgICAgICAgICJpVENPX3dkdCIKICNkZWZpbmUgRFJWX1ZFUlNJT04gICAgICIxLjAwIgotI2RlZmluZSBEUlZfUkVMREFURSAgICAgIjMwLUp1bC0yMDA2IgorI2RlZmluZSBEUlZfUkVMREFURSAgICAgIjA4LU9jdC0yMDA2IgogI2RlZmluZSBQRlgJCURSVl9OQU1FICI6ICIKIAogLyogSW5jbHVkZXMgKi8KQEAgLTg1LDYgKzg5LDkgQEAKIAlUQ09fSUNINywJLyogSUNINyAmIElDSDdSICovCiAJVENPX0lDSDdNLAkvKiBJQ0g3LU0gKi8KIAlUQ09fSUNIN01ESCwJLyogSUNINy1NIERIICovCisJVENPX0lDSDgsCS8qIElDSDggJiBJQ0g4UiAqLworCVRDT19JQ0g4REgsCS8qIElDSDhESCAqLworCVRDT19JQ0g4RE8sCS8qIElDSDhETyAqLwogfTsKIAogc3RhdGljIHN0cnVjdCB7CkBAIC0xMDgsNiArMTE1LDkgQEAKIAl7IklDSDcgb3IgSUNIN1IiLCAyfSwKIAl7IklDSDctTSIsIDJ9LAogCXsiSUNINy1NIERIIiwgMn0sCisJeyJJQ0g4IG9yIElDSDhSIiwgMn0sCisJeyJJQ0g4REgiLCAyfSwKKwl7IklDSDhETyIsIDJ9LAogCXtOVUxMLDB9CiB9OwogCkBAIC0xMzUsNiArMTQ1LDkgQEAKIAl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18wLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBUQ09fSUNINyAgICB9LAogCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzEsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRDT19JQ0g3TSAgIH0sCiAJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMzEsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRDT19JQ0g3TURIIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVENPX0lDSDggICAgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF8yLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBUQ09fSUNIOERIICB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzMsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRDT19JQ0g4RE8gIH0sCiAJeyAwLCB9LAkJCS8qIEVuZCBvZiBsaXN0ICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBpVENPX3dkdF9wY2lfdGJsKTsKQEAgLTM1NSw3ICszNjgsOCBAQAogCQlzcGluX3VubG9jaygmaVRDT193ZHRfcHJpdmF0ZS5pb19sb2NrKTsKIAogCQkqdGltZV9sZWZ0ID0gKHZhbDggKiA2KSAvIDEwOwotCX0KKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQyNiw3ICs0NDAsNiBAQAogewogCWludCBuZXdfb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKIAlpbnQgbmV3X2hlYXJ0YmVhdDsKLQlpbnQgdGltZV9sZWZ0OwogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCBfX3VzZXIgKnAgPSBhcmdwOwogCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKQEAgLTQ4Niw2ICs0OTksOCBAQAogCiAJCWNhc2UgV0RJT0NfR0VUVElNRUxFRlQ6CiAJCXsKKwkJCWludCB0aW1lX2xlZnQ7CisKIAkJCWlmIChpVENPX3dkdF9nZXRfdGltZWxlZnQoJnRpbWVfbGVmdCkpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zM2MyNDEwX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMKaW5kZXggNjhiMWNhOTc2Li4xOGNiMDUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYwpAQCAtMzgwLDE4ICszODAsMjEgQEAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOwogCWlmIChyZXMgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZmFpbGVkIHRvIGdldCBpcnEgcmVzb3VyY2VcbiIpOworCQlpb3VubWFwKHdkdF9iYXNlKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCiAJcmV0ID0gcmVxdWVzdF9pcnEocmVzLT5zdGFydCwgczNjMjQxMHdkdF9pcnEsIDAsIHBkZXYtPm5hbWUsIHBkZXYpOwogCWlmIChyZXQgIT0gMCkgewogCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZmFpbGVkIHRvIGluc3RhbGwgaXJxICglZClcbiIsIHJldCk7CisJCWlvdW5tYXAod2R0X2Jhc2UpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCXdkdF9jbG9jayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIndhdGNoZG9nIik7CiAJaWYgKHdkdF9jbG9jayA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0lORk8gUEZYICJmYWlsZWQgdG8gZmluZCB3YXRjaGRvZyBjbG9jayBzb3VyY2VcbiIpOworCQlpb3VubWFwKHdkdF9iYXNlKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCkBAIC00MTUsNiArNDE4LDcgQEAKIAlpZiAocmV0KSB7CiAJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoJWQpXG4iLAogCQkJV0FUQ0hET0dfTUlOT1IsIHJldCk7CisJCWlvdW5tYXAod2R0X2Jhc2UpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNDUxLDYgKzQ1NSw3IEBACiAJCXdkdF9jbG9jayA9IE5VTEw7CiAJfQogCisJaW91bm1hcCh3ZHRfYmFzZSk7CiAJbWlzY19kZXJlZ2lzdGVyKCZzM2MyNDEwd2R0X21pc2NkZXYpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3Ntc2MzN2I3ODdfd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc21zYzM3Yjc4N193ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjU2OTEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3Ntc2MzN2I3ODdfd2R0LmMKQEAgLTAsMCArMSw2MjcgQEAKKy8qCisgKglTTXNDIDM3Qjc4NyBXYXRjaGRvZyBUaW1lciBkcml2ZXIgZm9yIExpbnV4IDIuNi54LngKKyAqCisgKiAgICAgIEJhc2VkIG9uIGFjcXVpcmV3ZHQuYyBieSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICogICAgICAgYW5kIHNvbWUgb3RoZXIgZXhpc3RpbmcgZHJpdmVycworICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGF1dGhvcnMgZG8gTk9UIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZSB3YXJyYW50eSBmb3IKKyAqCWFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJBUy1JUyIgaW4KKyAqICAgICAgdGhlIGhvcGUgdGhhdCBpdCBtYXkgYmUgdXNlZnVsIGZvciBvdGhlcnMuCisgKgorICoJKEMpIENvcHlyaWdodCAyMDAzLTIwMDYgIFN2ZW4gQW5kZXJzIDxhbmRlcnNAYW5kdXJhcy5kZT4KKyAqCisgKiAgSGlzdG9yeToKKyAqCTIwMDMgLSBDcmVhdGVkIHZlcnNpb24gMS4wIGZvciBMaW51eCAyLjQueC4KKyAqCTIwMDYgLSBQb3J0ZWQgdG8gTGludXggMi42LCBhZGRlZCBub3dheW91dCBhbmQgTUFHSUNDTE9TRQorICogICAgICAgICAgICAgZmVhdHVyZXMuIFJlbGVhc2VkIHZlcnNpb24gMS4xCisgKgorICogIFRoZW9yeSBvZiBvcGVyYXRpb246CisgKgorICogICAgICBBIFdhdGNoZG9nIFRpbWVyIChXRFQpIGlzIGEgaGFyZHdhcmUgY2lyY3VpdCB0aGF0IGNhbgorICogICAgICByZXNldCB0aGUgY29tcHV0ZXIgc3lzdGVtIGluIGNhc2Ugb2YgYSBzb2Z0d2FyZSBmYXVsdC4KKyAqICAgICAgWW91IHByb2JhYmx5IGtuZXcgdGhhdCBhbHJlYWR5LgorICoKKyAqICAgICAgVXN1YWxseSBhIHVzZXJzcGFjZSBkYWVtb24gd2lsbCBub3RpZnkgdGhlIGtlcm5lbCBXRFQgZHJpdmVyCisgKiAgICAgIHZpYSB0aGUgL2Rldi93YXRjaGRvZyBzcGVjaWFsIGRldmljZSBmaWxlIHRoYXQgdXNlcnNwYWNlIGlzCisgKiAgICAgIHN0aWxsIGFsaXZlLCBhdCByZWd1bGFyIGludGVydmFscy4gIFdoZW4gc3VjaCBhIG5vdGlmaWNhdGlvbgorICogICAgICBvY2N1cnMsIHRoZSBkcml2ZXIgd2lsbCB1c3VhbGx5IHRlbGwgdGhlIGhhcmR3YXJlIHdhdGNoZG9nCisgKiAgICAgIHRoYXQgZXZlcnl0aGluZyBpcyBpbiBvcmRlciwgYW5kIHRoYXQgdGhlIHdhdGNoZG9nIHNob3VsZCB3YWl0CisgKiAgICAgIGZvciB5ZXQgYW5vdGhlciBsaXR0bGUgd2hpbGUgdG8gcmVzZXQgdGhlIHN5c3RlbS4KKyAqICAgICAgSWYgdXNlcnNwYWNlIGZhaWxzIChSQU0gZXJyb3IsIGtlcm5lbCBidWcsIHdoYXRldmVyKSwgdGhlCisgKiAgICAgIG5vdGlmaWNhdGlvbnMgY2Vhc2UgdG8gb2NjdXIsIGFuZCB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgd2lsbAorICogICAgICByZXNldCB0aGUgc3lzdGVtIChjYXVzaW5nIGEgcmVib290KSBhZnRlciB0aGUgdGltZW91dCBvY2N1cnMuCisgKgorICogQ3JlYXRlIGRldmljZSB3aXRoOgorICogIG1rbm9kIC9kZXYvd2F0Y2hkb2cgYyAxMCAxMzAKKyAqCisgKiBGb3IgYW4gZXhhbXBsZSB1c2Vyc3BhY2Uga2VlcC1hbGl2ZSBkYWVtb24sIHNlZToKKyAqICAgRG9jdW1lbnRhdGlvbi93YXRjaGRvZy93YXRjaGRvZy50eHQKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qIGVuYWJsZSBzdXBwb3J0IGZvciBtaW51dGVzIGFzIHVuaXRzPyAqLworLyogKGRvZXMgbm90IGFsd2F5cyB3b3JrIGNvcnJlY3RseSwgc28gZGlzYWJsZWQgYnkgZGVmYXVsdCEpICovCisjZGVmaW5lIFNNU0NfU1VQUE9SVF9NSU5VVEVTCisjdW5kZWYgU01TQ19TVVBQT1JUX01JTlVURVMKKworI2RlZmluZSBNQVhfVElNRU9VVCAgICAgMjU1CisKKyNkZWZpbmUgVU5JVF9TRUNPTkQgICAgIDAKKyNkZWZpbmUgVU5JVF9NSU5VVEUgICAgIDEKKworI2RlZmluZSBNT0ROQU1FCQkic21zYzM3Yjc4N193ZHQ6ICIKKyNkZWZpbmUgVkVSU0lPTiAgICAgICAgICIxLjEiCisKKyNkZWZpbmUgSU9QT1JUICAgICAgICAgIDB4M0YwCisjZGVmaW5lIElPUE9SVF9TSVpFICAgICAyCisjZGVmaW5lIElPREVWX05PICAgICAgICA4CisKK3N0YXRpYyBpbnQgdW5pdCA9IFVOSVRfU0VDT05EOyAgLyogdGltZXIncyB1bml0ICovCitzdGF0aWMgaW50IHRpbWVvdXQgPSA2MDsgICAgICAgIC8qIHRpbWVvdXQgdmFsdWU6IGRlZmF1bHQgaXMgNjAgInVuaXRzIiAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXJfZW5hYmxlZCA9IDA7ICAgLyogaXMgdGhlIHRpbWVyIGVuYWJsZWQ/ICovCisKK3N0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsgICAgICAgLyogaXMgdGhlIGNsb3NlIGV4cGVjdGVkPyAqLworCitzdGF0aWMgc3BpbmxvY2tfdCBpb19sb2NrOwkvKiB0byBndWFyZCB0aGUgd2F0Y2hkb2cgZnJvbSBpbyByYWNlcyAqLworCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7CisKKy8qIC0tIExvdyBsZXZlbCBmdW5jdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogdW5sb2NrIHRoZSBJTyBjaGlwICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvcGVuX2lvX2NvbmZpZyh2b2lkKQoreworICAgICAgICBvdXRiKDB4NTUsIElPUE9SVCk7CisJbWRlbGF5KDEpOworICAgICAgICBvdXRiKDB4NTUsIElPUE9SVCk7Cit9CisKKy8qIGxvY2sgdGhlIElPIGNoaXAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbG9zZV9pb19jb25maWcodm9pZCkKK3sKKyAgICAgICAgb3V0YigweEFBLCBJT1BPUlQpOworfQorCisvKiBzZWxlY3QgdGhlIElPIGRldmljZSAqLworc3RhdGljIGlubGluZSB2b2lkIHNlbGVjdF9pb19kZXZpY2UodW5zaWduZWQgY2hhciBkZXZubykKK3sKKyAgICAgICAgb3V0YigweDA3LCBJT1BPUlQpOworICAgICAgICBvdXRiKGRldm5vLCBJT1BPUlQrMSk7Cit9CisKKy8qIHdyaXRlIHRvIHRoZSBjb250cm9sIHJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfaW9fY3IodW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKyAgICAgICAgb3V0YihyZWcsIElPUE9SVCk7CisgICAgICAgIG91dGIoZGF0YSwgSU9QT1JUKzEpOworfQorCisvKiByZWFkIGZyb20gdGhlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciByZWFkX2lvX2NyKHVuc2lnbmVkIGNoYXIgcmVnKQoreworICAgICAgICBvdXRiKHJlZywgSU9QT1JUKTsKKyAgICAgICAgcmV0dXJuIGluYihJT1BPUlQrMSk7Cit9CisKKy8qIC0tIE1lZGl1bSBsZXZlbCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSB2b2lkIGdwaW9fYml0MTIodW5zaWduZWQgY2hhciByZWcpCit7CisJLy8gLS0gR2VuZXJhbCBQdXJwb3NlIEkvTyBCaXQgMS4yIC0tCisJLy8gQml0IDAsICAgSW4vT3V0OiAwID0gT3V0cHV0LCAxID0gSW5wdXQKKwkvLyBCaXQgMSwgICBQb2xhcml0eTogMCA9IE5vIEludmVydCwgMSA9IEludmVydAorCS8vIEJpdCAyLCAgIEdyb3VwIEVuYWJsZSBJbnRyLjogMCA9IERpc2FibGUsIDEgPSBFbmFibGUKKwkvLyBCaXQgMy80LCBGdW5jdGlvbiBzZWxlY3Q6IDAwID0gR1BJL08sIDAxID0gV0RULCAxMCA9IFAxNywKKwkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIDExID0gRWl0aGVyIEVkZ2UgVHJpZ2dlcmVkIEludHIuIDIKKyAgICAgICAgLy8gQml0IDUvNiAgKFJlc2VydmVkKQorCS8vIEJpdCA3LCAgIE91dHB1dCBUeXBlOiAwID0gUHVzaCBQdWxsIEJpdCwgMSA9IE9wZW4gRHJhaW4KKyAgICAgICAgd3JpdGVfaW9fY3IoMHhFMiwgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdwaW9fYml0MTModW5zaWduZWQgY2hhciByZWcpCit7CisJLy8gLS0gR2VuZXJhbCBQdXJwb3NlIEkvTyBCaXQgMS4zIC0tCisJLy8gQml0IDAsICBJbi9PdXQ6IDAgPSBPdXRwdXQsIDEgPSBJbnB1dAorCS8vIEJpdCAxLCAgUG9sYXJpdHk6IDAgPSBObyBJbnZlcnQsIDEgPSBJbnZlcnQKKwkvLyBCaXQgMiwgIEdyb3VwIEVuYWJsZSBJbnRyLjogMCA9IERpc2FibGUsIDEgPSBFbmFibGUKKwkvLyBCaXQgMywgIEZ1bmN0aW9uIHNlbGVjdDogMCA9IEdQSS9PLCAxID0gTEVECisgICAgICAgIC8vIEJpdCA0LTYgKFJlc2VydmVkKQorCS8vIEJpdCA3LCAgT3V0cHV0IFR5cGU6IDAgPSBQdXNoIFB1bGwgQml0LCAxID0gT3BlbiBEcmFpbgorICAgICAgICB3cml0ZV9pb19jcigweEUzLCByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2R0X3RpbWVyX3VuaXRzKHVuc2lnbmVkIGNoYXIgbmV3X3VuaXRzKQoreworCS8vIC0tIFdhdGNoZG9nIHRpbWVyIHVuaXRzIC0tCisJLy8gQml0IDAtNiAoUmVzZXJ2ZWQpCisJLy8gQml0IDcsICBXRFQgVGltZS1vdXQgVmFsdWUgVW5pdHMgU2VsZWN0CisJLy8gICAgICAgICAoMCA9IE1pbnV0ZXMsIDEgPSBTZWNvbmRzKQorICAgICAgICB3cml0ZV9pb19jcigweEYxLCBuZXdfdW5pdHMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2R0X3RpbWVvdXRfdmFsdWUodW5zaWduZWQgY2hhciBuZXdfdGltZW91dCkKK3sKKwkvLyAtLSBXYXRjaGRvZyBUaW1lciBUaW1lLW91dCBWYWx1ZSAtLQorCS8vIEJpdCAwLTcgQmluYXJ5IGNvZGVkIHVuaXRzICgwPURpc2FibGVkLCAxLi4yNTUpCisgICAgICAgIHdyaXRlX2lvX2NyKDB4RjIsIG5ld190aW1lb3V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdkdF90aW1lcl9jb25mKHVuc2lnbmVkIGNoYXIgY29uZikKK3sKKwkvLyAtLSBXYXRjaGRvZyB0aW1lciBjb25maWd1cmF0aW9uIC0tCisJLy8gQml0IDAgICBKb3lzdGljayBlbmFibGU6IDAqID0gTm8gUmVzZXQsIDEgPSBSZXNldCBXRFQgdXBvbiBHYW1lcG9ydCBJL08KKwkvLyBCaXQgMSAgIEtleWJvYXJkIGVuYWJsZTogMCogPSBObyBSZXNldCwgMSA9IFJlc2V0IFdEVCB1cG9uIEtCRCBJbnRyLgorCS8vIEJpdCAyICAgTW91c2UgZW5hYmxlOiAwKiA9IE5vIFJlc2V0LCAxID0gUmVzZXQgV0RUIHVwb24gTW91c2UgSW50ci4KKyAgICAgICAgLy8gQml0IDMgICBSZXNldCB0aGUgdGltZXIKKyAgICAgICAgLy8gICAgICAgICAoV3JvbmcgaW4gU01zQyBkb2N1bWVudGF0aW9uPyBHaXZlbiBhczogUG93ZXJMRUQgVGltb3V0IEVuYWJsZWQpCisJLy8gQml0IDQtNyBXRFQgSW50ZXJydXB0IE1hcHBpbmc6ICgwMDAwKiA9IERpc2FibGVkLAorCS8vICAgICAgICAgICAgMDAwMT1JUlExLCAwMDEwPShJbnZhbGlkKSwgMDAxMT1JUlEzIHRvIDExMTE9SVJRMTUpCisgICAgICAgIHdyaXRlX2lvX2NyKDB4RjMsIGNvbmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2R0X3RpbWVyX2N0cmwodW5zaWduZWQgY2hhciByZWcpCit7CisJLy8gLS0gV2F0Y2hkb2cgdGltZXIgY29udHJvbCAtLQorCS8vIEJpdCAwICAgU3RhdHVzIEJpdDogMCA9IFRpbWVyIGNvdW50aW5nLCAxID0gVGltZW91dCBvY2N1cmVkCisJLy8gQml0IDEgICBQb3dlciBMRUQgVG9nZ2xlOiAwID0gRGlzYWJsZSBUb2dnbGUsIDEgPSBUb2dnbGUgYXQgMSBIegorCS8vIEJpdCAyICAgRm9yY2UgVGltZW91dDogMSA9IEZvcmNlcyBXRCB0aW1lb3V0IGV2ZW50IChzZWxmLWNsZWFuaW5nKQorCS8vIEJpdCAzICAgUDIwIEZvcmNlIFRpbWVvdXQgZW5hYmxlZDoKKwkvLyAgICAgICAgICAwID0gUDIwIGFjdGl2aXR5IGRvZXMgbm90IGdlbmVyYXRlIHRoZSBXRCB0aW1lb3V0IGV2ZW50CisJLy8gICAgICAgICAgMSA9IFAyMCBBbGxvd3MgcmlzaW5nIGVkZ2Ugb2YgUDIwLCBmcm9tIHRoZSBrZXlib2FyZAorCS8vICAgICAgICAgICAgICBjb250cm9sbGVyLCB0byBmb3JjZSB0aGUgV0QgdGltZW91dCBldmVudC4KKwkvLyBCaXQgNCAgIChSZXNlcnZlZCkKKwkvLyAtLSBTb2Z0IHBvd2VyIG1hbmFnZW1lbnQgLS0KKwkvLyBCaXQgNSAgIFN0b3AgQ291bnRlcjogMSA9IFN0b3Agc29mdHdhcmUgcG93ZXIgZG93biBjb3VudGVyCisJLy8gICAgICAgICAgICBzZXQgdmlhIHJlZ2lzdGVyIDB4QjgsIChzZWxmLWNsZWFuaW5nKQorCS8vICAgICAgICAgICAgKFVwb24gcmVhZDogMCA9IENvdW50ZXIgcnVubmluZywgMSA9IENvdW50ZXIgc3RvcHBlZCkKKwkvLyBCaXQgNiAgIFJlc3RhcnQgQ291bnRlcjogMSA9IFJlc3RhcnQgc29mdHdhcmUgcG93ZXIgZG93biBjb3VudGVyCisJLy8gICAgICAgICAgICBzZXQgdmlhIHJlZ2lzdGVyIDB4QjgsIChzZWxmLWNsZWFuaW5nKQorCS8vIEJpdCA3ICAgU1BPRkY6IDEgPSBGb3JjZSBzb2Z0d2FyZSBwb3dlciBkb3duIChzZWxmLWNsZWFuaW5nKQorCisgICAgICAgIHdyaXRlX2lvX2NyKDB4RjQsIHJlZyk7Cit9CisKKy8qIC0tIEhpZ2hlciBsZXZlbCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogaW5pdGlhbGl6ZSB3YXRjaGRvZyAqLworCitzdGF0aWMgdm9pZCB3Yl9zbXNjX3dkdF9pbml0aWFsaXplKHZvaWQpCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgb2xkOworCisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKyAgICAgICAgb3Blbl9pb19jb25maWcoKTsKKyAgICAgICAgc2VsZWN0X2lvX2RldmljZShJT0RFVl9OTyk7CisKKwkvLyBlbmFibGUgdGhlIHdhdGNoZG9nCisJZ3Bpb19iaXQxMygweDA4KTsgIC8vIFNlbGVjdCBwaW4gODAgPSBMRUQgbm90IEdQSU8KKwlncGlvX2JpdDEyKDB4MEEpOyAgLy8gU2V0IHBpbiA3OSA9IFdEVCBub3QgR1BJTy9PdXRwdXQvUG9sYXJpdHk9SW52ZXJ0CisKKwkvLyBkaXNhYmxlIHRoZSB0aW1lb3V0CisgICAgICAgIHdkdF90aW1lb3V0X3ZhbHVlKDApOworCisJLy8gcmVzZXQgY29udHJvbCByZWdpc3RlcgorICAgICAgICB3ZHRfdGltZXJfY3RybCgweDAwKTsKKworCS8vIHJlc2V0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKwl3ZHRfdGltZXJfY29uZigweDAwKTsKKworCS8vIHJlYWQgb2xkICh0aW1lciB1bml0cykgcmVnaXN0ZXIKKyAgICAgICAgb2xkID0gcmVhZF9pb19jcigweEYxKSAmIDB4N0Y7CisgICAgICAgIGlmICh1bml0ID09IFVOSVRfU0VDT05EKSBvbGQgfD0gMHg4MDsgLy8gc2V0IHRvIHNlY29uZHMKKworCS8vIHNldCB0aGUgd2F0Y2hkb2cgdGltZXIgdW5pdHMKKyAgICAgICAgd2R0X3RpbWVyX3VuaXRzKG9sZCk7CisKKyAgICAgICAgY2xvc2VfaW9fY29uZmlnKCk7CisJc3Bpbl91bmxvY2soJmlvX2xvY2spOworfQorCisvKiBzaHV0ZG93biB0aGUgd2F0Y2hkb2cgKi8KKworc3RhdGljIHZvaWQgd2Jfc21zY193ZHRfc2h1dGRvd24odm9pZCkKK3sKKwlzcGluX2xvY2soJmlvX2xvY2spOworICAgICAgICBvcGVuX2lvX2NvbmZpZygpOworICAgICAgICBzZWxlY3RfaW9fZGV2aWNlKElPREVWX05PKTsKKworCS8vIGRpc2FibGUgdGhlIHdhdGNoZG9nCisgICAgICAgIGdwaW9fYml0MTMoMHgwOSk7CisgICAgICAgIGdwaW9fYml0MTIoMHgwOSk7CisKKwkvLyByZXNldCB3YXRjaGRvZyBjb25maWcgcmVnaXN0ZXIKKwl3ZHRfdGltZXJfY29uZigweDAwKTsKKworCS8vIHJlc2V0IHdhdGNoZG9nIGNvbnRyb2wgcmVnaXN0ZXIKKyAgICAgICAgd2R0X3RpbWVyX2N0cmwoMHgwMCk7CisKKwkvLyBkaXNhYmxlIHRpbWVvdXQKKyAgICAgICAgd2R0X3RpbWVvdXRfdmFsdWUoMHgwMCk7CisKKyAgICAgICAgY2xvc2VfaW9fY29uZmlnKCk7CisJc3Bpbl91bmxvY2soJmlvX2xvY2spOworfQorCisvKiBzZXQgdGltZW91dCA9PiBlbmFibGUgd2F0Y2hkb2cgKi8KKworc3RhdGljIHZvaWQgd2Jfc21zY193ZHRfc2V0X3RpbWVvdXQodW5zaWduZWQgY2hhciBuZXdfdGltZW91dCkKK3sKKwlzcGluX2xvY2soJmlvX2xvY2spOworICAgICAgICBvcGVuX2lvX2NvbmZpZygpOworICAgICAgICBzZWxlY3RfaW9fZGV2aWNlKElPREVWX05PKTsKKworCS8vIHNldCBQb3dlciBMRUQgdG8gYmxpbmssIGlmIHdlIGVuYWJsZSB0aGUgdGltZW91dAorICAgICAgICB3ZHRfdGltZXJfY3RybCgobmV3X3RpbWVvdXQgPT0gMCkgPyAweDAwIDogMHgwMik7CisKKwkvLyBzZXQgdGltZW91dCB2YWx1ZQorICAgICAgICB3ZHRfdGltZW91dF92YWx1ZShuZXdfdGltZW91dCk7CisKKyAgICAgICAgY2xvc2VfaW9fY29uZmlnKCk7CisJc3Bpbl91bmxvY2soJmlvX2xvY2spOworfQorCisvKiBnZXQgdGltZW91dCAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3Yl9zbXNjX3dkdF9nZXRfdGltZW91dCh2b2lkKQoreworICAgICAgICB1bnNpZ25lZCBjaGFyIHNldF90aW1lb3V0OworCisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKyAgICAgICAgb3Blbl9pb19jb25maWcoKTsKKyAgICAgICAgc2VsZWN0X2lvX2RldmljZShJT0RFVl9OTyk7CisgICAgICAgIHNldF90aW1lb3V0ID0gcmVhZF9pb19jcigweEYyKTsKKyAgICAgICAgY2xvc2VfaW9fY29uZmlnKCk7CisJc3Bpbl91bmxvY2soJmlvX2xvY2spOworCisgICAgICAgIHJldHVybiBzZXRfdGltZW91dDsKK30KKworLyogZGlzYWJsZSB3YXRjaGRvZyAqLworCitzdGF0aWMgdm9pZCB3Yl9zbXNjX3dkdF9kaXNhYmxlKHZvaWQpCit7CisgICAgICAgIC8vIHNldCB0aGUgdGltZW91dCB0byAwIHRvIGRpc2FibGUgdGhlIHdhdGNoZG9nCisgICAgICAgIHdiX3Ntc2Nfd2R0X3NldF90aW1lb3V0KDApOworfQorCisvKiBlbmFibGUgd2F0Y2hkb2cgYnkgc2V0dGluZyB0aGUgY3VycmVudCB0aW1lb3V0ICovCisKK3N0YXRpYyB2b2lkIHdiX3Ntc2Nfd2R0X2VuYWJsZSh2b2lkKQoreworICAgICAgICAvLyBzZXQgdGhlIGN1cnJlbnQgdGltZW91dC4uLgorICAgICAgICB3Yl9zbXNjX3dkdF9zZXRfdGltZW91dCh0aW1lb3V0KTsKK30KKworLyogcmVzZXQgdGhlIHRpbWVyICovCisKK3N0YXRpYyB2b2lkIHdiX3Ntc2Nfd2R0X3Jlc2V0X3RpbWVyKHZvaWQpCit7CisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKyAgICAgICAgb3Blbl9pb19jb25maWcoKTsKKyAgICAgICAgc2VsZWN0X2lvX2RldmljZShJT0RFVl9OTyk7CisKKwkvLyByZXNldCB0aGUgdGltZXIKKwl3ZHRfdGltZW91dF92YWx1ZSh0aW1lb3V0KTsKKwl3ZHRfdGltZXJfY29uZigweDA4KTsKKworICAgICAgICBjbG9zZV9pb19jb25maWcoKTsKKwlzcGluX3VubG9jaygmaW9fbG9jayk7Cit9CisKKy8qIHJldHVybiwgaWYgdGhlIHdhdGNoZG9nIGlzIGVuYWJsZWQgKHRpbWVvdXQgaXMgc2V0Li4uKSAqLworCitzdGF0aWMgaW50IHdiX3Ntc2Nfd2R0X3N0YXR1cyh2b2lkKQoreworCXJldHVybiAod2Jfc21zY193ZHRfZ2V0X3RpbWVvdXQoKSA9PSAwKSA/IDAgOiBXRElPRl9LRUVQQUxJVkVQSU5HOworfQorCisKKy8qIC0tIEZpbGUgb3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogb3BlbiA9PiBlbmFibGUgd2F0Y2hkb2cgYW5kIHNldCBpbml0aWFsIHRpbWVvdXQgKi8KKworc3RhdGljIGludCB3Yl9zbXNjX3dkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIC9kZXYvd2F0Y2hkb2cgY2FuIG9ubHkgYmUgb3BlbmVkIG9uY2UgKi8KKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ0aW1lcl9lbmFibGVkKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChub3dheW91dCkKKwkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKworCS8qIFJlbG9hZCBhbmQgYWN0aXZhdGUgdGltZXIgKi8KKwl3Yl9zbXNjX3dkdF9lbmFibGUoKTsKKworCXByaW50ayhLRVJOX0lORk8gTU9ETkFNRSAiV2F0Y2hkb2cgZW5hYmxlZC4gVGltZW91dCBzZXQgdG8gJWQgJXMuXG4iLCB0aW1lb3V0LCAodW5pdCA9PSBVTklUX1NFQ09ORCkgPyAic2Vjb25kKHMpIiA6ICJtaW51dGUocykiKTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworLyogY2xvc2UgPT4gc2h1dCBvZmYgdGhlIHRpbWVyICovCisKK3N0YXRpYyBpbnQgd2Jfc21zY193ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiBTaHV0IG9mZiB0aGUgdGltZXIuICovCisKKwlpZiAoZXhwZWN0X2Nsb3NlID09IDQyKSB7CisJICAgICAgICB3Yl9zbXNjX3dkdF9kaXNhYmxlKCk7CisJCXByaW50ayhLRVJOX0lORk8gTU9ETkFNRSAiV2F0Y2hkb2cgZGlzYWJsZWQsIHNsZWVwaW5nIGFnYWluLi4uXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUIE1PRE5BTUUgIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOworCQl3Yl9zbXNjX3dkdF9yZXNldF90aW1lcigpOworCX0KKworCWNsZWFyX2JpdCgwLCAmdGltZXJfZW5hYmxlZCk7CisJZXhwZWN0X2Nsb3NlID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyogd3JpdGUgPT4gdXBkYXRlIHRoZSB0aW1lciB0byBrZWVwIHRoZSBtYWNoaW5lIGFsaXZlICovCisKK3N0YXRpYyBzc2l6ZV90IHdiX3Ntc2Nfd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwKKwkJCQkgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCS8qIFNlZSBpZiB3ZSBnb3QgdGhlIG1hZ2ljIGNoYXJhY3RlciAnVicgYW5kIHJlbG9hZCB0aGUgdGltZXIgKi8KKwlpZiAobGVuKSB7CisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBpOworCisJCQkvKiByZXNldCBleHBlY3QgZmxhZyAqLworCQkJZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJLyogc2NhbiB0byBzZWUgd2hldGhlciBvciBub3Qgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgKi8KKwkJCWZvciAoaSA9IDA7IGkgIT0gbGVuOyBpKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGRhdGEraSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKworCQkvKiBzb21lb25lIHdyb3RlIHRvIHVzLCB3ZSBzaG91bGQgcmVsb2FkIHRoZSB0aW1lciAqLworCQl3Yl9zbXNjX3dkdF9yZXNldF90aW1lcigpOworCX0KKwlyZXR1cm4gbGVuOworfQorCisvKiBpb2N0bCA9PiBjb250cm9sIGludGVyZmFjZSAqLworCitzdGF0aWMgaW50IHdiX3Ntc2Nfd2R0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgbmV3X3RpbWVvdXQ7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB3YXRjaGRvZ19pbmZvIF9fdXNlciAqaWRlbnQ7CisJCWludCBfX3VzZXIgKmk7CisJfSB1YXJnOworCisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucyA9IAkJV0RJT0ZfS0VFUEFMSVZFUElORyB8CisJCSAgICAgICAgICAgICAgICAgICAgICAgIFdESU9GX1NFVFRJTUVPVVQgfAorCQkJCQlXRElPRl9NQUdJQ0NMT1NFLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9CTAsCisJCS5pZGVudGl0eSA9IAkJIlNNc0MgMzdCNzg3IFdhdGNoZG9nIgorCX07CisKKwl1YXJnLmkgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCXN3aXRjaCAoY21kKSB7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT1RUWTsKKworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlyZXR1cm4gY29weV90b191c2VyKHVhcmcuaWRlbnQsICZpZGVudCwKKwkJCQlzaXplb2YoaWRlbnQpKSA/IC1FRkFVTFQgOiAwOworCisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQkJcmV0dXJuIHB1dF91c2VyKHdiX3Ntc2Nfd2R0X3N0YXR1cygpLCB1YXJnLmkpOworCisJCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJCXJldHVybiBwdXRfdXNlcigwLCB1YXJnLmkpOworCisJCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQkJd2Jfc21zY193ZHRfcmVzZXRfdGltZXIoKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJCWlmIChnZXRfdXNlcihuZXdfdGltZW91dCwgdWFyZy5pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJLy8gdGhlIEFQSSBzdGF0ZXMgdGhpcyBpcyBnaXZlbiBpbiBzZWNzCisJCQlpZiAodW5pdCA9PSBVTklUX01JTlVURSkKKwkJCSAgbmV3X3RpbWVvdXQgLz0gNjA7CisKKwkJCWlmIChuZXdfdGltZW91dCA8IDAgfHwgbmV3X3RpbWVvdXQgPiBNQVhfVElNRU9VVCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJdGltZW91dCA9IG5ld190aW1lb3V0OworCQkJd2Jfc21zY193ZHRfc2V0X3RpbWVvdXQodGltZW91dCk7CisKKwkJCS8vIGZhbGwgdGhyb3VnaCBhbmQgcmV0dXJuIHRoZSBuZXcgdGltZW91dC4uLgorCisJCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKworCQkgICAgICAgIG5ld190aW1lb3V0ID0gdGltZW91dDsKKworCQkJaWYgKHVuaXQgPT0gVU5JVF9NSU5VVEUpCisJCQkgIG5ld190aW1lb3V0ICo9IDYwOworCisJCQlyZXR1cm4gcHV0X3VzZXIobmV3X3RpbWVvdXQsIHVhcmcuaSk7CisKKwkJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQl7CisJCQlpbnQgb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKKworCQkJaWYgKGdldF91c2VyKG9wdGlvbnMsIHVhcmcuaSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChvcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkJCQl3Yl9zbXNjX3dkdF9kaXNhYmxlKCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJaWYgKG9wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJCQkJd2Jfc21zY193ZHRfZW5hYmxlKCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KK30KKworLyogLS0gTm90aWZpZXIgZnVudGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHdiX3Ntc2Nfd2R0X25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKQorCXsKKyAgICAgICAgICAgICAgICAvLyBzZXQgdGltZW91dCB0byAwLCB0byBhdm9pZCBwb3NzaWJsZSByYWNlLWNvbmRpdGlvbgorCSAgICAgICAgdGltZW91dCA9IDA7CisJCXdiX3Ntc2Nfd2R0X2Rpc2FibGUoKTsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKiAtLSBNb2R1bGUncyBzdHJ1Y3R1cmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdiX3Ntc2Nfd2R0X2ZvcHMgPQoreworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSB3Yl9zbXNjX3dkdF93cml0ZSwKKwkuaW9jdGwJCT0gd2Jfc21zY193ZHRfaW9jdGwsCisJLm9wZW4JCT0gd2Jfc21zY193ZHRfb3BlbiwKKwkucmVsZWFzZQk9IHdiX3Ntc2Nfd2R0X3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdiX3Ntc2Nfd2R0X25vdGlmaWVyID0KK3sKKwkubm90aWZpZXJfY2FsbCAgPSB3Yl9zbXNjX3dkdF9ub3RpZnlfc3lzLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHdiX3Ntc2Nfd2R0X21pc2NkZXYgPQoreworCS5taW5vcgkJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQkJPSAid2F0Y2hkb2ciLAorCS5mb3BzCQk9ICZ3Yl9zbXNjX3dkdF9mb3BzLAorfTsKKworLyogLS0gTW9kdWxlIGluaXQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBtb2R1bGUncyAiY29uc3RydWN0b3IiICovCisKK3N0YXRpYyBpbnQgX19pbml0IHdiX3Ntc2Nfd2R0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2luaXQoJmlvX2xvY2spOworCisJcHJpbnRrKCJTTXNDIDM3Qjc4NyB3YXRjaGRvZyBjb21wb25lbnQgZHJpdmVyICIgVkVSU0lPTiAiIGluaXRpYWxpc2luZy4uLlxuIik7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKElPUE9SVCwgSU9QT1JUX1NJWkUsICJTTXNDIDM3Qjc4NyB3YXRjaGRvZyIpKSB7CisJCXByaW50ayhLRVJOX0VSUiBNT0ROQU1FICJVbmFibGUgdG8gcmVnaXN0ZXIgSU8gcG9ydCAlI3hcbiIsIElPUE9SVCk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXRfcG5wOworCX0KKworICAgICAgICAvLyBzZXQgbmV3IG1heGltdW0sIGlmIGl0J3MgdG9vIGJpZworICAgICAgICBpZiAodGltZW91dCA+IE1BWF9USU1FT1VUKQorICAgICAgICAgICAgICAgdGltZW91dCA9IE1BWF9USU1FT1VUOworCisgICAgICAgIC8vIGluaXQgdGhlIHdhdGNoZG9nIHRpbWVyCisgICAgICAgIHdiX3Ntc2Nfd2R0X2luaXRpYWxpemUoKTsKKworCXJldCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2Jfc21zY193ZHRfbm90aWZpZXIpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE1PRE5BTUUgIlVuYWJsZSB0byByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgZXJyID0gJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0X2lvOworCX0KKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJndiX3Ntc2Nfd2R0X21pc2NkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE1PRE5BTUUgIlVuYWJsZSB0byByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yICVkXG4iLCBXQVRDSERPR19NSU5PUik7CisJCWdvdG8gb3V0X3JidDsKKwl9CisKKwkvLyBvdXRwdXQgaW5mbworCXByaW50ayhLRVJOX0lORk8gTU9ETkFNRSAiVGltZW91dCBzZXQgdG8gJWQgJXMuXG4iLCB0aW1lb3V0LCAodW5pdCA9PSBVTklUX1NFQ09ORCkgPyAic2Vjb25kKHMpIiA6ICJtaW51dGUocykiKTsKKwlwcmludGsoS0VSTl9JTkZPIE1PRE5BTUUgIldhdGNoZG9nIGluaXRpYWxpemVkIGFuZCBzbGVlcGluZyAobm93YXlvdXQ9JWQpLi4uXG4iLCBub3dheW91dCk7CisKKwkvLyByZXQgPSAwCisKK291dF9jbGVhbjoKKwlyZXR1cm4gcmV0OworCitvdXRfcmJ0OgorCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3Yl9zbXNjX3dkdF9ub3RpZmllcik7CisKK291dF9pbzoKKwlyZWxlYXNlX3JlZ2lvbihJT1BPUlQsIElPUE9SVF9TSVpFKTsKKworb3V0X3BucDoKKwlnb3RvIG91dF9jbGVhbjsKK30KKworLyogbW9kdWxlJ3MgImRlc3RydWN0b3IiICovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3Yl9zbXNjX3dkdF9leGl0KHZvaWQpCit7CisJLyogU3RvcCB0aGUgdGltZXIgYmVmb3JlIHdlIGxlYXZlICovCisJaWYgKCFub3dheW91dCkKKwl7CisJCXdiX3Ntc2Nfd2R0X3NodXRkb3duKCk7CisJCXByaW50ayhLRVJOX0lORk8gTU9ETkFNRSAiV2F0Y2hkb2cgZGlzYWJsZWQuXG4iKTsKKwl9CisKKwltaXNjX2RlcmVnaXN0ZXIoJndiX3Ntc2Nfd2R0X21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3Yl9zbXNjX3dkdF9ub3RpZmllcik7CisJcmVsZWFzZV9yZWdpb24oSU9QT1JULCBJT1BPUlRfU0laRSk7CisKKwlwcmludGsoIlNNc0MgMzdCNzg3IHdhdGNoZG9nIGNvbXBvbmVudCBkcml2ZXIgcmVtb3ZlZC5cbiIpOworfQorCittb2R1bGVfaW5pdCh3Yl9zbXNjX3dkdF9pbml0KTsKK21vZHVsZV9leGl0KHdiX3Ntc2Nfd2R0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTdmVuIEFuZGVycyA8YW5kZXJzQGFuZHVyYXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgU01zQyAzN0I3ODcgd2F0Y2hkb2cgY29tcG9uZW50IChWZXJzaW9uICIgVkVSU0lPTiAiKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CisKKyNpZmRlZiBTTVNDX1NVUFBPUlRfTUlOVVRFUworbW9kdWxlX3BhcmFtKHVuaXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHVuaXQsICJzZXQgdW5pdCB0byB1c2UsIDA9c2Vjb25kcyBvciAxPW1pbnV0ZXMsIGRlZmF1bHQgaXMgMCIpOworI2VuZGlmCisKK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAicmFuZ2UgaXMgMS0yNTUgdW5pdHMsIGRlZmF1bHQgaXMgNjAiKTsKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzNjI3aGZfd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzNjI3aGZfd2R0LmMKaW5kZXggYjRhZGM1Mi4uMDdkNGJmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3c4MzYyN2hmX3dkdC5jCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ODM2MjdoZl93ZHQuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNDQsNiArNDUsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB3ZHRfaXNfb3BlbjsKIHN0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKK3N0YXRpYyBzcGlubG9ja190IGlvX2xvY2s7CiAKIC8qIFlvdSBtdXN0IHNldCB0aGlzIC0gdGhlcmUgaXMgbm8gc2FuZSB3YXkgdG8gcHJvYmUgZm9yIHRoaXMgYm9hcmQuICovCiBzdGF0aWMgaW50IHdkdF9pbyA9IDB4MkU7CkBAIC0xMTAsMTIgKzExMiwxNiBAQAogc3RhdGljIHZvaWQKIHdkdF9jdHJsKGludCB0aW1lb3V0KQogeworCXNwaW5fbG9jaygmaW9fbG9jayk7CisJCiAJdzgzNjI3aGZfc2VsZWN0X3dkX3JlZ2lzdGVyKCk7CiAKIAlvdXRiX3AoMHhGNiwgV0RUX0VGRVIpOyAgICAvKiBTZWxlY3QgQ1JGNiAqLwogCW91dGJfcCh0aW1lb3V0LCBXRFRfRUZEUik7IC8qIFdyaXRlIFRpbWVvdXQgY291bnRlciB0byBDUkY2ICovCiAKIAl3ODM2MjdoZl91bnNlbGVjdF93ZF9yZWdpc3RlcigpOworCisJc3Bpbl91bmxvY2soJmlvX2xvY2spOwogfQogCiBzdGF0aWMgaW50CkBAIC0zMDMsNiArMzA5LDggQEAKIHsKIAlpbnQgcmV0OwogCisJc3Bpbl9sb2NrX2luaXQoJmlvX2xvY2spOworCiAJcHJpbnRrKEtFUk5fSU5GTyAiV0RUIGRyaXZlciBmb3IgdGhlIFdpbmJvbmQoVE0pIFc4MzYyN0hGIFN1cGVyIEkvTyBjaGlwIGluaXRpYWxpc2luZy5cbiIpOwogCiAJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KHRpbWVvdXQpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzNjk3aGZfd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzNjk3aGZfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2OGI1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ODM2OTdoZl93ZHQuYwpAQCAtMCwwICsxLDQ1MCBAQAorLyoKKyAqCXc4MzY5N2hmL2hnIFdEVCBkcml2ZXIKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDYgU2FtdWVsIFRhcmRpZXUgPHNhbUByZmMxMTQ5Lm5ldD4KKyAqCShjKSBDb3B5cmlnaHQgMjAwNiBNYXJjdXMgSnVua2VyIDxqdW5rZXJAYW5kdXJhcy5kZT4KKyAqCisgKglCYXNlZCBvbiB3ODM2MjdoZl93ZHQuYyB3aGljaCBpcyBiYXNlZCBvbiBhZHZhbnRlY2h3ZHQuYworICoJd2hpY2ggaXMgYmFzZWQgb24gd2R0LmMuCisgKglPcmlnaW5hbCBjb3B5cmlnaHQgbWVzc2FnZXM6CisgKgorICoJKGMpIENvcHlyaWdodCAyMDAzIFDhZHJhaWcgQnJhZHkgPFBAZHJhaWdCcmFkeS5jb20+CisgKgorICoJKGMpIENvcHlyaWdodCAyMDAwLTIwMDEgTWFyZWsgTWljaGFsa2lld2ljeiA8bWFyZWttQGxpbnV4Lm9yZy5wbD4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDE5OTYgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgkJCQlodHRwOi8vd3d3LnJlZGhhdC5jb20KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCU5laXRoZXIgTWFyY3VzIEp1bmtlciBub3IgQU5EVVJBUyBBRyBhZG1pdCBsaWFiaWxpdHkgbm9yIHByb3ZpZGUKKyAqCXdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZAorICoJIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNkZWZpbmUgV0FUQ0hET0dfTkFNRSAidzgzNjk3aGYvaGcgV0RUIgorI2RlZmluZSBQRlggV0FUQ0hET0dfTkFNRSAiOiAiCisjZGVmaW5lIFdBVENIRE9HX1RJTUVPVVQgNjAJCS8qIDYwIHNlYyBkZWZhdWx0IHRpbWVvdXQgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2lzX29wZW47CitzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7CitzdGF0aWMgc3BpbmxvY2tfdCBpb19sb2NrOworCisvKiBZb3UgbXVzdCBzZXQgdGhpcyAtIHRoZXJlIGlzIG5vIHNhbmUgd2F5IHRvIHByb2JlIGZvciB0aGlzIGJvYXJkLiAqLworc3RhdGljIGludCB3ZHRfaW8gPSAweDJlOworbW9kdWxlX3BhcmFtKHdkdF9pbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod2R0X2lvLCAidzgzNjk3aGYvaGcgV0RUIGlvIHBvcnQgKGRlZmF1bHQgMHgyZSwgMCA9IGF1dG9kZXRlY3QpIik7CisKK3N0YXRpYyBpbnQgdGltZW91dCA9IFdBVENIRE9HX1RJTUVPVVQ7CS8qIGluIHNlY29uZHMgKi8KK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAiV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzLiAxPD0gdGltZW91dCA8PTI1NSwgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19USU1FT1VUKSAiLiIpOworCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7Cittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworLyoKKyAqCUtlcm5lbCBtZXRob2RzLgorICovCisKKyNkZWZpbmUgVzgzNjk3SEZfRUZFUiAod2R0X2lvKzApCS8qIEV4dGVuZGVkIEZ1bmN0aW9uIEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBXODM2OTdIRl9FRklSICh3ZHRfaW8rMCkJLyogRXh0ZW5kZWQgRnVuY3Rpb24gSW5kZXggUmVnaXN0ZXIgKHNhbWUgYXMgRUZFUikgKi8KKyNkZWZpbmUgVzgzNjk3SEZfRUZEUiAod2R0X2lvKzEpCS8qIEV4dGVuZGVkIEZ1bmN0aW9uIERhdGEgUmVnaXN0ZXIgKi8KKworc3RhdGljIGlubGluZSB2b2lkCit3ODM2OTdoZl91bmxvY2sodm9pZCkKK3sKKwlvdXRiX3AoMHg4NywgVzgzNjk3SEZfRUZFUik7CS8qIEVudGVyIGV4dGVuZGVkIGZ1bmN0aW9uIG1vZGUgKi8KKwlvdXRiX3AoMHg4NywgVzgzNjk3SEZfRUZFUik7CS8qIEFnYWluIGFjY29yZGluZyB0byBtYW51YWwgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkCit3ODM2OTdoZl9sb2NrKHZvaWQpCit7CisJb3V0Yl9wKDB4QUEsIFc4MzY5N0hGX0VGRVIpOwkvKiBMZWF2ZSBleHRlbmRlZCBmdW5jdGlvbiBtb2RlICovCit9CisKKy8qCisgKglUaGUgdGhyZWUgZnVuY3Rpb25zIHc4MzY5N2hmX2dldF9yZWcoKSwgdzgzNjk3aGZfc2V0X3JlZygpIGFuZAorICoJdzgzNjk3aGZfd3JpdGVfdGltZW91dCgpIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGRldmljZSB1bmxvY2tlZC4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhcgordzgzNjk3aGZfZ2V0X3JlZyh1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwlvdXRiX3AocmVnLCBXODM2OTdIRl9FRklSKTsKKwlyZXR1cm4gaW5iX3AoVzgzNjk3SEZfRUZEUik7Cit9CisKK3N0YXRpYyB2b2lkCit3ODM2OTdoZl9zZXRfcmVnKHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJb3V0Yl9wKHJlZywgVzgzNjk3SEZfRUZJUik7CisJb3V0Yl9wKGRhdGEsIFc4MzY5N0hGX0VGRFIpOworfQorCitzdGF0aWMgdm9pZAordzgzNjk3aGZfd3JpdGVfdGltZW91dChpbnQgdGltZW91dCkKK3sKKwl3ODM2OTdoZl9zZXRfcmVnKDB4RjQsIHRpbWVvdXQpOwkvKiBXcml0ZSBUaW1lb3V0IGNvdW50ZXIgdG8gQ1JGNCAqLworfQorCitzdGF0aWMgdm9pZAordzgzNjk3aGZfc2VsZWN0X3dkdCh2b2lkKQoreworCXc4MzY5N2hmX3VubG9jaygpOworCXc4MzY5N2hmX3NldF9yZWcoMHgwNywgMHgwOCk7CS8qIFN3aXRjaCB0byBsb2dpYyBkZXZpY2UgOCAoR1BJTzIpICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordzgzNjk3aGZfZGVzZWxlY3Rfd2R0KHZvaWQpCit7CisJdzgzNjk3aGZfbG9jaygpOworfQorCitzdGF0aWMgdm9pZAordzgzNjk3aGZfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgYmJ1ZjsKKworCXc4MzY5N2hmX3NlbGVjdF93ZHQoKTsKKworCWJidWYgPSB3ODM2OTdoZl9nZXRfcmVnKDB4MjkpOworCWJidWYgJj0gfjB4NjA7CisJYmJ1ZiB8PSAweDIwOworCXc4MzY5N2hmX3NldF9yZWcoMHgyOSwgYmJ1Zik7CS8qIFNldCBwaW4gMTE5IHRvIFdEVE8jIG1vZGUgKD0gQ1IyOSwgV0RUMCkgKi8KKworCWJidWYgPSB3ODM2OTdoZl9nZXRfcmVnKDB4RjMpOworCWJidWYgJj0gfjB4MDQ7CisJdzgzNjk3aGZfc2V0X3JlZygweEYzLCBiYnVmKTsJLyogQ291bnQgbW9kZSBpcyBzZWNvbmRzICovCisKKwl3ODM2OTdoZl9kZXNlbGVjdF93ZHQoKTsKK30KKworc3RhdGljIGludAord2R0X3Bpbmcodm9pZCkKK3sKKwlzcGluX2xvY2soJmlvX2xvY2spOworCXc4MzY5N2hmX3NlbGVjdF93ZHQoKTsKKworCXc4MzY5N2hmX3dyaXRlX3RpbWVvdXQodGltZW91dCk7CisKKwl3ODM2OTdoZl9kZXNlbGVjdF93ZHQoKTsKKwlzcGluX3VubG9jaygmaW9fbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9lbmFibGUodm9pZCkKK3sKKwlzcGluX2xvY2soJmlvX2xvY2spOworCXc4MzY5N2hmX3NlbGVjdF93ZHQoKTsKKworCXc4MzY5N2hmX3dyaXRlX3RpbWVvdXQodGltZW91dCk7CisJdzgzNjk3aGZfc2V0X3JlZygweDMwLCAxKTsJLyogRW5hYmxlIHRpbWVyICovCisKKwl3ODM2OTdoZl9kZXNlbGVjdF93ZHQoKTsKKwlzcGluX3VubG9jaygmaW9fbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9kaXNhYmxlKHZvaWQpCit7CisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKwl3ODM2OTdoZl9zZWxlY3Rfd2R0KCk7CisKKwl3ODM2OTdoZl9zZXRfcmVnKDB4MzAsIDApOwkvKiBEaXNhYmxlIHRpbWVyICovCisJdzgzNjk3aGZfd3JpdGVfdGltZW91dCgwKTsKKworCXc4MzY5N2hmX2Rlc2VsZWN0X3dkdCgpOworCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAord2R0X3NldF9oZWFydGJlYXQoaW50IHQpCit7CisJaWYgKCh0IDwgMSkgfHwgKHQgPiAyNTUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRpbWVvdXQgPSB0OworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAord2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpZiAoY291bnQpIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCWV4cGVjdF9jbG9zZSA9IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgIT0gY291bnQ7IGkrKykgeworCQkJCWNoYXIgYzsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgYnVmK2kpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisJCXdkdF9waW5nKCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludAord2R0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJaW50IG5ld190aW1lb3V0OworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKKwkJLmlkZW50aXR5ID0gIlc4MzY5N0hGIFdEVCIsCisJfTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mKGlkZW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQl3ZHRfcGluZygpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJaWYgKGdldF91c2VyKG5ld190aW1lb3V0LCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAod2R0X3NldF9oZWFydGJlYXQobmV3X3RpbWVvdXQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXdkdF9waW5nKCk7CisJCS8qIEZhbGwgKi8KKworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJcmV0dXJuIHB1dF91c2VyKHRpbWVvdXQsIHApOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCXsKKwkJaW50IG9wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisKKwkJaWYgKGdldF91c2VyKG9wdGlvbnMsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKG9wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkgeworCQkJd2R0X2Rpc2FibGUoKTsKKwkJCXJldHZhbCA9IDA7CisJCX0KKworCQlpZiAob3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCXdkdF9lbmFibGUoKTsKKwkJCXJldHZhbCA9IDA7CisJCX0KKworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAord2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJndkdF9pc19vcGVuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwkvKgorCSAqCUFjdGl2YXRlCisJICovCisKKwl3ZHRfZW5hYmxlKCk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50Cit3ZHRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGV4cGVjdF9jbG9zZSA9PSA0MikgeworCQl3ZHRfZGlzYWJsZSgpOworCX0gZWxzZSB7CisJCXByaW50ayAoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCXdkdF9waW5nKCk7CisJfQorCWV4cGVjdF9jbG9zZSA9IDA7CisJY2xlYXJfYml0KDAsICZ3ZHRfaXNfb3Blbik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglOb3RpZmllciBmb3Igc3lzdGVtIGRvd24KKyAqLworCitzdGF0aWMgaW50Cit3ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKKwl2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGUgPT0gU1lTX0RPV04gfHwgY29kZSA9PSBTWVNfSEFMVCkgeworCQkvKiBUdXJuIHRoZSBXRFQgb2ZmICovCisJCXdkdF9kaXNhYmxlKCk7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyoKKyAqCUtlcm5lbCBJbnRlcmZhY2VzCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2R0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSB3ZHRfd3JpdGUsCisJLmlvY3RsCQk9IHdkdF9pb2N0bCwKKwkub3BlbgkJPSB3ZHRfb3BlbiwKKwkucmVsZWFzZQk9IHdkdF9jbG9zZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3ZHRfbWlzY2RldiA9IHsKKwkubWlub3IgPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZSA9ICJ3YXRjaGRvZyIsCisJLmZvcHMgPSAmd2R0X2ZvcHMsCit9OworCisvKgorICoJVGhlIFdEVCBuZWVkcyB0byBsZWFybiBhYm91dCBzb2Z0IHNodXRkb3ducyBpbiBvcmRlciB0bworICoJdHVybiB0aGUgdGltZWJvbWIgcmVnaXN0ZXJzIG9mZi4KKyAqLworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdkdF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHdkdF9ub3RpZnlfc3lzLAorfTsKKworc3RhdGljIGludAordzgzNjk3aGZfY2hlY2tfd2R0KHZvaWQpCit7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbih3ZHRfaW8sIDIsIFdBVENIRE9HX05BTUUpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCV4IGFscmVhZHkgaW4gdXNlXG4iLCB3ZHRfaW8pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlwcmludGsgKEtFUk5fREVCVUcgUEZYICJMb29raW5nIGZvciB3YXRjaGRvZyBhdCBhZGRyZXNzIDB4JXhcbiIsIHdkdF9pbyk7CisJdzgzNjk3aGZfdW5sb2NrKCk7CisJaWYgKHc4MzY5N2hmX2dldF9yZWcoMHgyMCkgPT0gMHg2MCkgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIndhdGNoZG9nIGZvdW5kIGF0IGFkZHJlc3MgMHgleFxuIiwgd2R0X2lvKTsKKwkJdzgzNjk3aGZfbG9jaygpOworCQlyZXR1cm4gMDsKKwl9CisJdzgzNjk3aGZfbG9jaygpOwkvKiBSZXByb3RlY3QgaW4gY2FzZSBpdCB3YXMgYSBjb21wYXRpYmxlIGRldmljZSAqLworCisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJ3YXRjaGRvZyBub3QgZm91bmQgYXQgYWRkcmVzcyAweCV4XG4iLCB3ZHRfaW8pOworCXJlbGVhc2VfcmVnaW9uKHdkdF9pbywgMik7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgdzgzNjk3aGZfaW9wb3J0c1tdID0geyAweDJlLCAweDRlLCAweDAwIH07CisKK3N0YXRpYyBpbnQgX19pbml0Cit3ZHRfaW5pdCh2b2lkKQoreworCWludCByZXQsIGksIGZvdW5kID0gMDsKKworCXNwaW5fbG9ja19pbml0KCZpb19sb2NrKTsKKworCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiV0RUIGRyaXZlciBmb3IgVzgzNjk3SEYvSEcgaW5pdGlhbGl6aW5nXG4iKTsKKworCWlmICh3ZHRfaW8gPT0gMCkgeworCQkvKiB3ZSB3aWxsIGF1dG9kZXRlY3QgdGhlIFc4MzY5N0hGL0hHIHdhdGNoZG9nICovCisJCWZvciAoaSA9IDA7ICgoIWZvdW5kKSAmJiAodzgzNjk3aGZfaW9wb3J0c1tpXSAhPSAwKSk7IGkrKykgeworCQkJd2R0X2lvID0gdzgzNjk3aGZfaW9wb3J0c1tpXTsKKwkJCWlmICghdzgzNjk3aGZfY2hlY2tfd2R0KCkpCisJCQkJZm91bmQrKzsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghdzgzNjk3aGZfY2hlY2tfd2R0KCkpCisJCQlmb3VuZCsrOworCX0KKworCWlmICghZm91bmQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIk5vIFc4MzY5N0hGL0hHIGNvdWxkIGJlIGZvdW5kXG4iKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJdzgzNjk3aGZfaW5pdCgpOworCXdkdF9kaXNhYmxlKCk7CS8qIERpc2FibGUgd2F0Y2hkb2cgdW50aWwgZmlyc3QgdXNlICovCisKKwlpZiAod2R0X3NldF9oZWFydGJlYXQodGltZW91dCkpIHsKKwkJd2R0X3NldF9oZWFydGJlYXQoV0FUQ0hET0dfVElNRU9VVCk7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAidGltZW91dCB2YWx1ZSBtdXN0IGJlIDE8PXRpbWVvdXQ8PTI1NSwgdXNpbmcgJWRcbiIsCisJCQlXQVRDSERPR19USU1FT1VUKTsKKwl9CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLAorCQkJcmV0KTsKKwkJZ290byB1bnJlZ19yZWdpb25zOworCX0KKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJV0FUQ0hET0dfTUlOT1IsIHJldCk7CisJCWdvdG8gdW5yZWdfcmVib290OworCX0KKworCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiaW5pdGlhbGl6ZWQuIHRpbWVvdXQ9JWQgc2VjIChub3dheW91dD0lZClcbiIsCisJCXRpbWVvdXQsIG5vd2F5b3V0KTsKKworb3V0OgorCXJldHVybiByZXQ7Cit1bnJlZ19yZWJvb3Q6CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7Cit1bnJlZ19yZWdpb25zOgorCXJlbGVhc2VfcmVnaW9uKHdkdF9pbywgMik7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAord2R0X2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKKwlyZWxlYXNlX3JlZ2lvbih3ZHRfaW8sIDIpOworfQorCittb2R1bGVfaW5pdCh3ZHRfaW5pdCk7Cittb2R1bGVfZXhpdCh3ZHRfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk1hcmN1cyBKdW5rZXIgPGp1bmtlckBhbmR1cmFzLmRlPiwgU2FtdWVsIFRhcmRpZXUgPHNhbUByZmMxMTQ5Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigidzgzNjk3aGYvaGcgV0RUIGRyaXZlciIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwo=