LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBBVE1FTCBNaWNyb2NvbnRyb2xsZXIgU29mdHdhcmUgU3VwcG9ydA0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogQ29weXJpZ2h0IChjKSAyMDEwLCBBdG1lbCBDb3Jwb3JhdGlvbg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKg0KICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCiAqDQogKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZGlzY2xhaW1lciBiZWxvdy4NCiAqDQogKiBBdG1lbCdzIG5hbWUgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQogKg0KICogRElTQ0xBSU1FUjogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVE1FTCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUg0KICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRg0KICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVCBBUkUNCiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFUTUVMIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsDQogKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQogKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwNCiAqIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YNCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HDQogKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsDQogKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICovDQoNCi8qKiBcZmlsZQ0KICogIFxzZWN0aW9uIFB1cnBvc2UNCiAqDQogKiAgICBEZWZpbml0aW9ucyBhbmQgbWV0aG9kcyBmb3IgVVNCIGRlc2NyaXB0b3Igc3RydWN0dXJlcyBkZXNjcmliZWQgYnkgdGhlDQogKiAgICBVU0Igc3BlY2lmaWNhdGlvbi4NCiAqDQogKiAgXHNlY3Rpb24gVXNhZ2UNCiAqDQogKi8NCg0KI2lmbmRlZiBfVVNCREVTQ1JJUFRPUlNfSF8NCiNkZWZpbmUgX1VTQkRFU0NSSVBUT1JTX0hfDQovKiogXGFkZHRvZ3JvdXAgdXNiX2dlbmVyYWwNCiAqIEB7DQogKiBcYWRkdG9ncm91cCB1c2JfZGVzY3JpcHRvciBVU0IgRGVzY3JpcHRvcnMNCiAqICBAew0KICovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgIEhlYWRlcnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogVGhlc2UgaGVhZGVycyB3ZXJlIGludHJvZHVjZWQgaW4gQzk5IGJ5IHdvcmtpbmcgZ3JvdXANCiAqIElTTy9JRUMgSlRDMS9TQzIyL1dHMTQuDQogKi8NCiNpbmNsdWRlIDxzdGRpbnQuaD4NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgRGVmaW5pdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyotLS0tLS0tLS0gR2VuZXJpYyBEZXNjcmlwdG9ycyAtLS0tLS0tLSovDQoNCi8qKiBcYWRkdG9ncm91cCB1c2JfZGVzY190eXBlIFVTQiBEZXNjcmlwdG9yIHR5cGVzDQogKiAgICAgIEB7DQogKiAgVGhpcyBzZWN0aW9uIGxpc3RzIHRoZSBjb2RlcyBvZiB0aGUgdXNiIGRlc2NyaXB0b3IgdHlwZXMNCiAqICAtIFxyZWYgVVNCR2VuZXJpY0Rlc2NyaXB0b3JfREVWSUNFDQogKiAgLSBccmVmIFVTQkdlbmVyaWNEZXNjcmlwdG9yX0NPTkZJR1VSQVRJT04NCiAqICAtIFxyZWYgVVNCR2VuZXJpY0Rlc2NyaXB0b3JfU1RSSU5HDQogKiAgLSBccmVmIFVTQkdlbmVyaWNEZXNjcmlwdG9yX0lOVEVSRkFDRQ0KICogIC0gXHJlZiBVU0JHZW5lcmljRGVzY3JpcHRvcl9FTkRQT0lOVA0KICogIC0gXHJlZiBVU0JHZW5lcmljRGVzY3JpcHRvcl9ERVZJQ0VRVUFMSUZJRVINCiAqICAtIFxyZWYgVVNCR2VuZXJpY0Rlc2NyaXB0b3JfT1RIRVJTUEVFRENPTkZJR1VSQVRJT04NCiAqICAtIFxyZWYgVVNCR2VuZXJpY0Rlc2NyaXB0b3JfSU5URVJGQUNFUE9XRVINCiAqICAtIFxyZWYgVVNCR2VuZXJpY0Rlc2NyaXB0b3JfT1RHDQogKiAgLSBccmVmIFVTQkdlbmVyaWNEZXNjcmlwdG9yX0RFQlVHDQogKiAgLSBccmVmIFVTQkdlbmVyaWNEZXNjcmlwdG9yX0lOVEVSRkFDRUFTU09DSUFUSU9ODQogKi8NCi8qKiAgRGV2aWNlIGRlc2NyaXB0b3IgdHlwZS4gKi8NCiNkZWZpbmUgVVNCR2VuZXJpY0Rlc2NyaXB0b3JfREVWSUNFICAgICAgICAgICAgICAgICAgICAgMQ0KLyoqICBDb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgdHlwZS4gKi8NCiNkZWZpbmUgVVNCR2VuZXJpY0Rlc2NyaXB0b3JfQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgMg0KLyoqICBTdHJpbmcgZGVzY3JpcHRvciB0eXBlLiAqLw0KI2RlZmluZSBVU0JHZW5lcmljRGVzY3JpcHRvcl9TVFJJTkcgICAgICAgICAgICAgICAgICAgICAzDQovKiogIEludGVyZmFjZSBkZXNjcmlwdG9yIHR5cGUuICovDQojZGVmaW5lIFVTQkdlbmVyaWNEZXNjcmlwdG9yX0lOVEVSRkFDRSAgICAgICAgICAgICAgICAgIDQNCi8qKiAgRW5kcG9pbnQgZGVzY3JpcHRvciB0eXBlLiAqLw0KI2RlZmluZSBVU0JHZW5lcmljRGVzY3JpcHRvcl9FTkRQT0lOVCAgICAgICAgICAgICAgICAgICA1DQovKiogIERldmljZSBxdWFsaWZpZXIgZGVzY3JpcHRvciB0eXBlLiAqLw0KI2RlZmluZSBVU0JHZW5lcmljRGVzY3JpcHRvcl9ERVZJQ0VRVUFMSUZJRVIgICAgICAgICAgICA2DQovKiogIE90aGVyIHNwZWVkIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciB0eXBlLiAqLw0KI2RlZmluZSBVU0JHZW5lcmljRGVzY3JpcHRvcl9PVEhFUlNQRUVEQ09ORklHVVJBVElPTiAgICA3DQovKiogIEludGVyZmFjZSBwb3dlciBkZXNjcmlwdG9yIHR5cGUuICovDQojZGVmaW5lIFVTQkdlbmVyaWNEZXNjcmlwdG9yX0lOVEVSRkFDRVBPV0VSICAgICAgICAgICAgIDgNCi8qKiAgT24tVGhlLUdvIGRlc2NyaXB0b3IgdHlwZS4gKi8NCiNkZWZpbmUgVVNCR2VuZXJpY0Rlc2NyaXB0b3JfT1RHICAgICAgICAgICAgICAgICAgICAgICAgOQ0KLyoqICBEZWJ1ZyBkZXNjcmlwdG9yIHR5cGUuICovDQojZGVmaW5lIFVTQkdlbmVyaWNEZXNjcmlwdG9yX0RFQlVHICAgICAgICAgICAgICAgICAgICAgIDEwDQovKiogIEludGVyZmFjZSBhc3NvY2lhdGlvbiBkZXNjcmlwdG9yIHR5cGUuICovDQojZGVmaW5lIFVTQkdlbmVyaWNEZXNjcmlwdG9yX0lOVEVSRkFDRUFTU09DSUFUSU9OICAgICAgIDExDQovKiogICAgIEB9Ki8NCg0KDQovKi0tLS0tLS0tLSBEZXZpY2UgRGVzY3JpcHRvcnMgLS0tLS0tLS0qLw0KDQovKiogXGFkZHRvZ3JvdXAgdXNiX3JlbGVhc2VfbnVtYmVyIFVTQiByZWxlYXNlIG51bWJlcnMNCiAqICAgICAgQHsNCiAqICBUaGlzIHNlY3Rpb24gbGlzdHMgdGhlIGNvZGVzIG9mIFVTQiByZWxlYXNlIG51bWJlcnMuDQogKiAgLSBccmVmIFVTQkRldmljZURlc2NyaXB0b3JfVVNCMl8wMA0KICovDQoNCi8qKiAgVGhlIGRldmljZSBzdXBwb3J0cyBVU0IgMi4wMC4gKi8NCiNkZWZpbmUgVVNCRGV2aWNlRGVzY3JpcHRvcl9VU0IyXzAwICAgICAgICAgMHgwMjAwDQovKiogICAgIEB9Ki8NCg0KDQovKi0tLS0tLS0tLSBDb25maWd1cmF0aW9uIERlc2NyaXB0b3JzIC0tLS0tLS0tKi8NCg0KLyoqIFxhZGR0b2dyb3VwIHVzYl9hdHRyaWJ1dGVzIFVTQiBEZXZpY2UgQXR0cmlidXRlcw0KICogICAgICBAew0KICogVGhpcyBzZWN0aW9uIGxpc3RzIHRoZSBjb2RlcyBvZiB0aGUgdXNiIGF0dHJpYnV0ZXMuDQogKiAgLSBccmVmIFVTQkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yX0JVU1BPV0VSRURfTk9SV0FLRVVQDQogKiAgLSBccmVmIFVTQkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yX1NFTEZQT1dFUkVEX05PUldBS0VVUA0KICogIC0gXHJlZiBVU0JDb25maWd1cmF0aW9uRGVzY3JpcHRvcl9CVVNQT1dFUkVEX1JXQUtFVVANCiAqICAtIFxyZWYgVVNCQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JfU0VMRlBPV0VSRURfUldBS0VVUA0KICogIC0gXHJlZiBVU0JDb25maWd1cmF0aW9uRGVzY3JpcHRvcl9QT1dFUg0KICovDQovKiogRGV2aWNlIGlzIGJ1cy1wb3dlcmVkIGFuZCBub3Qgc3VwcG9ydCByZW1vdGUgd2FrZS11cC4gKi8NCiNkZWZpbmUgVVNCQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JfQlVTUE9XRVJFRF9OT1JXQUtFVVAgIDB4ODANCi8qKiBEZXZpY2UgaXMgc2VsZi1wb3dlcmVkIGFuZCBub3Qgc3VwcG9ydCByZW1vdGUgd2FrZS11cC4gKi8NCiNkZWZpbmUgVVNCQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JfU0VMRlBPV0VSRURfTk9SV0FLRVVQIDB4QzANCi8qKiBEZXZpY2UgaXMgYnVzLXBvd2VyZWQgIGFuZCBzdXBwb3J0cyByZW1vdGUgd2FrZS11cC4gKi8NCiNkZWZpbmUgVVNCQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JfQlVTUE9XRVJFRF9SV0FLRVVQICAgIDB4QTANCi8qKiBEZXZpY2UgaXMgc2VsZi1wb3dlcmVkIGFuZCBzdXBwb3J0cyByZW1vdGUgd2FrZS11cC4gKi8NCiNkZWZpbmUgVVNCQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JfU0VMRlBPV0VSRURfUldBS0VVUCAgIDB4RTANCi8qKiBDYWxjdWxhdGVzIHRoZSB2YWx1ZSBvZiB0aGUgcG93ZXIgY29uc3VtcHRpb24gZmllbGQgZ2l2ZW4gdGhlIHZhbHVlIGluIG1BLg0KICogXHBhcmFtIHBvd2VyIFRoZSBwb3dlciBjb25zdW1wdGlvbiB2YWx1ZSBpbiBtQQ0KICogXHJldHVybiBUaGUgdmFsdWUgdGhhdCBzaG91bGQgYmUgc2V0IHRvIHRoZSBmaWVsZCBpbiBkZXNjcmlwdG9yDQogKi8NCiNkZWZpbmUgVVNCQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JfUE9XRVIocG93ZXIpICAgICAocG93ZXIgLyAyKQ0KLyoqICAgICBAfSovDQoNCg0KLyotLS0tLS0tLS0gRW5kcG9pbnQgRGVzY3JpcHRvcnMgLS0tLS0tLS0qLw0KDQovKiogXGFkZHRvZ3JvdXAgdXNiX2VwX2RlZmluZSBVU0IgRW5kcG9pbnQgZGVmaW5pdGlvbnMNCiAqICAgICAgQHsNCiAqIFRoaXMgc2VjdGlvbiBsaXN0cyBkZWZpbml0aW9ucyBhbmQgbWFjcm8gZm9yIGVuZHBvaW50IGRlc2NyaXB0b3JzLg0KICogLSBccmVmIHVzYl9lcF9kaXIgVVNCIEVuZHBvaW50IGRpcmVjdGlvbnMNCiAqICAgIC0gXHJlZiBVU0JFbmRwb2ludERlc2NyaXB0b3JfT1VUDQogKiAgICAtIFxyZWYgVVNCRW5kcG9pbnREZXNjcmlwdG9yX0lODQogKg0KICogLSBccmVmIHVzYl9lcF90eXBlIFVTQiBFbmRwb2ludCB0eXBlcw0KICogICAgLSBccmVmIFVTQkVuZHBvaW50RGVzY3JpcHRvcl9DT05UUk9MDQogKiAgICAtIFxyZWYgVVNCRW5kcG9pbnREZXNjcmlwdG9yX0lTT0NIUk9OT1VTDQogKiAgICAtIFxyZWYgVVNCRW5kcG9pbnREZXNjcmlwdG9yX0JVTEsNCiAqICAgIC0gXHJlZiBVU0JFbmRwb2ludERlc2NyaXB0b3JfSU5URVJSVVBUDQogKg0KICogIC0gXHJlZiB1c2JfZXBfc2l6ZSBVU0IgRW5kcG9pbnQgbWF4aW11biBzaXplcw0KICogICAgIC0gXHJlZiBVU0JFbmRwb2ludERlc2NyaXB0b3JfTUFYQ1RSTFNJWkVfRlMNCiAqICAgICAtIFxyZWYgVVNCRW5kcG9pbnREZXNjcmlwdG9yX01BWENUUkxTSVpFX0hTDQogKiAgICAgLSBccmVmIFVTQkVuZHBvaW50RGVzY3JpcHRvcl9NQVhCVUxLU0laRV9GUw0KICogICAgIC0gXHJlZiBVU0JFbmRwb2ludERlc2NyaXB0b3JfTUFYQlVMS1NJWkVfSFMNCiAqICAgICAtIFxyZWYgVVNCRW5kcG9pbnREZXNjcmlwdG9yX01BWElOVEVSUlVQVFNJWkVfRlMNCiAqICAgICAtIFxyZWYgVVNCRW5kcG9pbnREZXNjcmlwdG9yX01BWElOVEVSUlVQVFNJWkVfSFMNCiAqICAgICAtIFxyZWYgVVNCRW5kcG9pbnREZXNjcmlwdG9yX01BWElTT0NIUk9OT1VTU0laRV9GUw0KICogICAgIC0gXHJlZiBVU0JFbmRwb2ludERlc2NyaXB0b3JfTUFYSVNPQ0hST05PVVNTSVpFX0hTDQogKg0KICogIC0gXHJlZiB1c2JfZXBfYWRkciBVU0IgRW5kcG9pbnQgYWRkcmVzcyBkZWZpbmUNCiAqICAgICAtIFxyZWYgVVNCRW5kcG9pbnREZXNjcmlwdG9yX0FERFJFU1MNCiAqLw0KDQovKiogXGFkZHRvZ3JvdXAgdXNiX2VwX2RpciBVU0IgRW5kcG9pbnQgZGlyZWN0aW9ucw0KICogICAgICAgICAgQHsNCiAqICBUaGlzIHNlY3Rpb24gbGlzdHMgZGVmaW5pdGlvbnMgb2YgVVNCIGVuZHBvaW50IGRpcmVjdGlvbnMuDQogKiAgLSBVU0JFbmRwb2ludERlc2NyaXB0b3JfT1VUDQogKiAgLSBVU0JFbmRwb2ludERlc2NyaXB0b3JfSU4NCiAqLw0KLyoqICBFbmRwb2ludCByZWNlaXZlcyBkYXRhIGZyb20gdGhlIGhvc3QuICovDQojZGVmaW5lIFVTQkVuZHBvaW50RGVzY3JpcHRvcl9PVVQgICAgICAgICAgIDANCi8qKiAgRW5kcG9pbnQgc2VuZHMgZGF0YSB0byB0aGUgaG9zdC4gKi8NCiNkZWZpbmUgVVNCRW5kcG9pbnREZXNjcmlwdG9yX0lOICAgICAgICAgICAgMQ0KLyoqICAgICAgICAgQH0qLw0KDQovKiogXGFkZHRvZ3JvdXAgdXNiX2VwX3R5cGUgVVNCIEVuZHBvaW50IHR5cGVzDQogKiAgICAgICAgICBAew0KICogIFRoaXMgc2VjdGlvbiBsaXN0cyBkZWZpbml0aW9ucyBvZiBVU0IgZW5kcG9pbnQgdHlwZXMuDQogKiAgLSBccmVmIFVTQkVuZHBvaW50RGVzY3JpcHRvcl9DT05UUk9MDQogKiAgLSBccmVmIFVTQkVuZHBvaW50RGVzY3JpcHRvcl9JU09DSFJPTk9VUw0KICogIC0gXHJlZiBVU0JFbmRwb2ludERlc2NyaXB0b3JfQlVMSw0KICogIC0gXHJlZiBVU0JFbmRwb2ludERlc2NyaXB0b3JfSU5URVJSVVBUDQogKi8NCi8qKiAgQ29udHJvbCBlbmRwb2ludCB0eXBlLiAqLw0KI2RlZmluZSBVU0JFbmRwb2ludERlc2NyaXB0b3JfQ09OVFJPTCAgICAgICAwDQovKiogIElzb2Nocm9ub3VzIGVuZHBvaW50IHR5cGUuICovDQojZGVmaW5lIFVTQkVuZHBvaW50RGVzY3JpcHRvcl9JU09DSFJPTk9VUyAgIDENCi8qKiAgQnVsayBlbmRwb2ludCB0eXBlLiAqLw0KI2RlZmluZSBVU0JFbmRwb2ludERlc2NyaXB0b3JfQlVMSyAgICAgICAgICAyDQovKiogIEludGVycnVwdCBlbmRwb2ludCB0eXBlLiAqLw0KI2RlZmluZSBVU0JFbmRwb2ludERlc2NyaXB0b3JfSU5URVJSVVBUICAgICAzDQovKiogICAgICAgICBAfSovDQoNCi8qKiBcYWRkdG9ncm91cCB1c2JfZXBfc2l6ZSBVU0IgRW5kcG9pbnQgbWF4aW11biBzaXplcw0KICogICAgICAgICAgQHsNCiAqICBUaGlzIHNlY3Rpb24gbGlzdHMgZGVmaW5pdGlvbnMgb2YgVVNCIGVuZHBvaW50IG1heGltdW4gc2l6ZXMuDQogKiAgLSBccmVmIFVTQkVuZHBvaW50RGVzY3JpcHRvcl9NQVhDVFJMU0laRV9GUw0KICogIC0gXHJlZiBVU0JFbmRwb2ludERlc2NyaXB0b3JfTUFYQ1RSTFNJWkVfSFMNCiAqICAtIFxyZWYgVVNCRW5kcG9pbnREZXNjcmlwdG9yX01BWEJVTEtTSVpFX0ZTDQogKiAgLSBccmVmIFVTQkVuZHBvaW50RGVzY3JpcHRvcl9NQVhCVUxLU0laRV9IUw0KICogIC0gXHJlZiBVU0JFbmRwb2ludERlc2NyaXB0b3JfTUFYSU5URVJSVVBUU0laRV9GUw0KICogIC0gXHJlZiBVU0JFbmRwb2ludERlc2NyaXB0b3JfTUFYSU5URVJSVVBUU0laRV9IUw0KICogIC0gXHJlZiBVU0JFbmRwb2ludERlc2NyaXB0b3JfTUFYSVNPQ0hST05PVVNTSVpFX0ZTDQogKiAgLSBccmVmIFVTQkVuZHBvaW50RGVzY3JpcHRvcl9NQVhJU09DSFJPTk9VU1NJWkVfSFMNCiAqLw0KLyoqICBNYXhpbXVtIHNpemUgZm9yIGEgZnVsbC1zcGVlZCBjb250cm9sIGVuZHBvaW50LiAqLw0KI2RlZmluZSBVU0JFbmRwb2ludERlc2NyaXB0b3JfTUFYQ1RSTFNJWkVfRlMgICAgICAgICAgICAgICAgNjQNCi8qKiAgTWF4aW11bSBzaXplIGZvciBhIGhpZ2gtc3BlZWQgY29udHJvbCBlbmRwb2ludC4gKi8NCiNkZWZpbmUgVVNCRW5kcG9pbnREZXNjcmlwdG9yX01BWENUUkxTSVpFX0hTICAgICAgICAgICAgICAgIDY0DQovKiogIE1heGltdW0gc2l6ZSBmb3IgYSBmdWxsLXNwZWVkIGJ1bGsgZW5kcG9pbnQuICovDQojZGVmaW5lIFVTQkVuZHBvaW50RGVzY3JpcHRvcl9NQVhCVUxLU0laRV9GUyAgICAgICAgICAgICAgICA2NA0KLyoqICBNYXhpbXVtIHNpemUgZm9yIGEgaGlnaC1zcGVlZCBidWxrIGVuZHBvaW50LiAqLw0KI2RlZmluZSBVU0JFbmRwb2ludERlc2NyaXB0b3JfTUFYQlVMS1NJWkVfSFMgICAgICAgICAgICAgICAgNTEyDQovKiogIE1heGltdW0gc2l6ZSBmb3IgYSBmdWxsLXNwZWVkIGludGVycnVwdCBlbmRwb2ludC4gKi8NCiNkZWZpbmUgVVNCRW5kcG9pbnREZXNjcmlwdG9yX01BWElOVEVSUlVQVFNJWkVfRlMgICAgICAgICAgIDY0DQovKiogIE1heGltdW0gc2l6ZSBmb3IgYSBoaWdoLXNwZWVkIGludGVycnVwdCBlbmRwb2ludC4gKi8NCiNkZWZpbmUgVVNCRW5kcG9pbnREZXNjcmlwdG9yX01BWElOVEVSUlVQVFNJWkVfSFMgICAgICAgICAgIDEwMjQNCi8qKiAgTWF4aW11bSBzaXplIGZvciBhIGZ1bGwtc3BlZWQgaXNvY2hyb25vdXMgZW5kcG9pbnQuICovDQojZGVmaW5lIFVTQkVuZHBvaW50RGVzY3JpcHRvcl9NQVhJU09DSFJPTk9VU1NJWkVfRlMgICAgICAgICAxMDIzDQovKiogIE1heGltdW0gc2l6ZSBmb3IgYSBoaWdoLXNwZWVkIGlzb2Nocm9ub3VzIGVuZHBvaW50LiAqLw0KI2RlZmluZSBVU0JFbmRwb2ludERlc2NyaXB0b3JfTUFYSVNPQ0hST05PVVNTSVpFX0hTICAgICAgICAgMTAyNA0KLyoqICAgICAgICAgQH0qLw0KDQovKiogXGFkZHRvZ3JvdXAgdXNiX2VwX2FkZHIgVVNCIEVuZHBvaW50IGFkZHJlc3MgZGVmaW5lDQogKiAgICAgICAgICBAew0KICogIFRoaXMgc2VjdGlvbiBsaXN0cyBtYWNybyBmb3IgVVNCIGVuZHBvaW50IGFkZHJlc3MgZGVmaW5pdGlvbi4NCiAqICAtIFxyZWYgVVNCRW5kcG9pbnREZXNjcmlwdG9yX0FERFJFU1MNCiAqLw0KLyoqDQogKiAgQ2FsY3VsYXRlcyB0aGUgYWRkcmVzcyBvZiBhbiBlbmRwb2ludCBnaXZlbiBpdHMgbnVtYmVyIGFuZCBkaXJlY3Rpb24NCiAqICBccGFyYW0gZGlyZWN0aW9uIFVTQiBlbmRwb2ludCBkaXJlY3Rpb24gZGVmaW5pdGlvbg0KICogIFxwYXJhbSBudW1iZXIgVVNCIGVuZHBvaW50IG51bWJlcg0KICogIFxyZXR1cm4gVGhlIHZhbHVlIHVzZWQgdG8gc2V0IHRoZSBlbmRwb2ludCBkZXNjcmlwdG9yIGJhc2VkIG9uIGlucHV0IG51bWJlcg0KICogICAgICAgICAgYW5kIGRpcmVjdGlvbg0KICovDQojZGVmaW5lIFVTQkVuZHBvaW50RGVzY3JpcHRvcl9BRERSRVNTKGRpcmVjdGlvbiwgbnVtYmVyKSBcDQogICAgKCgoZGlyZWN0aW9uICYgMHgwMSkgPDwgNykgfCAobnVtYmVyICYgMHhGKSkNCi8qKiAgICAgICAgIEB9Ki8NCi8qKiAgICAgQH0qLw0KDQoNCi8qLS0tLS0tLS0tIEdlbmVyaWMgRGVzY3JpcHRvcnMgLS0tLS0tLS0qLw0KDQovKiogXGFkZHRvZ3JvdXAgdXNiX3N0cmluZ19kZXNjcmlwdG9yIFVTQiBTdHJpbmcgRGVzY3JpcHRvciBEZWZpbml0aW9ucw0KICogICAgICBAew0KICogIFRoaXMgc2VjdGlvbiBsaXN0cyB0aGUgY29kZXMgYW5kIG1hY3JvcyBmb3IgVVNCIHN0cmluZyBkZXNjcmlwdG9yIGRlZmluaXRpb24uDQogKg0KICogIFxwYXIgTGFuZ3VhZ2UgSURzDQogKiAgLSBVU0JTdHJpbmdEZXNjcmlwdG9yX0VOR0xJU0hfVVMNCiAqDQogKiAgXHBhciBTdHJpbmcgRGVzY3JpcHRvciBMZW5ndGgNCiAqICAtIFVTQlN0cmluZ0Rlc2NyaXB0b3JfTEVOR1RIDQogKg0KICogIFxwYXIgQVNDSUkgdG8gVU5JQ09ERSBjb252ZXJ0aW9uDQogKiAgLSBVU0JTdHJpbmdEZXNjcmlwdG9yX1VOSUNPREUNCiAqLw0KLyoqIExhbmd1YWdlIElEIGZvciBVUyBlbmdsaXNoLiAqLw0KI2RlZmluZSBVU0JTdHJpbmdEZXNjcmlwdG9yX0VOR0xJU0hfVVMgICAgICAgICAgMHgwOSwgMHgwNA0KLyoqDQogKiAgQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgc3RyaW5nIGRlc2NyaXB0b3IgZ2l2ZW4gdGhlIG51bWJlciBvZiBhc2NpaQ0KICogIGNoYXJhY3RlcnMvbGFuZ3VhZ2UgSURzIGluIGl0Lg0KICogIFxwYXJhbSBsZW5ndGggVGhlIGFzY2lpIGZvcm1hdCBzdHJpbmcgbGVuZ3RoLg0KICogIFxyZXR1cm4gVGhlIGFjdHVhbCBkYXRhIGxlbmd0aCBpbiBieXRlcy4NCiAqLw0KI2RlZmluZSBVU0JTdHJpbmdEZXNjcmlwdG9yX0xFTkdUSChsZW5ndGgpICAgICAgKChsZW5ndGgpICogMiArIDIpDQovKioNCiAqICBDb252ZXJ0cyBhbiBhc2NpaSBjaGFyYWN0ZXIgdG8gaXRzIHVuaWNvZGUgcmVwcmVzZW50YXRpb24uDQogKiAgXHBhcmFtIGFzY2lpIFRoZSBBU0NJSSBjaGFyYWN0ZXIgdG8gY29udmVydA0KICogIFxyZXR1cm4gQSAyLWJ5dGUtYXJyYXkgZm9yIHRoZSBVTklDT0RFIGJhc2VkIG9uIGdpdmVuIEFTQ0lJDQogKi8NCiNkZWZpbmUgVVNCU3RyaW5nRGVzY3JpcHRvcl9VTklDT0RFKGFzY2lpKSAgICAgIChhc2NpaSksIDANCi8qKiAgICAgQH0qLw0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgIFR5cGVzDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qDQogKiAgICAgICAgICBGdW5jdGlvbiB0eXBlcw0KICovDQoNCnR5cGVkZWYgdWludDMyX3QgKCpVU0JEZXNjcmlwdG9yUGFyc2VGdW5jdGlvbikodm9pZCAqZGVzY3JpcHRvciwgdm9pZCAqcGFyc2VBcmcpOw0KDQoNCi8qDQogKiAgICAgICAgICBEZXNjcmlwdG9yIHN0cnVjdHMgdHlwZXMNCiAqLw0KI3ByYWdtYSBwYWNrKDEpDQojaWYgZGVmaW5lZCAgICggX19DQ19BUk0gICApIC8qIEtlaWwgpsxWaXNpb24gNCAqLw0KI2VsaWYgZGVmaW5lZCAoIF9fSUNDQVJNX18gKSAvKiBJQVIgRXdhcm0gKi8NCiNkZWZpbmUgX19hdHRyaWJ1dGVfXyguLi4pDQojZGVmaW5lIF9fcGFja2VkX18gIHBhY2tlZA0KI2VsaWYgZGVmaW5lZCAoICBfX0dOVUNfXyAgKSAvKiBHQ0MgQ1MzICovDQojZGVmaW5lIF9fcGFja2VkX18gIGFsaWduZWQoMSkNCiNlbmRpZg0KLyoqDQogXHR5cGVkZWYgVVNCR2VuZXJpY0Rlc2NyaXB0b3INCiBcYnJpZWYgSG9sZHMgdGhlIGZldyBmaWVsZHMgc2hhcmVkIGJ5IGFsbCBVU0IgZGVzY3JpcHRvcnMuDQogKi8NCnR5cGVkZWYgc3RydWN0IF9VU0JHZW5lcmljRGVzY3JpcHRvciB7DQoNCiAgICAvKiogIExlbmd0aCBvZiB0aGUgZGVzY3JpcHRvciBpbiBieXRlcy4gKi8NCiAgICB1aW50OF90IGJMZW5ndGg7DQogICAgLyoqICBEZXNjcmlwdG9yIHR5cGUuICovDQogICAgdWludDhfdCBiRGVzY3JpcHRvclR5cGU7DQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBVU0JHZW5lcmljRGVzY3JpcHRvcjsgLyogR0NDICovDQoNCi8qKg0KICogXHR5cGVkZWYgVVNCRGV2aWNlRGVzY3JpcHRvcg0KICogXGJyaWVmIFVTQiBzdGFuZGFyZCBkZXZpY2UgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuDQogKi8NCnR5cGVkZWYgc3RydWN0IF9VU0JEZXZpY2VEZXNjcmlwdG9yIHsNCg0KICAgLyoqICBTaXplIG9mIHRoaXMgZGVzY3JpcHRvciBpbiBieXRlcy4gKi8NCiAgIHVpbnQ4X3QgYkxlbmd0aDsNCiAgIC8qKiAgRGVzY3JpcHRvciB0eXBlIChVU0JHZW5lcmljRGVzY3JpcHRvcl9ERVZJQ0UpLiAqLw0KICAgdWludDhfdCBiRGVzY3JpcHRvclR5cGU7DQogICAvKiogIFVTQiBzcGVjaWZpY2F0aW9uIHJlbGVhc2UgbnVtYmVyIGluIEJDRCBmb3JtYXQuICovDQogICB1aW50MTZfdCBiY2RVU0I7DQogICAvKiogIERldmljZSBjbGFzcyBjb2RlLiAqLw0KICAgdWludDhfdCBiRGV2aWNlQ2xhc3M7DQogICAvKiogRGV2aWNlIHN1YmNsYXNzIGNvZGUuICovDQogICB1aW50OF90IGJEZXZpY2VTdWJDbGFzczsNCiAgIC8qKiBEZXZpY2UgcHJvdG9jb2wgY29kZS4gKi8NCiAgIHVpbnQ4X3QgYkRldmljZVByb3RvY29sOw0KICAgLyoqICBNYXhpbXVtIHBhY2tldCBzaXplIG9mIGVuZHBvaW50IDAgKGluIGJ5dGVzKS4gKi8NCiAgIHVpbnQ4X3QgYk1heFBhY2tldFNpemUwOw0KICAgLyoqIFZlbmRvciBJRC4gKi8NCiAgIHVpbnQxNl90IGlkVmVuZG9yOw0KICAgLyoqIFByb2R1Y3QgSUQuICovDQogICB1aW50MTZfdCBpZFByb2R1Y3Q7DQogICAvKiogRGV2aWNlIHJlbGVhc2UgbnVtYmVyIGluIEJDRCBmb3JtYXQuICovDQogICB1aW50MTZfdCBiY2REZXZpY2U7DQogICAvKiogSW5kZXggb2YgdGhlIG1hbnVmYWN0dXJlciBzdHJpbmcgZGVzY3JpcHRvci4gKi8NCiAgIHVpbnQ4X3QgaU1hbnVmYWN0dXJlcjsNCiAgIC8qKiBJbmRleCBvZiB0aGUgcHJvZHVjdCBzdHJpbmcgZGVzY3JpcHRvci4gKi8NCiAgIHVpbnQ4X3QgaVByb2R1Y3Q7DQogICAvKiogSW5kZXggb2YgdGhlIHNlcmlhbCBudW1iZXIgc3RyaW5nIGRlc2NyaXB0b3IuICovDQogICB1aW50OF90IGlTZXJpYWxOdW1iZXI7DQogICAvKiogTnVtYmVyIG9mIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgZGV2aWNlLiAqLw0KICAgdWludDhfdCBiTnVtQ29uZmlndXJhdGlvbnM7DQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBVU0JEZXZpY2VEZXNjcmlwdG9yOyAvKiBHQ0MgKi8NCg0KLyoqDQogKiBcdHlwZWRlZiBVU0JPdGdEZXNjcmlwdG9yDQogKiBcYnJpZWYgVVNCIE9uLVRoZS1HbyBkZXNjcmlwdG9yIHN0cnVjdC4NCiAqLw0KdHlwZWRlZiBzdHJ1Y3QgX1VTQk90Z0Rlc2NyaXB0b3Igew0KDQogICAvKiogU2l6ZSBvZiB0aGlzIGRlc2NyaXB0b3IgaW4gYnl0ZXMuICovDQogICB1aW50OF90IGJMZW5ndGg7DQogICAvKiogRGVzY3JpcHRvciB0eXBlIChVU0JHZW5lcmljRGVzY3JpcHRvcl9PVEcpLiAqLw0KICAgdWludDhfdCBiRGVzY3JpcHRvclR5cGU7DQogICAvKiogQXR0cmlidXRlIEZpZWxkcyBENz86IFJlc2VydmVkIEQxOiBITlAgc3VwcG9ydCBEMDogU1JQIHN1cHBvcnQgKi8NCiAgIHVpbnQ4X3QgYm1BdHRyaWJ1dGVzOw0KDQp9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgVVNCT3RnRGVzY3JpcHRvcjsgLyogR0NDICovDQoNCi8qKg0KICogXHR5cGVkZWYgVVNCRGV2aWNlUXVhbGlmaWVyRGVzY3JpcHRvcg0KICogXGJyaWVmIEFsdGVybmF0ZSBkZXZpY2UgZGVzY3JpcHRvciBpbmRpY2F0aW5nIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGRldmljZQ0KICogICAgICAgIGluIGZ1bGwtc3BlZWQsIGlmIGN1cnJlbnRseSBpbiBoaWdoLXNwZWVkOyBvciBpbiBoaWdoLXNwZWVkLCBpZiBpdCBpcw0KICogICAgICAgIGN1cnJlbnRseSBpbiBmdWxsLXNwZWVkLiBPbmx5IHJlbGV2YW50IGZvciBkZXZpY2VzIHN1cHBvcnRpbmcgdGhlDQogKiAgICAgICAgaGlnaC1zcGVlZCBtb2RlLg0KICovDQp0eXBlZGVmIHN0cnVjdCBfVVNCRGV2aWNlUXVhbGlmaWVyRGVzY3JpcHRvciB7DQoNCiAgIC8qKiBTaXplIG9mIHRoZSBkZXNjcmlwdG9yIGluIGJ5dGVzLiAqLw0KICAgdWludDhfdCBiTGVuZ3RoOw0KICAgLyoqIERlc2NyaXB0b3IgdHlwZSAoVVNCREVTQ19ERVZJQ0VfUVVBTElGSUVSIG9yICJVU0IgZGV2aWNlIHR5cGVzIikuICovDQogICB1aW50OF90IGJEZXNjcmlwdG9yVHlwZTsNCiAgIC8qKiBVU0Igc3BlY2lmaWNhdGlvbiByZWxlYXNlIG51bWJlciAoaW4gQkNEIGZvcm1hdCkuICovDQogICB1aW50MTZfdCBiY2RVU0I7DQogICAvKiogRGV2aWNlIGNsYXNzIGNvZGUuICovDQogICB1aW50OF90IGJEZXZpY2VDbGFzczsNCiAgIC8qKiBEZXZpY2Ugc3ViY2xhc3MgY29kZS4gKi8NCiAgIHVpbnQ4X3QgYkRldmljZVN1YkNsYXNzOw0KICAgLyoqIERldmljZSBwcm90b2NvbCBjb2RlLiAqLw0KICAgdWludDhfdCBiRGV2aWNlUHJvdG9jb2w7DQogICAvKiogTWF4aW11bSBwYWNrZXQgc2l6ZSBvZiBlbmRwb2ludCAwLiAqLw0KICAgdWludDhfdCBiTWF4UGFja2V0U2l6ZTA7DQogICAvKiogTnVtYmVyIG9mIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgZGV2aWNlLiAqLw0KICAgdWludDhfdCBiTnVtQ29uZmlndXJhdGlvbnM7DQogICAvKiogUmVzZXJ2ZWQuICovDQogICB1aW50OF90IGJSZXNlcnZlZDsNCg0KfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFVTQkRldmljZVF1YWxpZmllckRlc2NyaXB0b3I7IC8qIEdDQyAqLw0KDQovKioNCiAqIFx0eXBlZGVmIFVTQkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yDQogKiBcYnJpZWYgVVNCIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciBzdHJ1Y3R1cmUuDQogKi8NCnR5cGVkZWYgc3RydWN0IF9VU0JDb25maWd1cmF0aW9uRGVzY3JpcHRvciB7DQoNCiAgIC8qKiBTaXplIG9mIHRoZSBkZXNjcmlwdG9yIGluIGJ5dGVzLiAqLw0KICAgdWludDhfdCBiTGVuZ3RoOw0KICAgLyoqIERlc2NyaXB0b3IgdHlwZQ0KICAgICAgIChVU0JERVNDX0NPTkZJR1VSQVRJT04gb2YgXHJlZiB1c2JfZGVzY190eXBlIFVTQiBEZXNjcmlwdG9yIHR5cGVzKS4gKi8NCiAgIHVpbnQ4X3QgYkRlc2NyaXB0b3JUeXBlOw0KICAgLyoqIExlbmd0aCBvZiBhbGwgZGVzY3JpcHRvcnMgcmV0dXJuZWQgYWxvbmcgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24NCiAgICAgICBkZXNjcmlwdG9yLiAqLw0KICAgdWludDE2X3Qgd1RvdGFsTGVuZ3RoOw0KICAgLyoqIE51bWJlciBvZiBpbnRlcmZhY2VzIGluIHRoaXMgY29uZmlndXJhdGlvbi4gKi8NCiAgIHVpbnQ4X3QgYk51bUludGVyZmFjZXM7DQogICAvKiogVmFsdWUgZm9yIHNlbGVjdGluZyB0aGlzIGNvbmZpZ3VyYXRpb24uICovDQogICB1aW50OF90IGJDb25maWd1cmF0aW9uVmFsdWU7DQogICAvKiogSW5kZXggb2YgdGhlIGNvbmZpZ3VyYXRpb24gc3RyaW5nIGRlc2NyaXB0b3IuICovDQogICB1aW50OF90IGlDb25maWd1cmF0aW9uOw0KICAgLyoqIENvbmZpZ3VyYXRpb24gY2hhcmFjdGVyaXN0aWNzLiAqLw0KICAgdWludDhfdCBibUF0dHJpYnV0ZXM7DQogICAvKiogTWF4aW11bSBwb3dlciBjb25zdW1wdGlvbiBvZiB0aGUgZGV2aWNlIHdoZW4gaW4gdGhpcyBjb25maWd1cmF0aW9uLiAqLw0KICAgdWludDhfdCBiTWF4UG93ZXI7DQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBVU0JDb25maWd1cmF0aW9uRGVzY3JpcHRvcjsgLyogR0NDKi8NCg0KLyoqDQogKiBcdHlwZWRlZiBVU0JJbnRlcmZhY2VBc3NvY2lhdGlvbkRlc2NyaXB0b3INCiAqIFxicmllZg0KICovDQp0eXBlZGVmIHN0cnVjdCBfVVNCSW50ZXJmYWNlQXNzb2NpYXRpb25EZXNjcmlwdG9yIHsNCg0KICAgdW5zaWduZWQgY2hhciBiTGVuZ3RoOw0KICAgdW5zaWduZWQgY2hhciBiRGVzY3JpcHRvclR5cGU7DQogICB1bnNpZ25lZCBjaGFyIGJGaXJzdEludGVyZmFjZTsNCiAgIHVuc2lnbmVkIGNoYXIgYkludGVyZmFjZUNvdW50Ow0KICAgdW5zaWduZWQgY2hhciBiRnVuY3Rpb25DbGFzczsNCiAgIHVuc2lnbmVkIGNoYXIgYkZ1bmN0aW9uU3ViQ2xhc3M7DQogICB1bnNpZ25lZCBjaGFyIGJGdW5jdGlvblByb3RvY29sOw0KICAgdW5zaWduZWQgY2hhciBpRnVuY3Rpb247DQp9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgVVNCSW50ZXJmYWNlQXNzb2NpYXRpb25EZXNjcmlwdG9yOyAvKiBHQ0MqLw0KDQovKioNCiAqIFx0eXBlZGVmIFVTQkludGVyZmFjZURlc2NyaXB0b3INCiAqIFxicmllZiBVU0Igc3RhbmRhcmQgaW50ZXJmYWNlIGRlc2NyaXB0b3Igc3RydWN0dXJlLg0KICovDQp0eXBlZGVmIHN0cnVjdCBfVVNCSW50ZXJmYWNlRGVzY3JpcHRvciB7DQoNCiAgIC8qKiBTaXplIG9mIHRoZSBkZXNjcmlwdG9yIGluIGJ5dGVzLiAqLw0KICAgdWludDhfdCBiTGVuZ3RoOw0KICAgLyoqIERlc2NyaXB0b3IgdHlwZSAoVVNCR2VuZXJpY0Rlc2NyaXB0b3JfSU5URVJGQUNFKS4gKi8NCiAgIHVpbnQ4X3QgYkRlc2NyaXB0b3JUeXBlOw0KICAgLyoqIE51bWJlciBvZiB0aGUgaW50ZXJmYWNlIGluIGl0cyBjb25maWd1cmF0aW9uLiAqLw0KICAgdWludDhfdCBiSW50ZXJmYWNlTnVtYmVyOw0KICAgLyoqIFZhbHVlIHRvIHNlbGVjdCB0aGlzIGFsdGVybmF0ZSBpbnRlcmZhY2Ugc2V0dGluZy4gKi8NCiAgIHVpbnQ4X3QgYkFsdGVybmF0ZVNldHRpbmc7DQogICAvKiogTnVtYmVyIG9mIGVuZHBvaW50cyB1c2VkIGJ5IHRoZSBpbnRlZmFjZSAoZXhjbHVkaW5nIGVuZHBvaW50IDApLiAqLw0KICAgdWludDhfdCBiTnVtRW5kcG9pbnRzOw0KICAgLyoqIEludGVyZmFjZSBjbGFzcyBjb2RlLiAqLw0KICAgdWludDhfdCBiSW50ZXJmYWNlQ2xhc3M7DQogICAvKiogSW50ZXJmYWNlIHN1YmNsYXNzIGNvZGUuICovDQogICB1aW50OF90IGJJbnRlcmZhY2VTdWJDbGFzczsNCiAgIC8qKiBJbnRlcmZhY2UgcHJvdG9jb2wgY29kZS4gKi8NCiAgIHVpbnQ4X3QgYkludGVyZmFjZVByb3RvY29sOw0KICAgLyoqIEluZGV4IG9mIHRoZSBpbnRlcmZhY2Ugc3RyaW5nIGRlc2NyaXB0b3IuICovDQogICB1aW50OF90IGlJbnRlcmZhY2U7DQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBVU0JJbnRlcmZhY2VEZXNjcmlwdG9yOyAvKiBHQ0MgKi8NCg0KLyoqDQogKiBcdHlwZWRlZiBVU0JFbmRwb2ludERlc2NyaXB0b3INCiAqIFxicmllZiBVU0Igc3RhbmRhcmQgZW5kcG9pbnQgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuDQogKi8NCnR5cGVkZWYgc3RydWN0IF9VU0JFbmRwb2ludERlc2NyaXB0b3Igew0KDQogICAvKiogIFNpemUgb2YgdGhlIGRlc2NyaXB0b3IgaW4gYnl0ZXMuICovDQogICB1aW50OF90IGJMZW5ndGg7DQogICAvKiogIERlc2NyaXB0b3IgdHlwZSAoXHJlZiBVU0JHZW5lcmljRGVzY3JpcHRvcl9FTkRQT0lOVCkuICovDQogICB1aW50OF90IGJEZXNjcmlwdG9yVHlwZTsNCiAgIC8qKiAgQWRkcmVzcyBhbmQgZGlyZWN0aW9uIG9mIHRoZSBlbmRwb2ludC4gKi8NCiAgIHVpbnQ4X3QgYkVuZHBvaW50QWRkcmVzczsNCiAgIC8qKiAgRW5kcG9pbnQgdHlwZSBhbmQgYWRkaXRpb25hbCBjaGFyYWN0ZXJpc3RpY3MNCiAgICAgICAgKGZvciBpc29jaHJvbm91cyBlbmRwb2ludHMpLiAqLw0KICAgdWludDhfdCBibUF0dHJpYnV0ZXM7DQogICAvKiogIE1heGltdW0gcGFja2V0IHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgZW5kcG9pbnQuICovDQogICB1aW50MTZfdCB3TWF4UGFja2V0U2l6ZTsNCiAgIC8qKiAgUG9sbGluZyByYXRlIG9mIHRoZSBlbmRwb2ludC4gKi8NCiAgIHVpbnQ4X3QgYkludGVydmFsOw0KDQp9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgVVNCRW5kcG9pbnREZXNjcmlwdG9yOyAvKiBHQ0MqLw0KDQoNCiNwcmFnbWEgcGFjaygpDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgIEV4cG9ydGVkIEZ1bmN0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpleHRlcm4gdWludDMyX3QgVVNCR2VuZXJpY0Rlc2NyaXB0b3JfR2V0TGVuZ3RoKA0KICAgIGNvbnN0IFVTQkdlbmVyaWNEZXNjcmlwdG9yICpkZXNjcmlwdG9yKTsNCg0KZXh0ZXJuIHVpbnQ4X3QgVVNCR2VuZXJpY0Rlc2NyaXB0b3JfR2V0VHlwZSgNCiAgICBjb25zdCBVU0JHZW5lcmljRGVzY3JpcHRvciAqZGVzY3JpcHRvcik7DQoNCmV4dGVybiBVU0JHZW5lcmljRGVzY3JpcHRvciAqVVNCR2VuZXJpY0Rlc2NyaXB0b3JfR2V0TmV4dERlc2NyaXB0b3IoDQogICAgY29uc3QgVVNCR2VuZXJpY0Rlc2NyaXB0b3IgKmRlc2NyaXB0b3IpOw0KDQpleHRlcm4gVVNCR2VuZXJpY0Rlc2NyaXB0b3IgKlVTQkdlbmVyaWNEZXNjcmlwdG9yX1BhcnNlKA0KICAgIGNvbnN0IFVTQkdlbmVyaWNEZXNjcmlwdG9yICogZGVzY3JpcHRvciwNCiAgICB1aW50MzJfdCB0b3RhbExlbmd0aCwNCiAgICBVU0JEZXNjcmlwdG9yUGFyc2VGdW5jdGlvbiBwYXJzZUZ1bmN0aW9uLA0KICAgIHZvaWQgKiBwYXJzZUFyZyk7DQoNCg0KZXh0ZXJuIHVpbnQzMl90IFVTQkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yX0dldFRvdGFsTGVuZ3RoKA0KICAgIGNvbnN0IFVTQkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yICpjb25maWd1cmF0aW9uKTsNCg0KZXh0ZXJuIHVpbnQ4X3QgVVNCQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JfR2V0TnVtSW50ZXJmYWNlcygNCiAgICBjb25zdCBVU0JDb25maWd1cmF0aW9uRGVzY3JpcHRvciAqY29uZmlndXJhdGlvbik7DQoNCmV4dGVybiB1aW50OF90IFVTQkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yX0lzU2VsZlBvd2VyZWQoDQogICAgY29uc3QgVVNCQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgKmNvbmZpZ3VyYXRpb24pOw0KDQpleHRlcm4gdm9pZCBVU0JDb25maWd1cmF0aW9uRGVzY3JpcHRvcl9QYXJzZSgNCiAgICBjb25zdCBVU0JDb25maWd1cmF0aW9uRGVzY3JpcHRvciAqY29uZmlndXJhdGlvbiwNCiAgICBVU0JJbnRlcmZhY2VEZXNjcmlwdG9yICoqaW50ZXJmYWNlcywNCiAgICBVU0JFbmRwb2ludERlc2NyaXB0b3IgKiplbmRwb2ludHMsDQogICAgVVNCR2VuZXJpY0Rlc2NyaXB0b3IgKipvdGhlcnMpOw0KDQpleHRlcm4gdWludDhfdCBVU0JFbmRwb2ludERlc2NyaXB0b3JfR2V0TnVtYmVyKA0KICAgIGNvbnN0IFVTQkVuZHBvaW50RGVzY3JpcHRvciAqZW5kcG9pbnQpOw0KDQpleHRlcm4gdWludDhfdCBVU0JFbmRwb2ludERlc2NyaXB0b3JfR2V0RGlyZWN0aW9uKA0KICAgIGNvbnN0IFVTQkVuZHBvaW50RGVzY3JpcHRvciAqZW5kcG9pbnQpOw0KDQpleHRlcm4gdWludDhfdCBVU0JFbmRwb2ludERlc2NyaXB0b3JfR2V0VHlwZSgNCiAgICBjb25zdCBVU0JFbmRwb2ludERlc2NyaXB0b3IgKmVuZHBvaW50KTsNCg0KZXh0ZXJuIHVpbnQxNl90IFVTQkVuZHBvaW50RGVzY3JpcHRvcl9HZXRNYXhQYWNrZXRTaXplKA0KICAgIGNvbnN0IFVTQkVuZHBvaW50RGVzY3JpcHRvciAqZW5kcG9pbnQpOw0KDQpleHRlcm4gdWludDhfdCBVU0JFbmRwb2ludERlc2NyaXB0b3JfR2V0SW50ZXJ2YWwoDQogICAgY29uc3QgVVNCRW5kcG9pbnREZXNjcmlwdG9yICplbmRwb2ludCk7DQoNCg0KLyoqIEB9Ki8NCi8qKkB9Ki8NCiNlbmRpZiAvKiAjaWZuZGVmIF9VU0JERVNDUklQVE9SU19IXyAqLw0KDQo=