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